หลังจากที่ติดตั้ง postfix และคอนฟิกเพิ่มเติม ตามบทความที่เคยนำเสนอไปแล้ว
แทนที่จะปล่อยให้อีเมล์ผ่านเข้าออกเมล์เซิร์ฟเวอร์โดยไม่มีการตรวจสอบความปลอดภัยของเนื้อหาอีเมล์ ในที่นี้จะขอแนะนำการติดตั้งและคอนฟิก Amavisd-new ซึี่งถือเป็นโปรแกรมตัวกลางเชื่อมต่อระหว่างเมล์เซิร์ฟเวอร์กับโปรแกรมตรวจสอบต่างๆ ในที่นี้จะใช้โปรแกรม ClamAv เพื่อตรวจสอบไวรัส และ SpamAssassin เพื่อดูเนื้อหาอีเมล์ที่ส่งว่ามีแนวโน้มจะเป็น spam หรือไม่
ติดตั้งโปรแกรม amavisd-new, ClamAv และ SpamAssassin
เนื่องจากการติดตั้งโปรแกรม amavisd-new จำเป็นต้องติดตั้งไฟล์ rpm อื่นๆ อีกเป็นจำนวนมาก ในที่นี้จะขอใช้ yum เพื่อช่วยติดตั้งโปรแกรม
[root@fc17-64a ~]# yum install amavisd-new
การติดตั้ง amavisd-new ด้วย yum นี้จะติดตั้งไฟล์ rpm ที่จำเป็นสำหรับ amavisd-new เช่นโมดูล perl รวมทั้งจะติดตั้งโปรแกรม ClamAv และ SpamAssassin มาให้ด้วยเพื่อใช้ตรวจสอบเนื้อหาในอีเมล์
ตัวอย่างชื่อไฟล์ rpm และเวอร์ชั่นที่ติดตั้งจาก yum ณ ตอนที่เขียนบทความนี้ (ศุกร์ 13)
[root@fc17-64a ~]# rpm -qa | grep amavisd amavisd-new-2.6.6-2.fc17.noarch
[root@fc17-64a ~]# rpm -qa | grep clamav clamav-lib-0.97.5-1700.fc17.x86_64 clamav-data-0.97.5-1700.fc17.noarch clamav-server-0.97.5-1700.fc17.x86_64 clamav-filesystem-0.97.5-1700.fc17.noarch
[root@fc17-64a ~]# rpm -qa | grep spamassassin spamassassin-3.3.2-9.fc17.x86_64
รันเซอร์วิส clamd.amavisd
โปรแกรม amavisd-new จะรับอีเมล์ที่ส่งมาจาก postfix เพื่อตรวจสอบ สำหรับการตรวจสอบไวรัส จะตรวจด้วย ClamAv
ชื่อเซอร์วิสของ ClamAv สำหรับติดต่อกับ amavisd-new คือ clamd.amavisd
ใช้คำสั่ง systemctl เพื่อรันเซอร์วิส
[root@fc17-64a ~]# systemctl start clamd.amavisd.service
Job failed. See system journal and 'systemctl status' for details.
รันไม่สำเร็จ ลองใช้คำสั่ง systemctl status ตามด้วยชื่อเซอร์วิส เพื่อดูสาเหตุที่รันไม่ได้
[root@fc17-64a ~]# systemctl status clamd.amavisd.service clamd.amavisd.service - SYSV: The clamd server running for amavisd Loaded: loaded (/etc/rc.d/init.d/clamd.amavisd) Active: failed (Result: exit-code) since Fri, 13 Jul 2012 21:57:48 +0700; 1min 25s ago Process: 1974 ExecStart=/etc/rc.d/init.d/clamd.amavisd start (code=exited, status=1/FAILURE) CGroup: name=systemd:/system/clamd.amavisd.service
Jul 13 21:57:48 fc17-64a.example.com clamd.amavisd[1974]: /etc/rc.d/init.d/clamd.amavisd: line 7:
/usr/share/clamav/clamd-wrapper: No such file or directory
สาเหตุคือ ไม่มีไฟล์ /usr/share/clamav/clamd-wrapper ลองหาข้อมูลจาก google ดู ก็พบว่าต้องติดตั้ง rpm เพิ่มเติม ชื่อ clamav-server-sysvinit
ขอ yum ต่อเลยละกัน
[root@fc17-64a ~]# yum install clamav-server-sysvinit
ลองรันเซอร์วิสใหม่อีกครั้ง
[root@fc17-64a ~]# systemctl start clamd.amavisd.service
ตัวอย่างการใช้ ps เพื่อดูโปรเซสของเซอร์วิส clamd ที่รัน
[root@fc17-64a ~]# ps -ef | grep clamd amavis 2021 1 0 22:14 ? 00:00:00 clamd.amavisd -c /etc/clamd.d/amavisd.conf --pid /var/run/clamd.amavisd/clamd.pid
รันเซอร์วิส amavisd
เซอร์วิสของ amavisd-new ชื่อ amavisd ใช้คำสั่ง systemctl เพื่อรันเซอร์วิส amavisd
[root@fc17-64a ~]# systemctl start amavisd.service Job failed. See system journal and 'systemctl status' for details.
รันไม่สำเร็จอีก ลองดูสาเหตุ
[root@fc17-64a ~]# systemctl status amavisd.service amavisd.service - SYSV: amavisd is an interface between MTA and content checkers Loaded: loaded (/etc/rc.d/init.d/amavisd) Active: failed (Result: resources) since Fri, 13 Jul 2012 22:23:26 +0700; 23s ago Process: 2395 ExecStart=/etc/rc.d/init.d/amavisd start (code=exited, status=0/SUCCESS) CGroup: name=systemd:/system/amavisd.service
Jul 13 22:23:26 fc17-64a.example.com amavis[2397]: starting. /usr/sbin/amavisd at fc17-64a.example.com amavisd-new-2.6.6 (20110518), Unicode aware, LANG="en_US.UTF-8"
Jul 13 22:23:26 fc17-64a.example.com amavis[2397]: Perl version 5.014002
Jul 13 22:23:26 fc17-64a amavis[2398]: (!)Net::Server: 2012/07/13-22:23:26 Couldn't open pid file "/var/run/amavisd/amavisd.pid" [No such file or directory].\n\n at line 318 in file /usr/share/perl5/vendor_perl/Net/Server.pm
เป็นเพราะไม่สามารถสร้างไฟล์ amavisd.pid ในไดเร็คทอรี /var/run/amavisd/
สร้างไดเร็คทอรีนี้ขึ้นมา และเปลี่ยน owner ให้ amavis เป็นเจ้าของ
[root@fc17-64a ~]# mkdir /var/run/amavisd [root@fc17-64a ~]# chown amavis /var/run/amavisd/
ลองสตาร์ตเซอร์วิสอีกครั้ง
[root@fc17-64a ~]# systemctl start amavisd.service
โปรเซสของ amavisd ที่รันขึ้นมา
[root@fc17-64a ~]# ps -ef | grep amavis amavis 2352 1 0 22:20 ? 00:00:00 clamd.amavisd -c /etc/clamd.d/amavisd.conf --pid /var/run/clamd.amavisd/clamd.pid amavis 2453 1 3 22:27 ? 00:00:00 amavisd (master) amavis 2455 2453 0 22:27 ? 00:00:00 amavisd (virgin child) amavis 2456 2453 0 22:27 ? 00:00:00 amavisd (virgin child)
แก้ไขไฟล์คอนฟิกของ postfix
เพื่อให้มีการตรวจสอบอีเมล์ก่อนส่งออกไป ต้องแก้ไขคอนฟิกของ postfix ให้ส่งอีเมล์มาตรวจสอบกับ amavisd ก่อน
ไฟล์คอนฟิกที่ต้องแก้ไขมีสองไฟล์คือ master.cf และ main.cf
แก้ไขไฟล์ master.cf โดยเพิ่มคอนฟิกเหล่านี้ลงไป ต่อท้ายด้านล่างของไฟล์
คอนฟิกส่วน smtp-amavis เป็นค่าคอนฟิกเพื่อส่งเมล์ไปยัง amavis ส่วน 127.0.0.1:10025 เป็นส่วนที่จะรับอีมเล์ที่ตรวจสอบแล้วกลับมาจาก amavisd
[root@fc17-64a ~]# vi /etc/postfix/master.cf ... # ========================================================================== # service type private unpriv chroot wakeup maxproc command + args # (yes) (yes) (yes) (never) (100) # ========================================================================== smtp-amavis unix - - n - 2 smtp -o smtp_data_done_timeout=1200 -o smtp_send_xforward_command=yes -o disable_dns_lookups=yes -o max_use=20
# ========================================================================== # service type private unpriv chroot wakeup maxproc command + args # (yes) (yes) (yes) (never) (100) # ========================================================================== 127.0.0.1:10025 inet n - n - - smtpd -o content_filter= -o local_recipient_maps= -o relay_recipient_maps= -o smtpd_restriction_classes= -o smtpd_delay_reject=no -o smtpd_client_restrictions=permit_mynetworks,reject -o smtpd_helo_restrictions= -o smtpd_sender_restrictions= -o smtpd_recipient_restrictions=permit_mynetworks,reject -o smtpd_data_restrictions=reject_unauth_pipelining -o smtpd_end_of_data_restrictions= -o mynetworks=127.0.0.0/8 -o smtpd_error_sleep_time=0 -o smtpd_soft_error_limit=1001 -o smtpd_hard_error_limit=1000 -o smtpd_client_connection_count_limit=0 -o smtpd_client_connection_rate_limit=0 -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks,no_milters -o local_header_rewrite_clients=
แก้ไขไฟล์คอนฟิก main.cf โดยแก้ไขให้ส่งเมล์ไปที่ amavis ก่อน
[root@fc17-64a ~]# vi /etc/postfix/main.cf ... content_filter = smtp-amavis:[127.0.0.1]:10024
รีสตาร์ตเซอร์วิส postfix
[root@fc17-64a ~]# systemctl restart postfix.service
ทดลองส่งอีเมล์
ล็อกอินด้วย user1 ทดลองส่งเมล์ด้วยคำสั่ง mail ไปยัง user2
[user1@fc17-64a ~]$ mail user2 Subject: test scan mail with amavisd test . EOT [user1@fc17-64a ~]$
หมายเหตุ ขึ้นบรรทัดใหม่เปล่าๆ พิมพ์เครื่องหมาย . แล้วกดปุ่ม [Enter] เพื่อออกจากคำสั่ง mail
ล็อกอินเป็น user2 ทดลองใข้คำสั่ง mail เพื่ออ่านเมล์
[user2@fc17-64a ~]$ mail
Heirloom Mail version 12.5 7/5/10. Type ? for help.
"Maildir/": 1 message 1 new
>N 1 user1@example.com Fri Jul 13 23:32 25/970 "test scan mail with amavisd"
& 1
Message 1:
From user1@example.com Fri Jul 13 23:32:41 2012
Return-Path: <user1@example.com>
X-Original-To: user2@example.com
Delivered-To: user2@example.com
X-Virus-Scanned: amavisd-new at example.com
Date: Fri, 13 Jul 2012 23:32:41 +0700
To: user2@example.com
Subject: test scan mail with amavisd
User-Agent: Heirloom mailx 12.5 7/5/10
Content-Type: text/plain; charset=us-ascii
From: user1@example.com
Status: R
test
& exit [user2@fc17-64a ~]$
สังเกตดู จะเห็นบรรทัด X-Virus-Scanned เพิ่มขึ้นมาใน header ของเมล์
ตัวอย่างในไฟล์ /var/log/maillog
[root@fc17-64a ~]# tail -f /var/log/maillog
Jul 13 23:32:41 fc17-64a postfix/pickup[2113]: 0FF723FFD2: uid=1001 from=<user1> Jul 13 23:32:41 fc17-64a postfix/cleanup[2405]: 0FF723FFD2: message-id=<20120713163241.0FF723FFD2@fc17-64a.example.com> Jul 13 23:32:41 fc17-64a postfix/qmgr[2114]: 0FF723FFD2: from=<user1@example.com>, size=450, nrcpt=1 (queue active) Jul 13 23:32:41 fc17-64a postfix/smtpd[2410]: connect from localhost[127.0.0.1] Jul 13 23:32:41 fc17-64a dovecot: auth: Debug: auth client connected (pid=0) Jul 13 23:32:41 fc17-64a postfix/smtpd[2410]: EB5703FFDE: client=localhost[127.0.0.1] Jul 13 23:32:41 fc17-64a postfix/cleanup[2405]: EB5703FFDE: message-id=<20120713163241.0FF723FFD2@fc17-64a.example.com> Jul 13 23:32:41 fc17-64a postfix/qmgr[2114]: EB5703FFDE: from=<user1@example.com>, size=892, nrcpt=1 (queue active) Jul 13 23:32:41 fc17-64a amavis[1555]: (01555-03) Passed CLEAN, <user1@example.com> -> <user2@example.com>, Message-ID: <20120713163241.0FF723FFD2@fc17-64a.example.com>, mail_id: kLOOsZlrvS+I, Hits: -0.001, size: 450, queued_as: EB5703FFDE, 891 ms Jul 13 23:32:41 fc17-64a postfix/smtpd[2410]: disconnect from localhost[127.0.0.1] Jul 13 23:32:41 fc17-64a postfix/smtp[2407]: 0FF723FFD2: to=<user2@example.com>, orig_to=<user2>, relay=127.0.0.1[127.0.0.1]:10024, delay=0.94, delays=0.03/0.01/0/0.9, dsn=2.0.0, status=sent (250 2.0.0 from MTA([127.0.0.1]:10025): 250 2.0.0 Ok: queued as EB5703FFDE) Jul 13 23:32:41 fc17-64a postfix/qmgr[2114]: 0FF723FFD2: removed Jul 13 23:32:41 fc17-64a postfix/local[2411]: EB5703FFDE: to=<user2@example.com>, relay=local, delay=0.03, delays=0.01/0.02/0/0, dsn=2.0.0, status=sent (delivered to maildir) Jul 13 23:32:41 fc17-64a postfix/qmgr[2114]: EB5703FFDE: removed
ข้อมูลอ้างอิง
- ติดตั้งและคอนฟิกเบื้องต้น postfix บน Fedora 17
- คอนฟิกส่งเมล์ SMTP ด้วย TLS ใน postfix บน Fedora 17
- คอนฟิก Postfix SMTP AUTH กับ Dovecot บน Fedora 17
- ทดสอบการสแกนไวรัสและสแปมในอีเมล์ด้วย Amavisd-new กับ Postfix
- README.postfix
- HowTos/Amavisd – CentOS Wiki
- PostfixAmavisNew – Community Ubuntu Documentation