オープンソースのアンチウイルスソフト
ファイルサーバに保存してあるファイルの定期的なスキャンとかあるいは新規に保存されるファイルのスキャンを目的にしたいと思います
一応メールの中身(本文、添付ファイル)もスキャンしてくれるそうですが、今回はファイルサーバでの運用という事で。
dnf install clamav clamav-update clamav-scanner-systemd clamav-server-systemd定義ファイルが最新でないと意味がない。
まずは初回に定義ファイルをダウンロードします
freshclamその後に更新ファイルの取得を定期的に行うようにします
systemctl enable --now clamav-freshclamこの「clamav-freshclam」は常駐デーモン型でして、次にいつ更新されるかは「systemctl status clamav-freshclam」の内容と「/etc/freshclam.conf」に寄ります
:
# Number of database checks per day.
# Default: 12 (every two hours)
#Checks 24
:とあれば規定値が 12 なので、2時間ごとに。もし「Checks 2」なら12時間ごとになります.
「systemctl status clamav-freshclam」の実行時間から2時間後、12時間後になる.
このデーモン自体でファイルをスキャンする訳ではない。このあとの「camdscan」によって実際のスキャンが行われます.
clamdは定義ファイルを読み込んで、ソケットやTCPポートを開けて、「camdscan」から提示されたファイルをスキャンするそうな.
またマルチスレッドで稼働します。8core/8threadsなマシンで、計算もそのマシンでこなすなら 4 - 6 にするそうな。
設定場所は「/etc/clamd.d/scan.conf」。既定値は 10 のようで自身のcpuに合わせて調整した方がいいみたい.
あとsocketファイルの場所を定義します(rockylinuxでは未定義で、これが原因でエラーになる)
vi /etc/clamd.d/scan.conf
:
MaxThreads 4
:
LocalSocket /run/clamd.scan/clamd.sock
:そして起動させます
systemctl enable --now clamd@scanこの「/etc/clamd.d/scan.conf」でどこをスキャンするとかの定義はない。代わりにここはスキャンしない。とかこの拡張子はスキャンしないを定義できます
(スキャン対象にしないPATH)
ExcludePath ^/boot/
ExcludePath ^/bin/
ExcludePath ^/etc/
ExcludePath ^/srv/
ExcludePath ^/var/
ExcludePath ^/usr/
(拡張子でスキャン対象にしないファイル)
ExcludePath (?i)\.tiff$
ExcludePath (?i)\.tif$
ExcludePath (?i)\.mrc$cronを使って定期的に /home をスキャンさせるようにします
スキャンによって発見されたファイルを退避させる場所を作り quarantineは検疫という意味
mkdir -p /var/quarantine
chown root:root /var/quarantine
chmod 700 /var/quarantineスクリプト「/usr/local/bin/clamav-scan.sh」を用意します. 中身はこんな感じで
#!/bin/bash
TARGET="/home"
QUARANTINE="/var/quarantine"
LOG="/var/log/clamav/scheduled-scan.log"
LOCK="/var/lock/clamav-scan.lock"
# ログディレクトリ
sudo mkdir -p "$(dirname "$LOG")"
sudo chown clamav:clamav "$(dirname "$LOG")" 2>/dev/null || true
# 重複実行防止(flock)
exec 200>"$LOCK"
flock -n 200 || { echo "$(date) : previous scan still running, exiting" >> "$LOG"; exit 0; }
echo "$(date) : scan start" >> "$LOG"
# nice/ionice で低優先度実行、clamd に接続する clamdscan を利用
nice -n 10 ionice -c2 -n7 clamdscan --fdpass --multiscan --recursive --move="$QUARANTINE" --log="$LOG" "$TARGET"
RC=$?
echo "$(date) : scan end (rc=$RC)" >> "$LOG"
exit $RC作ったスクリプトをcronで回します
chmod +x /usr/local/bin/clamav-scan.sh
vi /etc/cron.d/clamav-scan
:
MAILTO=""
0 2 * * * root /usr/local/bin/clamav-scan.sh >> /var/log/clamav/cron-scan.log 2>&1
:こでれ毎日午前2時にスキャンが始まります
っで最後にlogrotate.
「/etc/logrotate.d/clamav-scan」を下記内容で作る
/var/log/clamav/*.log {
daily
rotate 14
compress
missingok
notifempty
create 640 clamav adm
sharedscripts
postrotate
systemctl kill -s HUP clamd@scan.service 2>/dev/null || true
endscript
}毎日logrotateの対象となって、14日で削除