CONTENTS
ClamAVについて
Clam AntiVirus (クラム・アンチウイルス)は、オープンソース (GPL) で提供されているクロスプラットフォームのアンチウイルスソフトウェアです。
外部向けにサーバーを運営しているとウィルス対策等が気になると思います。
特にメールサーバーを運営していると、ウィルス感染のリスクも高まるので、「ClamAV」を導入しようと思います。
- メールスキャンソフトとしてはスタンダード!
- ウィルス定義ファイルの更新が可能!
- コマンドラインでのスキャンが可能!
- 多くのフォーマットやファイルをサポートしている!
▼公式WEB
▼公式解説
- CentOS Linux release 8.2.2004 (Core)
- courier-1.0.14
- courier-authlib-0.71.0
- courier-unicode-2.1
- pyClamd-0.4.0
- courier-pythonfilter-3.0.2
▼必要なパッケージ
ClamAV | メールサーバーと連動させることが出来るアンチウィルスソフト。 |
Courier-pythonfilter | CourierMailServerとClamAVを連動させるプラグイン。 Pythonという言語で書かれています。 http://phantom.dragonsdawn.net/~gordon/courier-pythonfilter/ |
pyClamd | ClamAVデーモと連動するPythonインターフェイス。 pyClamdを使用すると、簡単にPythonソフトウェアにウイルス検出機能を追加できます。 ClamAVの公式WEBからも下記にリンクがあります。 http://xael.org/norman/python/pyclamd/ |
clamavと関連ファイルのインストール
EPELいうリポジトリをからClapAVをDLして使用します。
EPELの追加方法は こちら で解説しています。
▼ClamAVのインストール
1 |
# dnf -y install clamav |
▼ウィルス定義を更新するfreshclamをインストール
1 |
# dnf -y install clamav-update |
▼インストールされたパッケージの確認
1 2 3 4 5 6 7 |
# dnf list installed | grep clamav clamav.x86_64 0.102.4-1.el8 @epel clamav-data.noarch 0.102.4-1.el8 @epel clamav-filesystem.noarch 0.102.4-1.el8 @epel clamav-lib.x86_64 0.102.4-1.el8 @epel clamav-update.x86_64 |
ClamAVのコンフィグ設定
1 |
# vi /etc/clamd.d/scan.conf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
▼ログの出力設定 コメントアウト「#」を外す。 LogFile /var/log/clamd.scan ▼ログに時間を記述 コメントアウト「#」を外す。 LogTime yes ▼TCPソケットモードからローカルソケットに設定 ファイルパスを変更した行をコメント「#」行の下に追記。 ※詳細は下記備考を参照 #LocalSocket /tmp/clamd.socket LocalSocket /var/run/clamd.sock ▼古いソケットを削除して強制終了後も問題が無いようにする コメントアウト「#」を外す。 FixStaleSocket yes ▼スキャン除外ディレクトリがあれば設定 「/home/AAA」ディレクトリの場合は下記のように追記する。 #ExcludePath ^/sys/ ExcludePath /home/AAA/ ▼実行ユーザーをrootに変更 #User clamscan User root |
/var/run/clamd/clamd.sock のようにフォルダを作成してソケットのPATHを設定する方法が多いかと思いますが、OS再起動等でフォルダが自動で作られパーミッションがゼロになり、メールの送信が出来ない問題が発生したため、run の直下にソケットファイルを設置しています。
ClamAVの起動設定
▼clamdユーザーで自動起動
1 |
# systemctl enable clamd@scan |
「@」が入っていて解り辛いですが、「clamd@scan」が起動サービス名です。
▼自動起動確認
1 2 |
# systemctl is-enabled clamd@scan enabled |
▼clamdの起動
何十秒か時間がかかる場合があります。
1 |
# systemctl start clamd@scan |
▼clamdの起動確認
1 2 3 4 5 |
# systemctl status clamd@scan ● clamd@scan.service - clamd scanner (scan) daemon Loaded: loaded (/usr/lib/systemd/system/clamd@.service; enabled; vendor preset: disabled) Active: active (running) since Sun 2020-10-04 16:34:38 JST; 6s ago |
▼ソケットファイル確認
起動後は「scan.conf」の設定に則りソケットファイルが作成されます。
1 2 |
# ls -lrt /var/run/clamav/clamd.sock srw-rw-rw- 1 root root 0 10月 4 20:51 /var/run/clamav/clamd.sock |
ウィルス定義ファイル更新するfreshclamの設定
1 |
# vi /etc/freshclam.conf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
▼ログファイルの書き出し先 コメントアウト「#」を外す。 UpdateLogFile /var/log/freshclam.log ▼ログファイルの最大サイズ 2MBを超えるとログがローテートします。 LogFileMaxSize 2M ▼ログに時間を記述 コメントアウト「#」を外す。 LogTime yes ▼ログのローテート設定 コメントアウト「#」を外す。 LogRotate yes ▼データベースのオーナーを root に変更 freshclamを実行した際にデーモンへの通知が失敗しないように設定します。 DatabaseOwner clamupdate ↓ #DatabaseOwner clamupdate DatabaseOwner root ▼ウィルス定義更新後にclmadにその旨を通知 NotifyClamd /path/to/clamd.conf ↓ #NotifyClamd /path/to/clamd.conf NotifyClamd /etc/clamd.d/scan.conf |
手動でウィルス定義ファイルの更新
▼定義ウィルス更新
1 |
# freshclam -u root |
ウィルススキャンテスト
コマンド実行に滞在しているディレクトリ配下のファイルをスキャンします。
▼スキャンオプション
–recursive | サブディレクトリ、圧縮ファイルも検索 |
–remove | 観戦ファイルを削除する |
–infected | ウィルスに感染したファイルのみを出力 |
▼スキャン実行例
1 2 3 4 5 6 7 8 9 10 11 |
# clamscan --infected --remove --recursive ----------- SCAN SUMMARY ----------- Known viruses: 8918418 Engine version: 0.102.4 Scanned directories: 1 Scanned files: 5 Infected files: 0 ←★ウィルス検知無し Data scanned: 63.02 MB Data read: 22.46 MB (ratio 2.81:1) Time: 23.926 sec (0 m 23 s) |
▼テストウィルスDL
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# mkdir temp # cd temp # wget http://www.eicar.org/download/eicar.com # wget http://www.eicar.org/download/eicar.com.txt # wget http://www.eicar.org/download/eicar_com.zip # wget http://www.eicar.org/download/eicarcom2.zip # ls -lrt 合計 16 -rw-r--r-- 1 root root 184 7月 2 04:35 eicar_com.zip -rw-r--r-- 1 root root 308 7月 2 04:35 eicarcom2.zip -rw-r--r-- 1 root root 68 7月 2 04:35 eicar.com.txt -rw-r--r-- 1 root root 68 7月 2 04:35 eicar.com |
▼再度スキャンを実行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# clamscan --infected --remove --recursive /home/hazki/Tmp/courier/temp/eicar.com: Win.Test.EICAR_HDB-1 FOUND ←★検知 /home/hazki/Tmp/courier/temp/eicar.com: Removed. ←★削除 /home/hazki/Tmp/courier/temp/eicar.com.txt: Win.Test.EICAR_HDB-1 FOUND /home/hazki/Tmp/courier/temp/eicar.com.txt: Removed. /home/hazki/Tmp/courier/temp/eicar_com.zip: Win.Test.EICAR_HDB-1 FOUND /home/hazki/Tmp/courier/temp/eicar_com.zip: Removed. /home/hazki/Tmp/courier/temp/eicarcom2.zip: Win.Test.EICAR_HDB-1 FOUND /home/hazki/Tmp/courier/temp/eicarcom2.zip: Removed. ----------- SCAN SUMMARY ----------- Known viruses: 8918418 Engine version: 0.102.4 Scanned directories: 1 Scanned files: 4 Infected files: 4 ←★合計4つのウィルスを削除 Data scanned: 0.00 MB Data read: 0.00 MB (ratio 0.00:1) Time: 17.116 sec (0 m 17 s) |
ウィルス定義の更新をcronにて自動化
Shell Script と呼ばれるプログラムファイルとして作成して、Scriptファイルを cron にて毎日時限発動させることで、定義ファイルの更新チェックを毎日自動で実行されるようにします。
▼定義ファイル更新のShell Scriptを作成
下記の例では、「/usr/local/bin/」配下にスクリプトを作成した場合の例です。
1 |
# vi /usr/local/bin/freshclam.sh |
1 2 3 4 5 6 |
#!/bin/sh # ウィルス定義ファイル更新 date echo "" /usr/bin/freshclam -u root |
▼作成したShell Scriptに実行権限を付与
1 |
# chmod 755 /usr/local/bin/freshclam.sh |
▼試しに問題が無いかスクリプトを実行
1 |
/usr/local/bin/freshclam.sh |
▼cronに登録
- 毎日夜中の「3:15」にウィルス定義ファイルの更新を実行。
- 実行時の標準出力結果をメールで送信。
1 |
vi /etc/crontab |
1 2 |
MAILTO="info@example.com" 15 3 * * * root /usr/local/bin/freshclam.sh |
Courier-pythonfilterのインストール
Courier-pythonfilterは、CourierMailServerとClamAVを連動させるプラグインです。
Pythonというプログラム言語で書かれています。
▼ファイルのDL
1 |
# wget https://files.pythonhosted.org/packages/00/46/a4061cb598625eee29c152a631224f2af16a5e3647d29fccbaae3d0c6f2e/courier-pythonfilter-3.0.2.tar.gz |
▼python3-develのインストール
Courier-pythonfilterは「python3」で作成されたプログラムです。
「python2」では動作しないので注意。
1 |
# dnf -y install python3-devel |
▼RPM化前にファイルの修正
Ver3.0.2はファイルの記述が間違えておりrpmbuildの際にエラーになるバグがあるのです >_<
# rpmbuild -ta courier-pythonfilter-3.0.2.tar.gz
:
/var/tmp/rpm-tmp.jucZQO: line 40: cd: courier-pythonfilter-3.0: No such file or directory
▼一度tarファイルを解凍
1 2 |
# tar xvf courier-pythonfilter-3.0.2.tar.gz # cd cd courier-pythonfilter-3.0.2 |
▼該当ファイルの確認
1 2 3 4 5 |
# grep -rin "3\.0" ./* ./PKG-INFO:3:Version: 3.0.2 ./courier-pythonfilter.spec:8:Version: 3.0 ./setup.py:14: version="3.0.2", |
上から2番目「spec」のバージョン表記が間違えているので修正します。
▼該当ファイルの修正
1 |
# vi courier-pythonfilter.spec |
1 2 3 |
Version: 3.0 ↓ Version: 3.0.2 |
▼古いファイルを削除して修正したファイルを再圧縮
1 2 3 4 |
# cd ../ # rm -f courier-pythonfilter-3.0.2.tar.gz # tar cvf courier-pythonfilter-3.0.2.tar.gz courier-pythonfilter-3.0.2 # rm -rf courier-pythonfilter-3.0.2 |
▼Courier-pythonfilterのRPM化実行
tar.gzのファイルをRPM化するにはオプションは「-ta」になります。
1 |
# rpmbuild -tb courier-pythonfilter-3.0.2.tar.gz |
▼RPM化したCourier-pythonfilterのインストール
pythonfilterをrootでrpmbuild実行時は「/root/rpmbuild/RPMS/noarch/」にファイルが作成されます。
1 2 3 4 5 6 |
# cd /root/rpmbuild/RPMS/noarch/ # ls -lrt -rw-r--r-- 1 root root 79732 10月 4 23:20 courier-pythonfilter-3.0.2-1.el8.noarch.rpm # rpm -ivh courier-pythonfilter-3.0.2-1.el8.noarch.rpm |
pyClamdのインストール
pyClamdは、ClamAVデーモと連動するPythonインターフェイスです。
pyClamdを使用すると、簡単にPythonソフトウェアにウイルス検出機能を追加できます。
▼ファイルのDL
先ほどpythonfilterをダウンロードしたディレクトリに移動してファイルをDLします。
1 |
wget https://files.pythonhosted.org/packages/13/73/97a0518b59f1b6aefa2ac851566038d2c9128f8a5503bcf4cd0adf8b0072/pyClamd-0.4.0.tar.gz |
▼ソースコードのファイルのビルド
pyClamdはrpmbuildを行うためのレシピファイル「spec」が無いためRPM化ができません。
ソースコードを直接ビルドしてインストールします。
▼DLした圧縮ファイルを解凍
1 |
# tar xvf pyClamd-0.4.0.tar.gz |
▼解凍したディレクトリに移動してビルドを実行
1 2 |
# cd pyClamd-0.4.0 # python3 setup.py build |
▼生成されたファイルの確認
1 2 3 |
# ls -lrt drwxr-xr-x 3 hazki hazki 85 10月 4 23:57 pyclamd drwxr-xr-x 3 root root 17 10月 4 23:57 build |
「build」ディレクトリが作成されます。
「build」と「pyclamd」ディレクトリ内にパッケージが展開されています。
▼ビルドされたファイルをインストール
1 |
# python3 setup.py install |
error: can’t create or remove files in install directory
/usr/local/lib/python3.6/site-packages/
:
このようにエラーになった場合はPython3のsite-packagesのPATHが違うと思われます。
この場合は「/usr/local/lib/python3.6/」配下に「site-packages」は存在しないかと思われます。
▼Pythone3の「site-packages」のPATHを確認
1 2 |
# python3 -c "import site; print (site.getsitepackages())" ['/usr/local/lib64/python3.6/site-packages', '/usr/local/lib/python3.6/site-packages', '/usr/lib64/python3.6/site-packages', '/usr/lib/python3.6/site-packages'] |
上記例のpython3 コマンドにてPATHの確認を行った際は4つのPATHが表示されました。
- /usr/local/lib64/python3.6/site-packages
- /usr/local/lib/python3.6/site-packages
- /usr/lib64/python3.6/site-packages
- /usr/lib/python3.6/site-packages
ビルドされたファイルをインストールした際に発生したエラー内容のPATHは「/usr/local/lib/python3.6/site-packages/」と表示されています。
エラー発生時時は「/usr/local」と表示されていましたが、正しくは「/usr」です。
エラーで表示されたPATHでは「/usr/lib64」ではなく「/usr/lib」と表示されていました。
このことから、本来の正しいPATHは「/usr/lib/python3.6/site-packages/」になります。
▼prefixオプションを指定して再度インストールを実行
prefixオプション指定時は、site-packagesのフルパスではなくこの場合は「/usr」を指定します。
1 |
# python3 setup.py install --prefix=/usr |
「/usr」から先の「/lib/python3.6/site-packages/」は自動で作成されます。
▼インストール確認
1 2 3 4 5 |
# ls -lrt /usr/lib/python3.6/site-packages/ : drwxr-xr-x 3 root root 4096 10月 4 23:30 pythonfilter -rw-r--r-- 1 root root 21673 10月 5 00:46 pyClamd-0.4.0-py3.6.egg -rw-r--r-- 1 root root 26 10月 5 00:46 easy-install.pth |
pythonfilterのコンフィグ変更
▼どの機能を利用するかの設定
1 |
# vi /etc/pythonfilter-modules.conf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
▼clamavの下記コメントアウトを外すして設定 ClamAVのコンフィグ「scan.conf」で設定したローカルソケットのパスである「/var/run/clamd.sock」に変更します。 [clamav.py] local_socket = '/var/run/clamd.sock' action = 'quarantine' ▼メール設定 送受信されるウィルスメールの隔離を検知したら、指定のメールアドレスに連絡が届きます。 設定ファイルの一番したを修正。 [quarantine] siteid = '7d35f0b0-4a07-40a6-b513-f28bd50476d3' dir = '/var/lib/pythonfilter/quarantine' ▼隔離されたメールの生存期間 days = 14 ▼送信者に通知するかどうか 「0:非通知」「1:通知」 notify_recipient = 1 ▼隔離から解放する際のメール送信先 also_notify = 'user@example.com' ▼隔離から救出していいかどうか 「0:救出不可」「1:救出可能」 user_release = 1 |
clamavを有効化
1 |
# vi /etc/pythonfilter.conf |
1 2 3 4 5 |
▼clamavのコメント「#」を外して有効化 # clamav: scans each message MIME part with the ClamAV virus scanner #clamav ↓ clamav |
▼ソケットファイルのディレクトリのパーミッション確認
1 2 3 |
# ls -lrt /var/run/ | grep clam drwx--x--- 2 clamscan virusgroup 40 10月 7 20:47 clamd.scan d--------- 2 root root 60 10月 7 20:47 clamav |
EPELで入れた場合、clamavのパーミッションがゼロになっています。
▼パーミッション変更
1 |
# chmod 755 /var/run/clamav |
▼パーミッション変更確認
1 2 3 4 |
# ls -lrt /var/run/ | grep clam drwx--x--- 2 clamscan virusgroup 40 10月 7 20:47 clamd.scan drwxr-xr-x 2 root root 60 10月 7 20:47 clamav |
▼ウィルス検知後隔離ディレクトリのオーナー権限を確認
1 2 3 |
# ls -lrt /var/lib/pythonfilter/ drwxr-xr-x 2 root root 6 10月 4 23:20 quarantine |
▼オーナー権限を「daemon」に変更
1 |
# chown daemon:daemon /var/lib/pythonfilter/quarantine |
▼オーナー権限変更後の確認
1 2 |
# ls -lrt /var/lib/pythonfilter/ drwxr-xr-x 2 daemon daemon 6 10月 4 23:20 quarantine |
▼pythone3へのパスに変更
デフォルトではpythone3.6を利用するようになっていますが、ユーザープログラムでは推奨されておらず、また動作もしない事からpythone3を使用するように変更します。
1 |
vi /usr/bin/pythonfilter |
1 2 3 4 |
▼pythone3のPATHに変更 #!/usr/libexec/platform-python -s ↓ #!/usr/bin/python3 -s |
PythonFilterの起動と停止
▼起動
1 |
# filterctl start pythonfilter |
▼起動確認
下記のようにフィルターパスのシンボリックリンクが張られていればOKです。
1 2 |
# ps -ef | grep pythonfilter daemon 7034 1159 4 01:16 ? 00:00:00 /usr/libexec/platform-python -s /etc/courier/filters/active/pythonfilter |
▼停止する場合
1 |
# filterctl stop pythonfilter |
ウィルススキャンをcronにて自動化
Shell Script と呼ばれるプログラムファイルとして作成して、Scriptファイルを cron にて毎日時限発動させることで、「Maildir」のウィルススキャンを毎日自動で実行されるようにします。
- ウィルススキャンを実行するディレクトリは特定のディレクトリ
- 毎日夜中の「4:00」に実行される
- ウィルススキャンの実行結果をメールで送信
▼ウィルススキャンのShell Scriptを作成
下記の例では、「/usr/local/bin/」配下にスクリプトを作成した場合の例です。
1 |
# vi /usr/local/bin/maildir_clamscan.sh |
1 2 3 4 5 |
#!/bin/sh date echo "" clamscan --infected --remove --recursive /home/hazki/Maildir |
▼作成したShell Scriptに実行権限を付与
1 |
# chmod 755 /usr/local/bin/maildir_clamscan.sh |
▼試しに問題が無いかスクリプトを実行
1 |
/usr/local/bin/maildir_clamscan.sh |
▼cronに登録
1 |
# vi /etc/crontab |
1 2 |
MAILTO="hazki@angelscry.net" 0 4 * * * root /usr/local/bin/maildir_clamscan.sh |