ClamAVのclamscanからclamdscanへの移行 [Linux]
受信メールのウイルスチェックに ClamAV(clamscan コマンド) を使用している。
ただし、契約している ISP でチェック済のものについては、対象外としている。
また、最近 ISP のメールサーバーの高負荷時に誤認識が多発することが分かり、ISP でのウイルスチェックを無効化した。これにより、常に ClamAV でのチェックが実施されるようになった。
ここで問題となったのが、clamscan コマンドの処理が非常に遅いことである。原因は、起動時のウイルス定義ファイルの情報解析に多大な時間を要するためのようである。
このため、単独コマンドの clamscan から、サーバー・クライアント形式の clamdscan への移行を行った。
デーモン(サーバー)の起動時にのみウイルス定義ファイルの情報解析が実施されるようになるため、ウイルスチェック(クライアント)の所要時間を短縮できる。
2. パッケージのインストール
(1) Debian 9 の場合
# apt-get install clamav-daemon
・依存関係により、clamdscan パッケージがインストールされる。
(2) CentOS 7 の場合
# yum --enablerepo=epel install clamd
(3) CentOS 6 の場合
# yum --enablerepo=epel install clamd
3. 基本的な設定
インターネット上に情報が豊富なため、詳細な説明は割愛する。
3-1. Debian 9 の場合
(1) clamd の設定
/etc/clamav/clamd.conf を編集する。
・socket ファイルの所有者グループ、ファイル・パーミションの設定
・実行ユーザーの設定
・ログファイルの最大サイズの指定
・除外するディレクトリの指定
# diff clamd.conf clamd.conf.org 6,7c6,7 < #LocalSocketGroup clamav < #LocalSocketMode 666 --- > LocalSocketGroup clamav > LocalSocketMode 666 10c10 < #User clamav --- > User clamav 84,85c84 < #LogFileMaxSize 0 < LogFileMaxSize 100K --- > LogFileMaxSize 0 89,97d87 < < # Don't scan files and directories matching regex < ExcludePath ^/proc/ < ExcludePath ^/sys/ < ExcludePath ^/dev/ < ExcludePath ^/mnt/ < ExcludePath ^/misc/ < ExcludePath ^/net/ < ExcludePath ^/media/
3-2. CentOS 7 の場合
(1) /run/clamd.scan/ のパーミション変更
・/run/clamd.scan/ のパーミションを変更する。
・下記の内容で、/etc/tmpfiles.d/clamd.scan.conf を作成する。
# chmod 755 /run/clamd.scan # cat /etc/tmpfiles.d/clamd.scan.conf d /run/clamd.scan 0755 clamscan virusgroup -
(2) clamd の設定
/etc/clamd.d/scan.conf を編集する。
・設定の有効化
・ログファイルのパスの設定
・ログファイルの最大サイズの設定
・ログへの日時情報の出力
・syslog の使用の有無の設定
・ログ・ローテーションの有無の設定
・socket ファイルの設定
・除外するディレクトリの設定
・SelfCheck の実施間隔の設定
・実行ユーザーの設定
# diff scan.conf scan.conf.org 8c8 < #Example --- > Example 14c14 < LogFile /var/log/clamd.scan --- > #LogFile /var/log/clamd.scan 32d31 < LogFileMaxSize 100K 36c35 < LogTime yes --- > #LogTime yes 45c44 < #LogSyslog yes --- > LogSyslog yes 58c57 < LogRotate yes --- > #LogRotate yes 94c93 < LocalSocket /var/run/clamd.scan/clamd.sock --- > #LocalSocket /var/run/clamd.scan/clamd.sock 106c105 < FixStaleSocket yes --- > #FixStaleSocket yes 178,184c177,178 < ExcludePath ^/proc/ < ExcludePath ^/sys/ < ExcludePath ^/dev/ < ExcludePath ^/mnt/ < ExcludePath ^/misc/ < ExcludePath ^/net/ < ExcludePath ^/media/ --- > #ExcludePath ^/proc/ > #ExcludePath ^/sys/ 205d198 < SelfCheck 3600 214c207 < #User clamscan --- > User clamscan
(3) clamd@scan の自動起動
# systemctl enable clamd@scan
3-3. CentOS 6 の場合
(1) clamd の設定
/etc/clamd.conf を編集する。
# diff clamd.conf clamd.conf.org 31,32c31 < #LogFileMaxSize 0 < LogFileMaxSize 100K --- > LogFileMaxSize 0 45c44 < #LogSyslog yes --- > LogSyslog yes 58c57 < LogRotate yes --- > #LogRotate yes 110c109 < #TCPSocket 3310 --- > TCPSocket 3310 118c117 < #TCPAddr 127.0.0.1 --- > TCPAddr 127.0.0.1 178,184c177,178 < ExcludePath ^/proc/ < ExcludePath ^/sys/ < ExcludePath ^/dev/ < ExcludePath ^/mnt/ < ExcludePath ^/misc/ < ExcludePath ^/net/ < ExcludePath ^/media/ --- > #ExcludePath ^/proc/ > #ExcludePath ^/sys/ 205d198 < SelfCheck 3600 214c207 < #User clam --- > User clam
4. 問題点への対応
4-1. Debian 9 の場合
(1) syslog への出力の無効化
clamd.conf の設定だけでは、syslog への出力を無効化できない。
(/var/log/syslog に出力され、LOG_LOCAL6 ファシリティでの出力ではない。)
このため、/etc/rsyslog.conf のルールの先頭に、下記の設定を追加する。
# Discard messages of clamd. :programname, isequal, "clamd" stop
(補足)
変更内容の反映のため、rsyslog の再起動、またはシステムの再起動を行う。
4-2. CentOS 7 の場合
(1) 起動時のタイムアウト発生への対応
下記の手順で、clamd@scan の Unit ファイルを編集する。
(/lib/systemd/system/clamd@.service の直接編集でも対応可能。)
(a) /etc/systemd/system/clamd@scan.service の作成
# cd /etc/systemd/system # cp -p /lib/systemd/system/clamd@scan.service .
(b) /etc/systemd/system/clamd@scan.service の編集
# diff /etc/systemd/system/clamd@scan.service /lib/systemd/system 3,5d2 < [Service] < TimeoutStartSec=5min ← これがポイント <
(補足)
停止時にも同様の設定が必要な場合には、下記のように設定する。
TimeoutSec=5min
(c) 変更内容の反映
# systemctl disable clamd@scan # systemctl enable clamd@scan
4-3. CentOS 6 の場合
(1) clamd の起動方法の変更
clamd の起動が完了するまでには、3 分程度を要する。
また、起動スクリプトの終了までブート処理が待ち状態となる。
このため、clamd の起動スクリプトをバックグラインドで実行する。
(a) 自動起動の無効化
自動起動が有効化されている場合には、無効化する。
# chkconfig --list | grep clamd # chkconfig clamd off
(b) /etc/rc.d/rc.local の編集
ファイルの最後に、下記の設定を追加する。
# start clamd if [ -x /etc/init.d/clamd ]; then (/etc/init.d/clamd start &) >/dev/null 2>&1 fi
5. 備考
(1) clamd の起動が完了する前の clamdscan の実行
clamd の起動が完了するまでは、clamdscan はエラーとなる。
(2) ウイルス情報を更新した後の clamd への反映
下記のいずれかの方法で対応できる。
(a) clamdscan コマンドの実行
# clamdscan --reload
(補足)
・ウイルス情報の再読み込みには、210 秒程度を要する。
・スクリプト内で実行する場合には、下記のように実行する。
(clamdscan --reload &) >/dev/null 2>&1
(b) freshclam コマンドの clamd との連携
freshclam の設定で、NotifyClamd を有効にする。
(c) clamd でのセルフチェック
一定の時間間隔でウイルス情報を確認し、必要なら再読み込みを行う。
設定項目は SelfCheck、初期値は 600(s) である。
(3) clamdscan のオプション指定
ほとんどのオプションは、clamd の設定ファイルで指定する。
コマンドラインで指定できるのは、一部のオプションのみである。
(ログファイルのパス、等)
(4) clamd の監視
clamdtop コマンドを使用する。
コメント 0