- AlmaLinux release 9.6 (Sage Margay)
- ClamAV: 1.0.9-1
知らぬ間にCiscoに買収されていたClamAVをAlmaLinuxにインストールする。
ClamAVパッケージのインストール
AlmaLinuxにClamAVを導入するには、EPEL(Extra Packages for Enterprise Linux)リポジトリを予めインストールしておく必要がある。
$ sudo dnf install -y epel-release
インストールするClamAVパッケージは下記の3つとした。メールのウイルススキャンも行うのであればclamav-milterパッケージも必要になる。
$ sudo dnf install -y clamav clamd clamav-update
インストールされたことを確認するとこのような具合であった。
$ rpm -qa | grep clam
clamav-lib-1.0.9-1.el9.x86_64
clamav-filesystem-1.0.9-1.el9.noarch
clamav-freshclam-1.0.9-1.el9.x86_64
clamav-1.0.9-1.el9.x86_64
clamd-1.0.9-1.el9.x86_64
freshclam.confの編集
ClamAVの起動に先立って、ウイルスデータベースを予め更新せねばならない。更新はfreshclam
コマンドを実行すれば宜しい。freshclamの設定は/etc/freshclam.conf
でおこなう。設定項目はたくさんあってすべてを網羅することは面倒であったから幾つかを掻い摘んで設定しておいた。
設定項目 | 設定内容 |
---|---|
DatabaseDirectory | ウイルスデータベースの保管場所。clamdの動きを司るscan.confにも同じ項目があり、一致させねばならぬようである。 |
UpdateLogFile | ログファイルのパス。デフォルトでは無効だが、更新状況をあとから確認するために設定しておく。ログファイルは先んじて手動で用意しておく必要がある。 |
LogFileMaxSize | ログファイルの最大サイズ。設定するとLogRotateが自動的に有効となるので、このサイズを超えるとログローテートが走る。0にすると際限なくログファイルが書き込まれてゆく。 |
LogTime | ログに時刻を付与する。デフォルトでは無効になっているが、絶対にほしいとおもう。 |
LogVerbose | 詳細にログする。デフォルトでは無効だが、障害の起こったときに原因調査の手がかりとなることを期待して有効にしておくのが良かろうと思う。 |
DatabaseOwner | ウイルスデータベースの所有者を規定する。デフォルトではclamavであるけれども、ClamAVインストール時に作成されるユーザはclamupdateであるからそちらに変更しておく。 |
Checks | 1日何回ウイルスデータベースをチェックするか指定する。デフォルトは12回で2時間に1回のペースでチェックするようである。初めは説明をよく読んでいなかったのでChecks 12という指定で12時間毎にチェックするものと勘違いしていた。 |
NotifyClamd | ウイルスデータベースが更新されたらclamdをリロードする。scan.confへのパスを記載する。 |
したがってfreshclam.confの設定はこのような具合である。
$ sudo vi /etc/freshclam.conf
DatabaseDirectory /var/lib/clamav
UpdateLogFile /var/log/freshclam.log
LogFileMaxSize 0
LogTime yes
LogVerbose yes
DatabaseOwner clamupdate
DatabaseMirror database.clamav.net
NotifyClamd /etc/clamd.d/scan.conf
ログファイルも忘れずに作成しておく。
$ sudo touch /var/log/freshclam.log
$ sudo chown clamupdate:clamupdate /var/log/freshclam.log
$ sudo chmod 600 /var/log/freshclam.log
$ ls -l /var/log/freshclam.log
この設定で以ってfreshclamを稼働させてみると、問題なくウイルスデータベースが更新された。設定にミスがあるとERRORメッセージが表示される。
$ sudo freshclam --config-file=/etc/freshclam.conf
あとはOS起動時に自動でfreshclamが立ち上がってくるように設定する。
$ sudo systemctl enable --now clamav-freshclam.service
Created symlink /etc/systemd/system/multi-user.target.wants/clamav-freshclam.service → /usr/lib/systemd/system/clamav-freshclam.service.
$ systemctl status clamav-freshclam.service
なお、手動でfreshclamを実行したらエラーとならないのに、systemctlから起動するとログファイルへのパーミッションが無い旨、エラーとなって困惑した。SELinuxを無効にしたらエラーは解消されたので、SELinuxが影響していた模様である。SELinuxを無効にするには下に掲げる段取りで進める。
$ sudo grubby --update-kernel ALL --args selinux=0
$ sudo reboot
$ getenforce
Disabled
getenforceの実行結果がEnforcingからDisabledになっていればSELinuxが無効になっている。
scan.confの編集
次にclamdの動作を規定するscan.confを編集する。パッケージからインストールするとclamd.confではなくscan.confというファイル名となるようである。scan.confはfreshclam.confにもまして設定項目が多いので一先ず、最低限稼働するよう設定を触ることとした。
設定項目 | 設定内容 |
---|---|
LogFile | clamdのログファイルのパスを指定する。 |
LogFileMaxSize | ログファイルの最大サイズ。設定するとLogRotateが自動的に有効となるので、このサイズを超えるとログローテートが走る。0にすると際限なくログファイルが書き込まれてゆく。 |
LogTime | ログに時刻を付与する。scan.confでもデフォルトでは無効になっているが、やはり絶対にほしいとおもう。 |
LogVerbose | 詳細にログする。scan.confでもデフォルトでは無効だが、障害の起こったときに原因調査の手がかりとなることを期待してはやり有効にしておくのが良かろうと思う。 |
ExtendedDetectionInfo | ウイルス名に加えて、ハッシュ値とサイズもログに記録するようにする。ハッシュ値はIOC(Indicators of Compromise)の確認に使えそうである。 |
DatabaseDirectory | ウイルスデータベースの保管場所。freshclamの動きを司るfreshclam.confにも同じ項目があり、一致させねばならぬようである。 |
LocalSocket | clamdの待ち受けモードを指定する。UNIXドメインソケットにもTCPソケットにも対応している。しかしながらTCPソケットはどんな送信元からもコマンドを受け入れてしまうというセキュリティ上の理由からUNIXドメインソケットが推奨されているようである。 |
LocalSocketMode | ソケットのパーミッションを指定する。デフォルトではだれもでアクセスできるパーミッション(666)となっているから、660を指定しておくのがよかろうとおもう。 |
ExcludePath | ウイルススキャンの対象から除外するパスを指定する。除外対象は複数指定することもあろうから、この設定項目は何回でも設定できる。 |
User | clamdの実行ユーザを指定する。デフォルトではclamscanユーザで実行するようになっているけれども、パーミッションの関係でスキャンできない箇所も多いので設定をコメントしてrootで実行されるようにした。 |
$ sudo vi /etc/clamd.d/scan.conf
LogFile /var/log/clamd.scan
LogFileMaxSize 0
LogTime yes
LogSyslog yes
LogVerbose yes
ExtendedDetectionInfo yes
DatabaseDirectory /var/lib/clamav
LocalSocket /run/clamd.scan/clamd.sock
LocalSocketMode 660
ExcludePath ^/proc/
ExcludePath ^/sys/
#User clamscan
あとはOS起動時に自動でclamdが立ち上がってくるように設定する。先ずclamdのunit fileを確認するとExecStartはこのような具合であった。
$ cat /lib/systemd/system/clamd@.service
(snip)
ExecStart = /usr/sbin/clamd -c /etc/clamd.d/%i.conf
設定ファイル名の箇所にインスタンス名のユニット指定子が使われている。scan.confを読み込んでほしいから「scan」と指定せねばならない。するとこうである。なお、clamdの起動には多数のシグネチャを読み込むフェーズがあって、これに大変時間がかかる。
$ sudo systemctl enable --now clamd@scan
Created symlink /etc/systemd/system/multi-user.target.wants/clamd@scan.service → /usr/lib/systemd/system/clamd@.service.
$ systemctl status clamd@scan
あとはEICARテストファイルを用いてスキャンを動作確認する。
$ curl https://files.trendmicro.com/products/eicar-file/eicar.com -O
$ sudo clamdscan --infected
/home/guro/eicar: Win.Test.EICAR_HDB-1 FOUND
きちんとEICARテストファイルを検出しているから良さそうな風情である。
logrotateの設定
LogFileMaxSizeを0に設定したのでログファイルは際限なく肥大化してゆく。したがってログローテートの管理が必要となる。freshclamとclamd両方のログファイルについてそれぞれローテートの設定ファイルをこしらえた。
$ sudo vi /etc/logrotate.d/freshclam
/var/log/freshclam.log
{
rotate 90
daily
dateext
create 600 clamupdate clamupdate
missingok
postrotate
/usr/bin/systemctl -s HUP kill freshclam.service >/dev/null 2>&1 || true
endscript
}
$ sudo vi /etc/logrotate.d/clamd
/var/log/clamd.scan
{
rotate 90
daily
dateext
create 600 clamscan clamscan
missingok
postrotate
/usr/bin/systemctl -s HUP kill clamd@scan.service >/dev/null 2>&1 || true
endscript
}