■ClamAVを導入し、設定し、動作テストを行った
次の手順でClamAV(clamd)を導入した。
http://akira-arets.blogspot.jp/2016/01/clamav-clamdscan.html
上記の手順で、次のことが達成される。
・clamdのインストール(依存・関連パッケージを含む)
・clamdの起動(また、システム起動時の自動起動設定)
・ウイルス定義ファイルの自動更新設定
・clamdscanコマンドによるウイルス検査動作テスト
・clamd動作時の、ソケットファイルの確認 (注意:これは、clamdのソケットファイルである。)
/var/run/clamav/clamd.sock
■clamav-milterを導入と設定を行った
○インストールを行った。
(Epelリポジトリを有効化しておくこと。)
# yum install clamav-milter
======================================================
Package Arch Version Repository Size
======================================================
clamav-milter x86_64 0.99-3.el6 epel 89 k
Installing for dependencies:
sendmail-milter x86_64 8.14.4-9.el6 base 57 k
Transaction Summary
======================================================
Installed:
clamav-milter.x86_64 0:0.99-3.el6
Dependency Installed:
sendmail-milter.x86_64 0:8.14.4-9.el6
Complete!
○clamav-milterがシステム起動時に動作するように設定した。
# chkconfig clamav-milter on
clamdとclamav-milterが、システム起動時に動作するように設定されていることを確認した。
# chkconfig --list | grep clamav-milter
clamav-milter 0:off 1:off 2:on 3:on 4:on 5:on 6:off
○clamav-milterサービスの起動と確認を行った。
サービスの設定は次のファイルで行う。
(デフォルトで、次の項目が有効化されていた。他にもたくさんオプションがありコメントアウトされていた。)
# vi /etc/clamav-milter.conf
MilterSocket /var/run/clamav/clamav-milter.sockこの設定ファイルで、clamdのソケットファイルの指定を行っているようである。
User clam
PidFile /var/run/clamav/clamav-milter.pid
# ClamdSocket unix:path
# ClamdSocket tcp:host:port
ClamdSocket unix:/var/run/clamav/clamd.sock
#OnInfected Quarantine
#RejectMsg "REJECT - AntiVirus detected: %v"
AddHeader Replace
また、生成されるclamav-milter自身のソケットファイルのパスの指定も行っているようだ。
AddHeader オプションについて(デフォルトでは、無効にされている。)
有効にする(Replaceか、Addを用いる)と、次のような情報を取り扱ったメールヘッダーに付け加える。
X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.99 at test.localdomain・AddHeader Replaceメールヘッダーの下部に、上記の情報が記載された。(置き換えられることもあるらしい。)
(注意)DKIM signatures を使っているとき一致しなくなってしまうらしい。・AddHeader Addメールヘッダーのトップ(clamav-milterの時点、postfixの取り扱い情報はその直後)に、上記の情報が記載された。(注意)procmailなどの処理を混乱させるかもしれないという。
OnInfected オプションについて
もし、このPostfixが送信専用であれば、Reject を設定した方が身内の利用者にとっては親切だと思う。
Rejectを設定すると、配送を拒否しエラーメッセージを送信者に返す。(5xx error)
メッセージの内容は、RejectMsg オプションで任意のものを追加できる。
(/var/log/maillog にウイルス発見の旨が現れる)
Feb 17 00:51:26 secondary postfix/cleanup[10443]: xxxxxxxxxx: milter-reject: END-OF-MESSAGE from localhost[127.0.0.1]: 5.7.1 Command rejected; from=<test@example.com> to=<testto@example.com>
(その際に送信者が受け取るエラーメッセージ)
This is the mail system at host postfix.local
I'm sorry to have to inform you that your message could not
be delivered to one or more recipients. It's attached below.
For further assistance, please send mail to postmaster.
If you do so, please include this problem report. You can
delete your own text from the attached returned message.
The mail system
<test@example.com>: REJECT - AntiVirus detected: Eicar-Test-Signature
Final-Recipient: rfc822; test@example.com
Action: failed
Status: 5.7.1
Diagnostic-Code: X-Postfix; REJECT - AntiVirus detected: Eicar-Test-Signature
送信専用でなく外部からメールがやってくるのなら、デフォルト(Quarantine)のままが良いかもしれない。
その場合、送信者は問題なく送信ができたように錯覚する。
しかし、ウイルス入りメールは配信されることなく、/var/spool/postfix/hold/ 内に保管される。
サービスの起動を行った。
# service clamav-milter start
Starting Clamav Milter Daemon: [ OK ]ソケットファイルが作成されたことを確認した。
(注意:clamav-milterのソケットファイルである。)
# ls /var/run/clamav/ -al
total 16
drwxr-xr-x 2 clam clam 4096 Feb 10 19:21 .
drwxr-xr-x. 14 root root 4096 Feb 10 18:59 ..
-rw-rw-r-- 1 clam clam 6 Feb 10 19:21 clamav-milter.pid
srw-r--r-- 1 clam root 0 Feb 10 19:21 clamav-milter.sock
-rw-rw-r-- 1 root root 6 Feb 10 19:21 clamd.pid
srw-rw-rw- 1 root root 0 Feb 10 19:21 clamd.sock
(!)ソケットの所有者やグループが、clamとrootになっているので、
このままではpostfixのプロセスからこのソケットにアクセスすることができない。
そのため、次のようにして、設定を変更する。
○postfixのプロセスがソケット(clamav-milter.sock)にアクセスできるように設定した。
一度、サービスを止めた。
# service clamav-milter stop
Stopping Clamav Milter Daemon: [ OK ]
デーモン起動用のファイルを次の様に一部変更した。(スタート処理部分に下線部を追加した。)
# vi /etc/rc.d/init.d/clamav-milter
(省略)
# See how we were called.
case "$1" in
start)
echo -n "Starting Clamav Milter Daemon: "
daemon clamav-milter $CLAMAV_FLAGS
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/clamav-milter
[ $RETVAL -eq 0 ] && chown postfix:postfix /var/run/clamav/clamav-milter.sock
[ $RETVAL -eq 0 ] && chmod 0660 /var/run/clamav/clamav-milter.sock
;;
stop)
(省略)
○サービスを起動し、clamav-milter.sockの所有者とグループがpostfixになっているか確認した。
# service clamav-milter start
Starting Clamav Milter Daemon: [ OK ]# ls /var/run/clamav/ -al
total 16
drwxr-xr-x 2 clam clam 4096 Feb 10 19:55 .
drwxr-xr-x. 14 root root 4096 Feb 10 18:59 ..
-rw-rw-r-- 1 clam clam 6 Feb 10 19:55 clamav-milter.pid
srw-rw---- 1 postfix postfix 0 Feb 10 19:55 clamav-milter.sock
-rw-rw-r-- 1 root root 6 Feb 10 19:21 clamd.pid
srw-rw-rw- 1 root root 0 Feb 10 19:21 clamd.sock
■Postfixの追加設定
○clamav-milterを経由させるための設定を追加した。
・milter動作に問題があった場合には、回避してメール配信を継続させる。
# postconf -e milter_default_action=accept
・clamav-milterの、ソケットファイルを指定した。
(ネットワークから送達されてくるメールに対して処理させる。)
# postconf -e smtpd_milters=unix:/var/run/clamav/clamav-milter.sock
(ローカルからコマンドで送信するメールに対して処理させる。)
# postconf -e non_smtpd_milters=unix:/var/run/clamav/clamav-milter.sock
・milterプロトコルのバージョンを指定した。
# postconf -e milter_protocol=2
smtpd_milters と non_smtpd_milters とで、挙動を変えたい場合は、
設定ファイルが各々違うclamav-milterのインスタンスを複数作成し、それぞれのsockファイルを指定すると良いと思う。
【Clamav-milter 0.99 3.el6】Clamav-milterの複数のインスタンス化(複数のソケットを作成する)【Linux CentOS 6.7 64bit】
http://akira-arets.blogspot.jp/2016/02/centos6-multiple-clamavmilter-instances.html
○Postfixの再起動を行った。
# service postfix restart
以上で、準備完了。
■動作テスト
当メールシステムのメールボックスに配信されるようにメールを送信した。
メールボックスにdovecotのIMAPでアクセスして、メールを受け取ることができた。
fetchmail コマンドを実行することで、Postfixに到達し、clamav-milterを経て、ウイルスチェックが為されたようである。
次のように、メールヘッダーに、clamav-milterによる情報を確認した。
(AddHeader Replace オプションが有効なので、ヘッダーの下部に発見した。)
X-Virus-Scanned: clamav-milter 0.99 at test.localdomain X-Virus-Status: Clean
○実際に検知させてみた。
次のサイトから、The EICAR test string の内容(アスキー文字列)をコピーし、
エディタで空のファイルに書き込み保存する。(仮に、virus_testというファイルとする。)
https://en.wikipedia.org/wiki/EICAR_test_file
そして、この内容を、sendmailで送信する。
# cat virus.test | sendmail -f 送信元アドレス 送信先アドレス
〇感染メールを検知した場合、次のようなログが記載される。
# grep Virus /var/log/clamav-milter.log
Mon Jul 18 22:30:03 2016 -> VirusEvent: about to execute '/root/Actions/clamav-milter.InfectedMassageFound' 'Win.Trojan.Locky-30621' '65xxxxxxxxB' 'transferfrom@example.com' 'to@domain' 'Emailing: Image (850).pdf' '<4dbdxxxxxxxxxxxxxxxxxxxxxxxxxxx@example.com>' 'Mon, 18 Jul 2016 17:58:19 +0430'
Mon Jul 18 22:30:03 2016 -> VirusEvent: child exited with code 0
<総じて、次のようなシステムになった>
Incoming mails→ <fetchmail →[Postfix (⇔ clamav-milter ⇔ clamd) ]→ Maildir/ →dovecot> ⇔ Client PCs
ところで、
clamav-milterのソケットを複数用意して、それぞれ異なる挙動を設定したい場合、
次のようにして、複数のソケットを用意することができた。
http://akira-arets.blogspot.jp/2016/02/centos6-multiple-clamavmilter-instances.html
Postfixが複数インスタンス動作していて、それぞれでclamav-milterの挙動を変えたい場合に有用だと思う。
以上
<参考>
・清水正人 「Postfix 実践入門」 技術評論社 2010年、P.330-338