AlmaLinuxでかんたんClamAV設定:ウイルススキャンとメール通知を自動化【初心者向け】

記事内に広告を含みます

Almalinux のKVMを利用してVMを作成、そこにプリザンターを動作させていきます。
ここではVMの作成までを記載します。
構成については、記事:プリザンターで作る!ローコード業務改善システムの構築方法:イントロを確認してくださいね。


Almalinuxには、KVMを簡単管理できるツール、Cockpitがあります。
ブラウザにてアクセスすることで、仮想ネットワークスイッチの作成、VMの追加・起動・停止など簡単に操作できます。

CockpitにてVMを作成しましたので、ウイルス対策を行います。
事業や会社で使用するPCには、ウイルス対策は必須!っとしていることが多いと思います。
有料のサービスもたくさんありますが、今回は無料のClamAVをセットアップし、定期的に指定場所をスキャンすることにします。
この記事でわかること。

  1. VMへのClamAVインストール方法。
  2. ホストPCからのClamAVのウイルス定義ファイル更新設定。
  3. SELinuxの設定方法。
  4. 指定場所のウイルススキャン定期実行設定。
  5. ウイルス検知時の通知設定(Gmailに送信するよ)。
  6. ウイルススキャンログの設定。

Step1

まずは設計、なにをどうするかを決めます。

ウイルス対策設計

定義ファイルの更新
ホストPCがClamAV公式サイトから1日1回更新するので、VMはホストPCが配布する定義ファイルを取得します。

ウイルス検索周期

1週間に1回とします。

検出した時の対策

指定した管理者のメールアドレスにメール通知、対象のファイルは駆除せずそのままとします。

なぜ駆除しないのか?

誤検出が怖いからです。

ウイルス対策ソフトの精度によりますが、誤検出が怖いからです。
サーバーアプリケーションに必要なファイルをウイルスと誤検出、駆除されてしまうとサーバーアプリケーションが動作しなくなってしまうと思うので。

検出した際、管理者にメール通知します。
事業や会社にメールサーバーがあれば、そのメールサーバーに転送するように設定しますが、今回はGmailのアカウントにメール通知するように設定します。

管理者のメールアドレス = Gmail

これから週1で実施するウイルス検索を設定していきます。

Step2

ClamAVインストール
Almalinuxをインストールした直後ですので、セキュリティアップデートも含めた、システムのアップデートを行います。
まずターミナルを起動し、下記コマンドを実行。

sh
$ sudo dnf check-update

その後、セキュリティアップデートを適応します。

sh
$ sudo dnf update

ダウンロードが終わると、インストールするか聞いてきますので、「y」を入力して「Enter」を押下します。

初めてのアップデートの場合、GPG鍵のインポートについて聞いてきますので、「y」を入力、「Enter」を押下してください。

アップデートが完了しました。

Almalinuxのバージョンをチェックします。

sh
$ cat /etc/redhat-releace

9.5から9.6 にアップデートが完了しました。
念のため、再起動をして置きます(念のためね)。

再起動しましたので、ClamAVをインストールします。
ClamAVはepelリポジトリにあるため、通常のdnfではインストールできません。
epelリポジトリをインストールするとClamAVをインストールできるようになります。

チェックしてみましょう。

sh
$ sudo dnf --enablerepo=epel info clamav

ClamAVは、見つかりませんね。
epelリポジトリをインストールします。

sh
$ sudo dnf install epel-release

elelリポジトリのインストールが完了しました。ClamAVがあるかチェックします。

sh
$ sudo dnf info clamav

出てきました。。。インストールします。

sh
$ sudo dnf install clamav clamav-freshclam

GPG鍵のインポートについて聞かれますが、前回同様「y」をしてください。

インストールが完了しました。

Step3

ホストPCの設定-ウイルス定義ファイルの更新設定
ウイルス定義ファイルの定期更新設定を行います。

sh
$ sudo vim /etc/freshclam.conf
/etc/freshclam.conf
#変更箇所のみ表示
> UpdateLogFile /var/log/clamav/freshclam.log  
> LogTime yes  
> DatabaseOwner clamupdate  
> PrivateMirror ホストPC名/clamav/  
> Checks 1  

※私の環境はDNSがないのでIPを直接アクセスしています。

vim は、「:wq」を入力すると変更を保存して終了します。
※vim の詳しい操作方法は調べてくださいね。
※freshclam設定について詳しく知りたい方は調べてくださいね。

予めログフォルダ、ログファイルを作成、Ownerを変更します。

sh
$ sudo mkdir /var/log/clamav
$ sudo touch /var/log/clamav/freshclam.log  
$ sudo chown clamupdate.clamupdate /var/log/clamav  
$ sudo chown clamupdate.clamupdate /var/log/clamav/freshclam.log 

初回ウイルス定義を取得。

sh
$ sudo freshclam

定義取得完了です。

取得場所とログの確認をします。

sh
$ ls -laF /var/lib/clamav
$ ls -laF /var/log/clamav

ウイルス定義を取得するできました!

Step4

ウィルス定義ファイルの自動更新設定を行います。
自動更新には、用意されている「clamav-freshclam」を利用します。
設定は「Step2」にて実施済みなので動作させるだけです。

sh
$ sudo systemctl enable clamav-freshclam  
$ sudo systemctl start clamav-freshclam

clamav-freshclamの状態をチェックします。

sh
$ sudo systemctl status clamav-freshclam

正常動作してればOK。。。動作していない(failed)ので、
ログ(/var/log/messages)を見てエラーを修正します。

sh
$ sudo view /var/log/messages  

ログの最後付近に、SELinuxエラーが発生しています。
アクセスが、SELinuxにより拒否されていますので、許可するように設定を行う必要があります。
SELinuxエラーログ付近に、詳細表示用のコマンドが記載されいてるので確認します。

freshclam からファイルへのアクセス許可されるように設定します。
下記フォーマットのコマンドを探してください。
sealert -l xxxx

vim を閉じた後、探したコマンドを実行します。
SELinux関連コマンドを実行する前にフォルダを作成します。

sh
$ mkdir SELinux
$ cd SELinux
$ sealert -l xxxx

ログを確認したところ、下記コマンドを実行する必要があります。

sh
sudo ausearch -c 'freshclam' --raw | audit2allow -M my-freshclam
sudo semodule -X 300 -i my-freshclam.pp

再度clamav-freshclamを動作させてみます。

sh
$ sudo systemctl start clamav-freshclam  
$ sudo systemctl status clamav-freshclam

まだエラーが発生していますね。
ログ(/var/log/messages)を見てエラーを修正します。
下記フォーマットのコマンドを探してください。
sealert -l xxxx

vim を閉じた後、探したコマンドを実行します。

確認したところ、下記コマンドを実行する必要があります。

sh
sudo ausearch -c 'freshclam' --raw | audit2allow -M my-freshclam
sudo semodule -X 300 -i my-freshclam.pp

再度clamav-freshclamを動作させてみます。

sh
$ sudo systemctl start clamav-freshclam  
$ sudo systemctl status clamav-freshclam

自動更新が動作しました。

freshclam のログもチェック!

OKですね。
SELinuxの設定は都度対処が必要なため煩雑です。
煩わしいので、SELinuxをOFFする方が楽ですが、セキュリティを下げてしまうのでお勧めできません。
めんどうでも、1つ1つ設定することが大切です。
(事業につかう場合は特に。。。ですよね)

Step5

ウィルススキャンの詳細な動作を決めていきます。

ウイルススキャンに利用するソフト

ClamAVは、clamscanと、clamdscanがあります。
シングルスレッド動作をするclamscanコマンドを採用します。
(ホストPC、VM同時にスキャンした時のことを考慮してシングルスレッド方式を採用。)

ウイルススキャンのスキャン周期

週1回、日曜日の午前4:13にスキャン開始する。

ウイルススキャン実行ユーザー

root
※推奨されていませんが、root以外アクセスできないファイルもスキャン対象なので。

ウイルススキャンの動作

除外ファイルを利用する。
ログに検索動作を記録する。
ウイルス検知したら、その旨をログに記載し、管理者にメール通知する。
※除外ファイル利用について
VMのディスク(仮想ディスク)をウイルススキャンすると警告が出るので、VMのディスクは象外にします。

Step6

ウイルススキャン対象外を指定するファイル「除外ファイル」を作成します。

sh
$ sudo mkdir /root/bin/
$ sudo vim /root/bin/scanvirus_exclude_list.txt

下記を記載します。

/root/bin/scanvirus_exclude_list.txt
/sys/
/proc/
/dev/
/var/lib/libvirt/images/

では、スキャン実行スクリプトを作成します。

sh
$ sudo vim /root/bin/scanvirus.sh

こちらが、スクリプト本体です。

/root/bin/scanvirus.sh
#!/usr/bin/sh
#   ClamAVによるウイルススキャンスクリプト scanvirus.sh
#     ウイルススキャンを実行し、ウイルスを検知したときのみ、指定した宛先にアラートメールを送信する。
#     誤検知もあり得るため、検知しても駆除(削除)は実施しない。
#
#     スキャンの実行前には、ClamAVプログラムおよびウイルス定義をアップデートする。
#
#     スキャンの除外対象ディレクトリ、ファイルは、${EXCLUDE_LIST_FILE}ファイルに1行ずつ記載すること。ディレクトリの末尾には、/ をつける。
#
EXCLUDE_LIST_FILE=/root/bin/scanvirus_exclude_list.txt
LOGFILE=/var/log/clamav/scanvirus.log
SCAN_RESULT=/var/log/clamav/scanresult.txt

MAX_FILESIZE=200M
MAX_SCANSIZE=200M
# メール通知
MAILTO='aaa@bbb.co.jp'
MAILFROM='aaa@bbb.co.jp'

export LANG=C

echo "===== Scan Virus =====" >> ${LOGFILE}
echo "`date` Scan Virus start" >> ${LOGFILE}

# 1. ClamAVプログラムのアップデート
echo "`date` Update ClamAV start" >> ${LOGFILE}

dnf -y --enablerepo=epel update clamav 1>> ${LOGFILE} 2>&1

echo "`date` Update ClamAV end" >> ${LOGFILE}

# 2. ウイルススキャンの実施
echo "`date` Do Scan Virus start" >> ${LOGFILE}

## スキャン除外リストの展開
while read LINE
do
    if [ $(echo "${LINE}"|grep \/$) ]; then
        i=`echo ${LINE}|sed -e 's/^\([^ ]*\)\/$/\1/p' -e d`
        excludeopt="${excludeopt} --exclude-dir=^${LINE}"
    else
        excludeopt="${excludeopt} --exclude=^${LINE}"
    fi
done < ${EXCLUDE_LIST_FILE}

echo "excludeopt: ${excludeopt}" >> ${LOGFILE}

## ウイルススキャンの実行
/usr/bin/clamscan \
--max-filesize=${MAX_FILESIZE} --max-scansize=${MAX_SCANSIZE} \
--infected --recursive ${excludeopt} / 1> ${SCAN_RESULT} 2>> ${LOGFILE}

## ウイルスを検知したときのみ、アラートメールで通知する
[ ! -z "$(grep FOUND$ ${SCAN_RESULT})" ] && \
cat ${SCAN_RESULT} | mail -s "Virus Found in `hostname`" -r ${MAILFROM}  ${MAILTO}

cat ${SCAN_RESULT} >> ${LOGFILE}

echo "`date` Do Scan Virus end" >> ${LOGFILE}

echo "`date` Scan Virus complete" >> ${LOGFILE}

※画像はほんの一部のみです。
※メール通知にある、MAILTO、MAILFROMへの設定は、適宜変更してくださいね。

Step7

メール通知を行うには、追加のツールと設定が必要になります。
スキャン実行スクリプトが使用している「mail」コマンドが動作するように追加、設定が必要なんです。

s-nail, postfix をインストールします。

sh
$ sudo dnf install s-nail postfix
sh
$ sudo systemctl enable postfix  
$ sudo systemctl start postfix  

メールサーバーのpostfixを設定します。

sh
$ sudo vim /etc/postfix/main.cf
/etc/postfix/main.cf
#変更箇所のみ表示  
myhostname = pleasanter

inet_interfaces = all
inet_protocols = ipv4
mydestination = $myhostname, localhost.$mydomain, localhost
mynetworks = 192.168.122.0/24, 127.0.0.0/8
relayhost = [smtp.gmail.com]:587
smtpd_banner = ESMTP MTA
# Postfix SMTPサーバの SASL 認証を有効
smtpd_sasl_auth_enable = yes
# SMTPサーバのアクセス制限設定
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
#メールのサイズを制限
message_size_limit = 10485760
# Gmailを使用する際のSASL認証設定
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_tls_security_options = noanonymous
smtp_sasl_mechanism_filter = plain

※mynetworks = 192.168.122.0/24, 127.0.0.0/8 の「192.168.100.0/24」については、会社環境など、ご自身の環境に併せて変更してください。

sh
$ sudo vim /etc/postfix/master.cf
/etc/postfix/master.cf
#変更箇所のみ表示
  -o smtpd_sasl_auth_enable=yes

Gmailへ転送するためGmailのアプリパスワードを設定・取得します。
Googleアカウント管理に進みます。

セキュリティをクリック。

検索まどに「アプリパスワード」を入力、「アプリ パスワード」をクリックします。

アプリ名に「AlmalinuxMail」を入力、「作成」をクリック。

パスワードが生成されるので、メモし、「完了」をクリック。

SALSをインストール、取得したアプリパスワードを設定していきます。

sh
$ sudo dnf install cyrus-sasl cyrus-sasl-plain

sasle_passwdファイルにアプリパスワードを記載します。

sh
$ sudo vim /etc/postfix/sasl_passwd
/etc/postfix/sasl_passwd
[smtp.gmail.com]:587 アカウント名@gmail.com:<アプリパスワード>

作成したファイルを元に下記コマンドにてパスワードDBを作成します。

sh
$ sudo chmod 640 /etc/postfix/sasl_passwd
$ sudo postmap hash:/etc/postfix/sasl_passwd

postfix の設定チェックを実施します。

sh
$ sudo postfix check

エラーなど出ませんでしたね。
postfix を再起動します。

sh
$ sudo systemctl restart postfix
$ sudo systemctl status postfix

確認のため、管理者のメールアドレス=Gmailにメールしてみましょう。

sh
$ echo "testmessage" | mail -s "TEST" "メールアドレス=Gmail"

まずは、メール転送したかチェックします。

sh
$ sudo vim -R /var/log/maillog

赤枠の部分が、メール転送部分のログです。

さぁ、Gmailに届いているかチェックします。

届いていましたね。

Step8

スキャンスクリプトの実行と、定期実行設定を行います。

スキャンスクリプトに実行権を付けます。

sh
$ sudo chmod u+x /root/bin/scanvirus.sh

では、一度スクリプトスクリプトを動かしてみます。

sh
$ sudo su -  
$ /root/bin/scanvirus.sh

※スクリプト実行終了後、Ctrlキー+Dキーを押して、rootからログアウトするか、「exit」コマンドを実行してrootからログアウトしてください。

それぞれのログをチェックしてみます。

sh
$ sudo vim -R /var/log/clamav/scanvirus.log 
$ sudo vim -R /var/log/clamav/scanresult.txt

動作確認はできましたが、メール通知の確認ができていません。
ダミーのウイルスファイルを設置して、確認する方法もありますが気が進みませんので、通知部分のコマンドだけ実行するスクリプトを作成、実施することにします。

通知部分確認スクリプトを作成します。

sh
$ sudo vim /root/bin/chefckAlerts.sh
/root/bin/checkAlerts.sh
#!/usr/bin/sh
LOGFILE=/var/log/clamav/scanvirus.log
SCAN_RESULT=/var/log/clamav/scanresult.txt
# メール通知
MAILTO='aaa@bbb.co.jp'
MAILFROM='aaa@bbb.co.jp'

export LANG=C
## ウイルスを検知したときのみ、アラートメールで通知する
cat ${SCAN_RESULT} | mail -s "Virus Found in `hostname`" -r ${MAILFROM}  ${MAILTO}

※メール通知にある、MAILTO、MAILFROMへの設定は、適宜変更してくださいね。

通知部分確認スクリプトに実行権を付け、実行します。

sh
$ sudo chmod u+x /root/bin/checkAlerts.sh
sh
$ sudo /root/bin/checkAlerts.sh

メールログをチェックします。

sh
$ sudo vim -R /var/log/maillog

確認ができましたので、週1回動作させるための設定をします。
定期実行には、crontab を用います。
実行タイミング:毎週 日曜 4:13(午後じゃないです午前です)

下記コマンドにて設定する。

sh
$ sudo su -
$ crontab -e
crontab
13 4 * * sun /root/bin/scanvirus.sh

設定確認です。

sh
$ crontab -l

これで、設定は終わりです。
実際に設定した日曜に、動作したかチェックするのを忘れないでください。
手動実行は動作するのに、crontab では実行できなかった。。。ということがありますので、確認は大切です。

スキャンスクリプトは、下記サイトを参考にしました。
参考URL

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA