www.smiyasaka.com は、 2022 年 11月から Oracle LInux 8.X にOSを変更しました。

ウィルススキャンを定期的に実行させるためのスクリプトの作成



先人の知恵を借りて私なりに変更やコメントを入れてみました。
遊び心で処理時間の表示機能を入れてみました。

① ウィルススキャン実行スクリプト作成


   vi virusscan.sh    
<---- 適当なディレクトリーで実行

下記は、コメント・処理時間表示を削除したスクリプト( ほぼ先人のオリジナルです。)

#!/bin/bash
#
PATH=/usr/bin:/bin

excludelist=/root/clamscan.exclude

if [ -s ${excludelist} ]; then
    for i in `cat ${excludelist}`
    do
      if [ $(echo "${i}"|grep \/$) ]; then
          ii=`echo ${i}|sed -e 's/^\([^ ]*\)\/$/\1/'`
         excludeopt="${excludeopt} --exclude-dir=^${ii}"
      else
         excludeopt="${excludeopt} --exclude=^${i}"
      fi
    done
fi

CLAMSCANTMP=`mktemp`
clamscan --recursive --remove ${excludeopt} / > ${CLAMSCANTMP} /dev/null 2>&1

  if [ ! -z "$(grep FOUND$ ${CLAMSCANTMP})" ];
    then
      grep FOUND$ ${CLAMSCANTMP} | mail -s "*** Virus Found ***" root
    else
      echo "**** Clamscan normal END ****"\
      | mail -s "*** Virus Not Found ***" root
  fi

rm -f ${CLAMSCANTMP}

下記は、コメント・処理時間表示をいれたスクリプト チョットごちゃごちゃしています。
(説明文をたくさん入れていますので、シェルスクリプトが苦手な方には、勉強になると 思います。)
青文字の部分は、処理時間表示の為、追加・変更した箇所です。更に root 宛メールの 出力をまとめて一箇所にとウィルス感染数の表示をする様に変更を加えました。

#!/bin/bash
# clamscanのパス設定
PATH=/usr/bin:/bin

START_Messge=" 開始時間 `date +"%k時%M分%S秒"`"
START_TIME=`date +%s` # 秒で開始時刻を取得(計算用データ)


# 除外ファイル・ディレクトリーの文字列作成
# "--exclude=^/var/www/backup/www_bak --exclude-dir=^/proc" の様な文字列作成
# 変数名の { } は、分かり易くするために入れています。

excludelist=/root/clamscan.exclude

if [ -s ${excludelist} ]; then
  for i in `cat ${excludelist}`
<---- 一行毎取り出す。結果は、変数 ${i} に書込まれる。
  do
    if [ $(echo "$i"|grep \/$) ]; then # 行末に "/" があるか?

     # -n を付けなくとも string の文字列長が 0 より大ならば「真」となり
     # 実行されます。if [ -n $(echo "$i"|grep \/$) ]と同じです。
     # 削除対象 ディレクトリー 末尾の / を削除する処理
     # ^\([^ ]*\) スペース以外の先頭文字からを \1 に代入する
     # \/$ で末尾の / を削除して \1 に代入する
     # オリジナル i=`echo $i|sed -e 's/^\([^ ]*\)\/$/\1/p' -e d`

     ii=`echo ${i}|sed -e 's/^\([^ ]*\)\/$/\1/'`
     excludeopt="${excludeopt} --exclude-dir=^${ii}"
    else
         # 削除対象 特定ファイル
         excludeopt="${excludeopt} --exclude=^$i"
    fi
  done
fi

# mktemp (適当なファイル名の空ファイルを作成するコマンド)

CLAMSCANTMP=`mktemp` # ウイルスに関するメッセージを入れる変数作成

# システム全体をサブディレクトリごと再帰的(--recursive)にスキャンし ウィルスを発
# 見次第削除(--remove)する
# --recursive ディレクトリ内に存在するものに一つ一つに対して処理をする
# スキャンサイズの設定 --max-filesize=200M --max-scansize=200M

/usr/bin/clamscan --max-filesize=200M --max-scansize=200M \
--recursive --remove ${excludeopt} / > ${CLAMSCANTMP}

#   ウィルスが発見された場合、FOUNDの文字列が付加される
#   FOUNDの文字列があるかのチェックをする

  M_swith=0 # 処理結果メッセージ切替スイッチ OFF
  Virus_FOUND="\n" # 初期値ウィルスなしメッセージにする

  if [ ! -z "$(grep FOUND$ ${CLAMSCANTMP})" ]; then
   # ウィルスに感染したファイル名を変数 Virus_FOUND に出力

   Virus_FOUND=$(grep FOUND$ ${CLAMSCANTMP})
<---- 行の終わりに FOUND の文字列のある行を取得

   # ウィルスに感染したファイルの個数の表示メッセージ行を取得
   Virus_FOUND_No=$(grep Infected ${CLAMSCANTMP})
<---- ウィルスに感染したファイルの個数の表示メッセージ行を取得

   M_swith=1 # 処理結果メッセージ切替スイッチ ON
  fi

rm -f ${CLAMSCANTMP} # -f 作成したファイル CLAMSCANTMP を確認なしで削除する

END_Messge=" 終了時間 `date +"%k時%M分%S秒"`"
#---------------------------------------------------------
END_TIME=`date +%s` # 秒で終了時刻を取得(計算用データ)

# 処理時間計算とその結果をメール本文として出力

SS=`expr ${END_TIME} - ${START_TIME}` # 経過時間を求める(秒)
# 時を求める時には、3600で割る
MM=`expr ${SS} / 60` # 分を求める
SS=`expr ${SS} % 60` # 秒を求める (1分で割ったあまり)

SYORI_Messge=" 処理時間 ${MM}分 ${SS}秒"

# 処理結果メッセージ切替スイッチ判定

if [ $M_swith -eq 1 ]; then
   # ウィルスの感染数のみを取得する
   i_CNT=`echo ${Virus_FOUND_No}|sed -e 's/Infected files://'`  
<---- ウィルスの感染数のみを取得する

   KETUKA__Messge=" *** Clamscan ${i_CNT} Virus Found ***\n"  
<---- ウィルスの感染数を付加する
else
   KETUKA__Messge=" *** Clamscan normal END ****"
fi

# 処理時間計算をメール本文として出力
# 開始時間 + 終了時間 + 処理時間 + 処理結果メッセージ + ウィルスに感染したファイル名 をメール本文として合成し出力

echo -e "${ START_Messge }\n${ END_Messge }\n${ SYORI_Messge }\n${ KETUKA__Messge }\n\
${ Virus_FOUND }" | mail -s "***}\n$ SYORI_KETSUKA_REPORT *** " root

② ウィルススキャン実行スクリプトへ実行権限付加とテスト

   chmod +x virusscan.sh >   
<---- 実行権限を有効にします。

ウィルススキャンの実行テストをする時には、
clamscan --recursive --remove ${excludeopt}
/ > ………
/ を削除して行うと短時間で終了します。

③ 削除対象ファイルとディレクトリーの設定例

   echo "/var/www/backup/www_bak" >> clamscan.exclude
<--- ファイル www_bak をスキャン対象外にする

   echo "/home/miyasaka/www/" >> clamscan.exclude  
<--- ディレクトリ www をスキャン対象外にする
   echo "/var/www/system/" >> clamscan.exclude


   ※※ ディレクトリを除外する場合は末尾に「/」を付加すること

④ clamdscanの定期自動実行設定

   一般的には、毎日実行させるので 下記の様に /etc/cron.daily に保存します。

   mv virusscan.sh /etc/cron.daily/

これで、毎日定期的に全ファイルのウィルススキャンが行われ、
   ウィルスを検知した場合は、 *** Virus Found ***
   ウィルスを未検知した場合は、*** Virus Not Found ***
が root 宛にメールとして送られてくるようになります。
しかし、cron.daily では、4時前後にウィルススキャンが行われるので Logwatch のレポート作成時間に間に合わず翌日のレポートとして報告されてしまうことが度々あ るので、私のサーバ機では、cron で 2時30分に実行するように設定し直しました。
しかし、スキャンの時間がかなりかかる為、時々、Logwatch の処理時間にかかってしま うという現象が出た為、現在では、2時5分にしています。


⑤ root 宛メールの表示例( 実際に私のサーバ機で表示した内容です。)

  
apr-util-1.5.4.tar.gz は、故意に保存・スキャンさせています。

   ※  Logwatch の出力結果です  ※

   From root@○○○○ Sat Feb 10 02:31:55 2018
      (途中省略)

   Date: Sat, 10 Feb 2018 02:31:54 +0900
   To: root@○○○○
   Subject: *** SYORI_KETSUKA_REPORT ***
   User-Agent: Heirloom mailx 12.5 7/5/10
   MIME-Version: 1.0
   Content-Type: text/plain; charset=utf-8
   Content-Transfer-Encoding: 8bit

   開始時間 2時05分01秒
   終了時間 2時31分54秒
   処理時間 26分 53秒
   *** Clamscan 2 Virus Found ***

   /home/miyasaka/x86_64-src2/apr-util-1.5.4.tar.gz: Xml.Exploit.CVE_……
   /usr/local/src/apr-util-1.5.4.tar.gz: Xml.Exploit.CVE_2013_3860-3 FOUND


^