目次
ClamAVについて
Clam AntiVirus (クラム・アンチウイルス)は、オープンソース (GPL) で提供されているクロスプラットフォームのアンチウイルスソフトウェアです。
外部向けにサーバーを運営しているとウィルス対策等が気になると思います。
特にメールサーバーを運営していると、ウィルス感染のリスクも高まるので、「ClamAV」を導入しようと思います。
ClamAVの特徴
- メールスキャンソフトとしてはスタンダード!
- ウィルス定義ファイルの更新が可能!
- コマンドラインでのスキャンが可能!
- 多くのフォーマットやファイルをサポートしている!
▼公式WEB
https://www.clamav.net/
▼公式解説
https://www.clamav.net/about
構築環境
- 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のインストール
CentOS 8 では dnf コマンドを利用してパッケージ情報検索やインストール、削除を行うことができます。
パッケージファイルが管理されているダウンロードサーバーをリポジトリと呼び、新規でリポジトリを追加することで、ダウンロードできるファイルの種類を増やすことが可能です。
「-y」オプションを指定すると、インストール可否の確認で「yes」となり自動的にインストールが開始します。
command # dnf -y install clamav
▼ウィルス定義を更新するfreshclamをインストール
command # dnf -y install clamav-update
▼インストールされたパッケージの確認
command # 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のコンフィグ設定
command # vi /etc/clamd.d/scan.conf
scan.conf
▼ログの出力設定
コメントアウト「#」を外す。
LogFile /var/log/clamd.scan
▼ログに時間を記述
コメントアウト「#」を外す。
LogTime yes
▼TCPソケットモードからローカルソケットに設定
ファイルパスを変更した行をコメント「#」行の下に追記。
#LocalSocket /tmp/clamd.socket
LocalSocket /var/run/clamd.sock
注意ポイント
/var/run/clamd/clamd.sock のようにフォルダを作成してソケットのPATHを設定する方法が多いかと思いますが、OS再起動等でフォルダが自動で作られパーミッションがゼロになり、メールの送信が出来ない問題が発生したため、run の直下にソケットファイルを設置しています。
▼古いソケットを削除して強制終了後も問題が無いようにする
コメントアウト「#」を外す。
FixStaleSocket yes
▼スキャン除外ディレクトリがあれば設定
「/home/AAA」ディレクトリの場合は下記のように追記する。
#ExcludePath ^/sys/
ExcludePath /home/AAA/
▼実行ユーザーをrootに変更
#User clamscan
User root
ClamAVの起動設定
▼clamdユーザーで自動起動
command # systemctl enable clamd@scan
補足説明
「@」が入っていて解り辛いですが、「clamd@scan」が起動サービス名です。
▼自動起動確認
command # systemctl is-enabled clamd@scan enabled
enabled になっていればサーバー再起動で自動で敵にサービスが起動します。
▼clamdの起動
何十秒か時間がかかる場合があります。
command # systemctl start clamd@scan
▼clamdの起動確認
command # 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
最後までエラーが無く Active: active (running) となっていればOK。
▼ソケットファイル確認
起動後は「scan.conf」の設定に則りソケットファイルが作成されます。
command # ls -lrt /var/run/clamav/clamd.sock srw-rw-rw- 1 root root 0 10月 4 20:51 /var/run/clamav/clamd.sock
ウィルス定義ファイル更新するfreshclamの設定
command # vi /etc/freshclam.conf
freshclam.conf
▼ログファイルの書き出し先
コメントアウト「#」を外す。
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
手動でウィルス定義ファイルの更新
▼定義ウィルス更新
command # freshclam -u root
ウィルススキャンテスト
コマンド実行に滞在しているディレクトリ配下のファイルをスキャンします。
▼スキャンオプション
--recursive | サブディレクトリ、圧縮ファイルも検索 |
--remove | 観戦ファイルを削除する |
--infected | ウィルスに感染したファイルのみを出力 |
▼スキャン実行例
command # 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
command # 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
▼再度スキャンを実行
command # 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/」配下にスクリプトを作成した場合の例です。
command # vi /usr/local/bin/freshclam.sh
freshclam.sh
#!/bin/sh
# ウィルス定義ファイル更新
date
echo ""
/usr/bin/freshclam -u root
さらに詳しく
Shell Scriptや、そもそもシェルってなーにという方は、こちら にて解説しています。
▼作成したShell Scriptに実行権限を付与
command # chmod 755 /usr/local/bin/freshclam.sh
▼試しに問題が無いかスクリプトを実行
command /usr/local/bin/freshclam.sh
▼cronに登録
- 毎日夜中の「3:15」にウィルス定義ファイルの更新を実行。
- 実行時の標準出力結果をメールで送信。
command vi /etc/crontab
crontab
MAILTO="info@example.com"
15 3 * * * root /usr/local/bin/freshclam.sh
さらに詳しく
cronについての詳細は こちら で解説しています。
Courier-pythonfilterのインストール
Courier-pythonfilterは、CourierMailServerとClamAVを連動させるプラグインです。
Pythonというプログラム言語で書かれています。
▼ファイルのDL
command # wget https://files.pythonhosted.org/packages/00/46/a4061cb598625eee29c152a631224f2af16a5e3647d29fccbaae3d0c6f2e/courier-pythonfilter-3.0.2.tar.gz
▼python3-develのインストール
Courier-pythonfilterは「python3」で作成されたプログラムです。
「python2」では動作しないので注意。
CentOS 8 では dnf コマンドを利用してパッケージ情報検索やインストール、削除を行うことができます。
パッケージファイルが管理されているダウンロードサーバーをリポジトリと呼び、新規でリポジトリを追加することで、ダウンロードできるファイルの種類を増やすことが可能です。
「-y」オプションを指定すると、インストール可否の確認で「yes」となり自動的にインストールが開始します。
command # 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ファイルを解凍
command # tar xvf courier-pythonfilter-3.0.2.tar.gz # cd cd courier-pythonfilter-3.0.2
▼該当ファイルの確認
command # 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」のバージョン表記が間違えているので修正します。
▼該当ファイルの修正
command # vi courier-pythonfilter.spec
courier-pythonfilter.spec
Version: 3.0
↓
Version: 3.0.2
▼古いファイルを削除して修正したファイルを再圧縮
command # 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」になります。
command # rpmbuild -tb courier-pythonfilter-3.0.2.tar.gz
▼RPM化したCourier-pythonfilterのインストール
pythonfilterをrootでrpmbuild実行時は「/root/rpmbuild/RPMS/noarch/」にファイルが作成されます。
command # 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します。
command wget https://files.pythonhosted.org/packages/13/73/97a0518b59f1b6aefa2ac851566038d2c9128f8a5503bcf4cd0adf8b0072/pyClamd-0.4.0.tar.gz
▼ソースコードのファイルのビルド
pyClamdはrpmbuildを行うためのレシピファイル「spec」が無いためRPM化ができません。
ソースコードを直接ビルドしてインストールします。
▼DLした圧縮ファイルを解凍
command # tar xvf pyClamd-0.4.0.tar.gz
▼解凍したディレクトリに移動してビルドを実行
command # cd pyClamd-0.4.0 # python3 setup.py build
▼生成されたファイルの確認
command # 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」ディレクトリ内にパッケージが展開されています。
▼ビルドされたファイルをインストール
command # 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を確認
command # 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」を指定します。
command # python3 setup.py install --prefix=/usr
ココがポイント
「/usr」から先の「/lib/python3.6/site-packages/」は自動で作成されます。
▼インストール確認
command # 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のコンフィグ変更
▼どの機能を利用するかの設定
command # vi /etc/pythonfilter-modules.conf
pythonfilter-modules.conf
▼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を有効化
command # vi /etc/pythonfilter.conf
pythonfilter.conf
▼clamavのコメント「#」を外して有効化
# clamav: scans each message MIME part with the ClamAV virus scanner
#clamav
↓
clamav
▼ソケットファイルのディレクトリのパーミッション確認
command # 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のパーミッションがゼロになっています。
▼パーミッション変更
command # chmod 755 /var/run/clamav
▼パーミッション変更確認
command # 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
▼ウィルス検知後隔離ディレクトリのオーナー権限を確認
command # ls -lrt /var/lib/pythonfilter/ drwxr-xr-x 2 root root 6 10月 4 23:20 quarantine
▼オーナー権限を「daemon」に変更
command # chown daemon:daemon /var/lib/pythonfilter/quarantine
▼オーナー権限変更後の確認
command # ls -lrt /var/lib/pythonfilter/ drwxr-xr-x 2 daemon daemon 6 10月 4 23:20 quarantine
▼pythone3へのパスに変更
デフォルトではpythone3.6を利用するようになっていますが、ユーザープログラムでは推奨されておらず、また動作もしない事からpythone3を使用するように変更します。
command vi /usr/bin/pythonfilter
pythonfilter
▼pythone3のPATHに変更
#!/usr/libexec/platform-python -s
↓
#!/usr/bin/python3 -s
PythonFilterの起動と停止
▼起動
command # filterctl start pythonfilter
▼起動確認
下記のようにフィルターパスのシンボリックリンクが張られていればOKです。
command # ps -ef | grep pythonfilter daemon 7034 1159 4 01:16 ? 00:00:00 /usr/libexec/platform-python -s /etc/courier/filters/active/pythonfilter
▼停止する場合
command # filterctl stop pythonfilter
ウィルススキャンをcronにて自動化
Shell Script と呼ばれるプログラムファイルとして作成して、Scriptファイルを cron にて毎日時限発動させることで、「Maildir」のウィルススキャンを毎日自動で実行されるようにします。
- ウィルススキャンを実行するディレクトリは特定のディレクトリ
- 毎日夜中の「4:00」に実行される
- ウィルススキャンの実行結果をメールで送信
▼ウィルススキャンのShell Scriptを作成
下記の例では、「/usr/local/bin/」配下にスクリプトを作成した場合の例です。
command # vi /usr/local/bin/maildir_clamscan.sh
maildir_clamscan.sh
#!/bin/sh
date
echo ""
clamscan --infected --remove --recursive /home/hazki/Maildir
さらに詳しく
Shell Scriptや、そもそもシェルってなーにという方は、こちら にて解説しています。
▼作成したShell Scriptに実行権限を付与
command # chmod 755 /usr/local/bin/maildir_clamscan.sh
▼試しに問題が無いかスクリプトを実行
command /usr/local/bin/maildir_clamscan.sh
▼cronに登録
command # vi /etc/crontab
crontab
MAILTO="hazki@angelscry.net"
0 4 * * * root /usr/local/bin/maildir_clamscan.sh
CentOS 8 では dnf コマンドを利用してパッケージ情報検索やインストール、削除を行うことができます。
パッケージファイルが管理されているダウンロードサーバーをリポジトリと呼び、新規でリポジトリを追加することで、ダウンロードできるファイルの種類を増やすことが可能です。