MAIL (Courier-MTA) Server

CentOS 8にて構築したメールサーバー「CourierMTA」にClamAVを導入してウィルス対策

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 コマンドを利用してパッケージ情報検索やインストール、削除を行うことができます。
パッケージファイルが管理されているダウンロードサーバーをリポジトリと呼び、新規でリポジトリを追加することで、ダウンロードできるファイルの種類を増やすことが可能です。

 

 

おすすめ

1

目次1 Windows10で構築するサーバー構成の例2 Windows10 記憶域について3 Windows10 Hyper-vについて Windows10で構築するサーバー構成の例 知らない人も多い ...

2

目次1 記憶域について2 記憶域の作成方法 記憶域について この記事ではWindows 10 の記憶域によるストレージの作成方法について解説します。 そもそも記憶域について詳しく知りたい方は、下記の記 ...

3

目次1 概要2 テキストパーツ3 ボックスデザイン4 カスタムボタン5 会話ふきだし6 ランキング7 レイアウト8 その他パーツ9 記事一覧/カード10 ショートコード補助11 AFFINGER5につ ...

4

ディレクションを担当した世界遺産のガイドアプリより、ムービー用のBGMを1曲担当しました。 Misumi-nishikou It is BGM created for app video. sound ...

5

こちらはプライベートで作成したYoutube投稿用サイクリングムービーのBGMです。 EDM Sound-2 EDM sound for my Youtube. soundcloud.com

-MAIL (Courier-MTA), Server