(無償) logo
世界中で使われるISO標準オフィスソフト(MSオフィス互換)

★LibreOfficeの導入事例★
詳細について

2016年2月15日月曜日

【Postfix 2.6.6 x86_64】Postfixを通過するメールに対してウイルス検査を行う【clamav-milter 0.99-3.el6】【Linux CentOS 6.7 64bit minimal】


■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
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
この設定ファイルで、clamdのソケットファイルの指定を行っているようである。
また、生成される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-milterclamd ]→ 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