きりのブログ

パソコン、開発関係の思いつきと作業記録

amavisd-newとSophos Antivirus for Linuxでメールチェックにてハマったのでメモ

Ubuntu 16.04 LTSにPostfixでメールサーバー建ててます。amavisd-newをコンテンツフィルターとして使い、配下で定番のclamavspamassassinを動かしてました。

しかしながら、clamavの検出力が残念な感じだったので、Sophos Antivirus for Linuxを試してみることにしました。無料版ということでsweepによるオンデマンドスキャンしかできませんが、検出力は満足いくものでした。(セカンダリの位置付けなので、プライマリのclamavを停止して検証など行いました。)

問題なく数ヶ月たった11月中頃、パッタリと検出しなくなりました。時々思い出したように原因を探ってたんですが、ようやく対処方法が分かったのでメモしておきます。

※覚えてないだけで、色々設定を弄っていた可能性もあるため、万人に通用する対処ではないかもしれません。よって、自分用のメモの位置付けとします。まとまっていませんがご容赦ください。

 

まずはログの調査。

# /opt/sophos-av/bin/savlog --today

→エラーなど見当たらず、定期的な更新もされているように見える

マルウェアのzipファイルをWindows機からscpして、sweepを手で叩いて検出するか確認してみる。

# sweep hogehoge.zip

→ちゃんと検出した

一応、ウィルス定義ファイルがちゃんと更新されているか確認。

# ls -lrt /opt/sophos-av/lib/sav

→新しいファイルが存在する

# /opt/sophos-av/bin/savdstatus --version

Copyright 1989-2016 Sophos Limited. All rights reserved.
Sophos Anti-Virus = 9.12.3
ビルドのリビジョン = 2629392
脅威検出エンジン = 3.65.2
脅威データ = 5.34
検出脅威数 = 12413311
脅威データリリース日 = 2016年11月29日 00時00分00秒
前回アップデートを確認した日時 = 2016年12月13日 12時25分39秒

→脅威データリリース日が古いのが気になるけど、バージョンは問題無さそう

# ps aux | grep amavis

amavis 56768 0.0 6.2 259336 126976 ? Ss 18:34 0:01 /usr/sbin/amavisd-new (master)
amavis 58661 0.3 6.5 267272 134352 ? S 19:18 0:02 /usr/sbin/amavisd-new (ch5-avail)
amavis 58684 0.3 6.6 266712 135012 ? S 19:19 0:02 /usr/sbin/amavisd-new (ch5-58684-05)
postfix 58816 0.0 0.4 100864 10140 ? S 19:23 0:00 smtpd -n xxx.xxx.xxx.xxx:smtp -t inet -u -o stress= -o content_filter=smtp-amavis:[127.0.0.1]:10024 -o receive_override_options=no_address_mappings
postfix 59154 0.0 0.2 83136 5956 ? S 19:29 0:00 smtp -n smtp-amavis -t unix -u -o smtp_data_done_timeout=1200 -o smtp_send_xforward_command=yes -o disable_dns_lookups=yes -o max_use=20
sophosav 59178 1.0 0.2 75632 4360 ? S 19:30 0:00 /usr/local/bin/sweep -nb -f -all -rec -ss -sc -archive -cab -mime -oe -tnef --no-reset-atime /var/lib/amavis/tmp/amavis-20161213T192054-58684-12pnURVQ/parts
amavis 59181 79.0 4.3 162584 88128 ? Sl 19:30 0:02 savscan -nb -f -all -rec ss -sc -archive -cab -mime -oe -tnef --no-reset-atime /var/lib/amavis/tmp/amavis-20161213T192054-58684-12pnURVQ/parts
root 59184 0.0 0.0 16216 932 pts/1 S+ 19:30 0:00 grep --color=auto amavis

→sweepがsophosavユーザーで動いてる。savscanはamavisユーザーで動いてる。よく分からん。sophosavユーザーだと対象のファイルを読めないので、とりあえずそれぞれのグループにユーザーを追加してみる。

# gpasswd -a sophosav amavis

# gpasswd -a amavis sophosav

→結果変わらず。

※上のps結果で、savscanの方、なぜかssオプション前のハイフンが消えている。気になって調べたけど原因不明。ナニコレ?

savのログではスキャンしたことになっているけど実際のところどうなんだ、ということで、テンポラリに作られるファイルをタイミングよくコピーして手動スキャンしてみたらちゃんと検出された。ログにも残る。謎が深まる。

Postfixのコンテンツフィルターは外から来たメールしか通していなかったので、ローカルからテストできるようにmaster.cfを編集し、10026ポートでの待受けを追加。

# vi /etc/postfix/master.cf

(下記追加。環境に合わせて読み替え必要かも)

192.168.0.1:10026 inet n - - - - smtpd
 -o content_filter=smtp-amavis:[127.0.0.1]:10024
 -o receive_override_options=no_address_mappings
 -o smtpd_client_restrictions=permit_mynetworks,reject

再起動して、メーラーの設定を10026ポートを使うよう変更。これでガシガシ試せる。早速マルウェア付きメールを送信してみる。

→見事にスルーされる。だめじゃん。

ローカルから送ったメールはコンテンツフィルター内でスルーしているのかも、と思いamavisの設定を弄くりつつ試行錯誤したが、そういう問題ではなさそう。(@bypass_virus_checks_maps、@whitelist_sender_aclを変更してみたり)

最終的に辿り着いた対処はコレ。

# vi /etc/amavis/conf.d/20-debian_default

@keep_decoded_original_maps = (new_RE(
# qr'^MAIL$', # retain full original message for virus checking (can be slow)
   qr'^MAIL-UNDECIPHERABLE$', # recheck full mail if it contains undecipherables
   qr'^(ASCII(?! cpio)|text|uuencoded|xxencoded|binhex)'i,
# qr'^Zip archive data', # don't trust Archive::Zip
));

→Zipの行のコメント外して有効に。

これでちゃんと検出するようになりました。(これデフォルトのはずなんだけども。)

未検証ですが、sweepに渡しているmimeオプションを無効にしても同様の結果になるかもしれません。というか、むしろそっちのほうが良い気がします。これだとZIPは生で渡してますが、その他の形式の場合デコードして渡しちゃうし、他のアンチウィルスソフトとの共存も考えなくちゃならないし。他形式のサンプルないので検証出来ませんけど、対応出来たので良しとしておきます。

Ubuntuのセキュリティアップデートで更新されたパッケージとか影響してるのかなぁ。mime-supportとか。(適当))