squeezeのclamavとpostfix連携(amavis)

■postfixに来たメールをウイルスチェックする
 ※以下のメール版。clamavと連携して、メールウイルス対策を行う。
  また参考と同じように設定したが、タイトルが微妙なのはあえて触れないで置く。

 2012/04/23 Squeezeにclamavを導入。EICARチェック
 http://d.hatena.ne.jp/labunix/20120423

 参考:clamavのインストール
 http://yaw.jp/hobby/linux/article/clamav.html

$ dpkg -L clamav > /dev/null 2>&1 && echo "ok"
ok
$ dpkg -L clamav-daemon > /dev/null 2>&1 && echo "ok"
ok

$ apt-cache search amavisd-new
amavisd-new - Interface between MTA and virus scanner/content filters
spampd - spamassassin based SMTP/LMTP proxy daemon

■「amavisd-new」の導入

$ sudo apt-get install -y amavisd-new
$ ps -ef | grep amavis | grep -v grep
amavis   27251     1  0 18:59 ?        00:00:00 amavisd (master)
amavis   27252 27251  0 18:59 ?        00:00:00 amavisd (virgin child)
amavis   27253 27251  0 18:59 ?        00:00:00 amavisd (virgin child)
$ sudo grep -i usage /etc/init.d/amavis
        #echo "Usage: $N {start|stop|restart|reload|force-reload|debug}" >&2
        echo "Usage: $N {start|stop|restart|force-reload|status|debug}" >&2
$ sudo /etc/init.d/amavis status
amavisd is running.

■ユーザ、グループの確認

$ echo "[group]";grep "amavis\|clamav" /etc/group; \
  echo "[user]"; grep "amavis\|clamav" /etc/passwd
[group]
clamav:x:116:
amavis:x:127:
[user]
clamav:x:111:116::/var/lib/clamav:/bin/false
amavis:x:117:127:AMaViS system user,,,:/var/lib/amavis:/bin/sh

$ id amavis;id clamav
uid=117(amavis) gid=127(amavis) 所属グループ=127(amavis)
uid=111(clamav) gid=116(clamav) 所属グループ=116(clamav)

■clamavとの連携
 ※clamd.confがroot権限になってる。
  設定変更をした覚えは無いので、デフォルトのはず。
  cramavのデーモンの所有者はclamavユーザなので、深くは追わない。

$ grep -A 1 " uid " /etc/amavis/conf.d/15-av_scanners
#   uid such as clamav, add user clamav to the amavis group, and then add
#   AllowSupplementaryGroups to clamd.conf;

$ sudo adduser clamav amavis

$ id clamav
uid=111(clamav) gid=116(clamav) 所属グループ=116(clamav),127(amavis)

$ find /etc/clamav/ -type f -exec ls -l {} \;
-rw-r--r-- 1 root root 1543 2012-02-01 21:49 /etc/clamav/clamd.conf
-r--r--r-- 1 clamav adm 784 2012-03-29 23:40 /etc/clamav/freshclam.conf
$ ps -ef | grep clamav | grep -v grep
clamav    1992     1  0 Apr27 ?        00:00:40 /usr/sbin/clamd
clamav    2192     1  0 Apr27 ?        00:02:23 /usr/bin/freshclam -d --quiet

■postfixとの連携前の確認
  postfix側はポート10025を使ったよくある構成。
  postfixの設定変更を伴うので、ドキュメントをよく読んでおく。
  もちろん、ポートが被ることの無いように(ポートが被る場合の設定変更方法はドキュメントにある)
  amavisdはポート10024で待ち受けているので、そこに接続するイメージ。

$ dpkg -L amavisd-new | grep postfix
/usr/share/doc/amavisd-new/README.postfix.gz
/usr/share/doc/amavisd-new/README.postfix.html

$ lv -s /usr/share/doc/amavisd-new/README.postfix.gz

$ test "`netstat -an | grep 10025`" == "" && echo "ok"
ok
$ sudo netstat -an --program | grep 10024
tcp        0      0 127.0.0.1:10024         0.0.0.0:*               LISTEN      27251/amavisd (mast

$ find /etc/amavis/ -type f -exec grep 10024 {} \;
$inet_socket_port = 10024;   # default listening socket

■amavisへの接続テスト
 ※普通のメールサーバだと思ってよい。

$ telnet 127.0.0.1 10024
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 [127.0.0.1] ESMTP amavisd-new service ready
ehlo localhost
250-[127.0.0.1]
250-VRFY
250-PIPELINING
250-SIZE
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-DSN
250 XFORWARD NAME ADDR PORT PROTO HELO SOURCE
quit
221 2.0.0 [127.0.0.1] amavisd-new closing transmission channel
Connection closed by foreign host.

■当然postfixも動作しているはず。

$ telnet localhost 25
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 squeeze.labunix.net ESMTP Postfix (Debian/GNU)
ehlo localhost
250-squeeze.labunix.net
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
quit
221 2.0.0 Bye
Connection closed by foreign host.

■現在のpostfixの設定を保存

$ sudo postfix check && echo "ok"
ok
$ sudo cp -pi /etc/postfix/main.cf /etc/postfix/main.cf.`date '+%Y%m%d'`
$ ls -l /etc/postfix/main.cf*
-rw-r--r-- 1 root root 1357 2012-04-29 19:47 /etc/postfix/main.cf
-rw-r--r-- 1 root root 1357 2012-04-29 19:47 /etc/postfix/main.cf.20120430
$ sudo cp -pi /etc/postfix/master.cf /etc/postfix/master.cf.`date '+%Y%m%d'`
$ ls -l /etc/postfix/master.cf*
-rw-r--r-- 1 root root 5301 2012-04-29 19:46 /etc/postfix/master.cf
-rw-r--r-- 1 root root 5301 2012-04-29 19:46 /etc/postfix/master.cf.20120430

■「soft_bounce」
 ※デフォルトは「no」、「postconf -e」で変更し、「main.cf」に追加されることを確認

$ sudo postconf -d | grep "soft_bounce"
lmtp_sasl_auth_soft_bounce = yes
smtp_sasl_auth_soft_bounce = yes
soft_bounce = no

$ dpkg -L postfix | grep "\.cf"
/usr/share/postfix/main.cf.tls
/usr/share/postfix/main.cf.debian
/usr/share/postfix/main.cf.dist
/usr/share/postfix/master.cf.dist
/usr/lib/postfix/master.cf
/usr/lib/postfix/main.cf

$ find /usr/lib/postfix -name "*.cf" -type f -exec grep -B 10 "soft_bounce =" {} \;

# SOFT BOUNCE
#
# The soft_bounce parameter provides a limited safety net for
# testing.  When soft_bounce is enabled, mail will remain queued that
# would otherwise bounce. This parameter disables locally-generated
# bounces, and prevents the SMTP server from rejecting mail permanently
# (by changing 5xx replies into 4xx replies). However, soft_bounce
# is no cure for address rewriting mistakes or mail routing mistakes.
#
#soft_bounce = no

$ sudo postconf -e "soft_bounce = yes" 
$ sudo postfix check && sudo /etc/init.d/postfix reload
Reloading Postfix configuration...done.
$ diff /etc/postfix/main.cf /etc/postfix/main.cf.20120430
42d41
< soft_bounce = yes

■「/etc/mailname」がドメイン、つまりFQDNであることを確認
 ※ドメインやDNSのMXを設定、「dpkg --reconfigure postfix」で修正できる。

$ cat /etc/mailname
squeeze.labunix.net

■「/etc/postfix/master.cf」の最後に設定を追加
 ※ドキュメントからコピペする場合は改行や空白に注意
  lmtpかsmtpは通常はどちらかだけでよい。

$ diff /etc/postfix/master.cf /etc/postfix/master.cf.20120430
109,138d108
< amavisfeed unix    -       -       n        -      2     lmtp
<   -o lmtp_data_done_timeout=1200
<   -o lmtp_send_xforward_command=yes
<   -o lmtp_tls_note_starttls_offer=no
< amavisfeed unix    -       -       n       -       2     smtp
<   -o smtp_data_done_timeout=1200
<   -o smtp_send_xforward_command=yes
<   -o smtp_tls_note_starttls_offer=no
< 127.0.0.1:10025 inet n    -       n       -       -     smtpd
<   -o content_filter=
<   -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 smtpd_restriction_classes=
<   -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=
<   -o smtpd_milters=
<   -o local_recipient_maps=
<   -o relay_recipient_maps=
<

$ sudo postfix check && sudo /etc/init.d/postfix reload
Reloading Postfix configuration...done.

■「10025」の連携チェック

$ netstat -an | grep 10025
tcp        0      0 127.0.0.1:10025         0.0.0.0:*               LISTEN
$ telnet 127.0.0.1 10025
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 squeeze.labunix.net ESMTP Postfix (Debian/GNU)
ehlo localhost
250-squeeze.labunix.net
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
quit
221 2.0.0 Bye
Connection closed by foreign host.

■忘れてはいけない最後のpostfix連携

$ diff /etc/postfix/main.cf /etc/postfix/main.cf.20120430 | tail -1
< content_filter=amavisfeed:[127.0.0.1]:10024
$ sudo postfix check && sudo /etc/init.d/postfix reload

■EICARのダウンロード

$ cd /tmp;sudo wget http://www.eicar.org/download/eicar_com.zip
$ ls -l /tmp/eicar_com.zip
-rw-r--r-- 1 root root 184 2012-04-30 20:39 /tmp/eicar_com.zip

■「novirus」は「Passed CLEAN」で通過する

$ uuencode novirus.zip "this is novirus.zip" | mail -s "no virus" `whoami`@squeeze.labunix.net

Apr 30 22:09:45 squeeze amavis[27253]: (27253-09) Passed CLEAN
 LOCAL [192.168.188.177] [192.168.188.177] <labunix@nextsqueeze.localdomain> -> <labunix@squeeze.labunix.net>
 Message-ID: <20120430130944.E2206DE1E5@nextsqueeze.localdomain>
 mail_id: RmV61XlKd6kk
 Hits: -
 size: 806
 queued_as: 037B2F67A6
 105 ms

■「EICAR」は「Blocked BANNED」で拒否される。
 ※postmaster宛てに該当部分を除いて通知される

$ uuencode eicar.com.zip "this is eicar.com.zip" | mail -s "EICAR" `whoami`@squeeze.labunix.net

$ tail -f /var/log/mail.log | cut -c 25- | grep clamav
Apr 30 22:32:42 squeeze amavis[27253]: (27253-15) Blocked BANNED (.asc
eicar.com)
 LOCAL [192.168.188.177] [192.168.188.177] <labunix@nextsqueeze.localdomain> -> <labunix@squeeze.labunix.net>
 quarantine: U/banned-UMlKRjOrFHsF
 Message-ID: <20120430133242.7DE244DC1A@nextsqueeze.localdomain>
 mail_id: UMlKRjOrFHsF
 Hits: -
 size: 864
 203 ms

■MXやAレコードを引かない環境であれば、以下のように「disable_dns_lookups」を追加する

$ grep -B 1 disable /etc/postfix/master.cf
smtp      unix  -       -       -       -       -       smtp
# When relaying mail as backup MX, disable fallback_relay to avoid MX loops
--
amavisfeed unix    -       -       n        -      2     lmtp
  -o disable_dns_lookups=yes
--
amavisfeed unix    -       -       n       -       2     smtp
  -o disable_dns_lookups=yes

■clamavに渡しているので、チェックは行われるのだが、
 本当に有効にするには(つまり、送信できないようにするには)以下をコメントアウトを外す。

$ grep -B 5 -A 1 "bypass_virus_checks_maps" /etc/amavis/conf.d/15-content_filter_mode | grep -v "^\$"
# Please note, that anti-virus checking is DISABLED by
# default.
# If You wish to enable it, please uncomment the following lines:
@bypass_virus_checks_maps = (
   \%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);

■同様にアンチスパムを適用するには以下のコメントアウトを外す

$ grep -B 5 -A 1 "bypass_spam_checks_maps" /etc/amavis/conf.d/15-content_filter_mode | grep -v "^\$"
# Please note, that anti-spam checking is DISABLED by
# default.
# If You wish to enable it, please uncomment the following lines:
@bypass_spam_checks_maps = (
   \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);

■デーモンの再起動

$ sudo /etc/init.d/clamav-daemon restart
$ sudo /etc/init.d/amavis restart
$ sudo /etc/init.d/postfix restart

■正常メールには、「スキャンした」というヘッダ情報が付与される。

X-Virus-Scanned: Debian amavisd-new at nextsqueeze.localdomain
X-Virus-Scanned: Debian amavisd-new at squeeze.labunix.net