Ubuntu 18.04 LTS DesktopでClamAVによるウィルスチェックを実行

Ubuntu 18.04 LTS DesktopでClamAVを使用してウィルスチェックを実行します。Ubuntu等のLinux環境では、現状ではウィルスチェックは不要との見解が多いですが、Windowsとの混在環境で、ウィルスをWindowsに中継することを防止するために使用されることが多いようです。

使用した環境

  • Ubuntu 18.04 LTS Desktop (18.04.1)

テスト用ウィルスのダウンロード

ウィルスチェックのテストのためにテスト用のウィルスを「EICAR – European Institute for Computer Anti-Virus Research」からダウンロードします。例えば、~/Downloads/eicarなどのフォルダに保管しておきます。

  • eicar.com : テスト用ウィルスファイル
  • eicar.com.txt : eicar.comの拡張子を変えた別名ファイル
  • eicar_com.zip : eicar.comをzip化したファイル
  • eicarcom2.zip : eicar_com.zipをさらにzip化したファイル

ClamAVをaptコマンドでインストール

ClamAVをaptコマンドでインストールします。

$ sudo apt install clamav clamav-daemon

マシンを再起動後にサービスが自動起動することを確認します。

$ systemctl list-unit-files | grep clamav
clamav-daemon.service                      enabled        
clamav-freshclam.service                   enabled  

設定ファイルの内容を修正します。以下、実行ユーザをrootに変更、リアルタイムスキャンを有効、スキャン対象のファイルサイズの制限を無限大に設定しています。

$ vi /etc/clamav/clamd.conf
#Automatically Generated by clamav-daemon postinst
#To reconfigure clamd run #dpkg-reconfigure clamav-daemon
#Please read /usr/share/doc/clamav-daemon/README.Debian.gz for details
LocalSocket /var/run/clamav/clamd.ctl
FixStaleSocket true
#LocalSocketGroup clamav
LocalSocketGroup root
LocalSocketMode 666
# TemporaryDirectory is not set to its default /tmp here to make overriding
# the default with environment variables TMPDIR/TMP/TEMP possible
#User clamav
User root
ScanMail true
ScanArchive true
ArchiveBlockEncrypted false
MaxDirectoryRecursion 15
FollowDirectorySymlinks false
FollowFileSymlinks false
ReadTimeout 180
MaxThreads 12
MaxConnectionQueueLength 15
LogSyslog false
LogRotate true
LogFacility LOG_LOCAL6
LogClean false
LogVerbose false
PreludeEnable no
PreludeAnalyzerName ClamAV
DatabaseDirectory /var/lib/clamav
OfficialDatabaseOnly false
SelfCheck 3600
Foreground false
Debug false
ScanPE true
MaxEmbeddedPE 10M
ScanOLE2 true
ScanPDF true
ScanHTML true
MaxHTMLNormalize 10M
MaxHTMLNoTags 2M
MaxScriptNormalize 5M
MaxZipTypeRcg 1M
ScanSWF true
DetectBrokenExecutables false
ExitOnOOM false
LeaveTemporaryFiles false
AlgorithmicDetection true
ScanELF true
IdleTimeout 30
CrossFilesystems true
PhishingSignatures true
PhishingScanURLs true
PhishingAlwaysBlockSSLMismatch false
PhishingAlwaysBlockCloak false
PartitionIntersection false
DetectPUA false
ScanPartialMessages false
HeuristicScanPrecedence false
StructuredDataDetection false
CommandReadTimeout 5
SendBufTimeout 200
MaxQueue 100
ExtendedDetectionInfo true
OLE2BlockMacros false
#ScanOnAccess false
ScanOnAccess true
OnAccessMountPath /
OnAccessPrevention false
OnAccessExtraScanning true
OnAccessExcludeUID 0
VirusEvent /home/admin001/bin/notify_viruscheck.sh
AllowAllMatchScan true
ForceToDisk false
DisableCertCheck false
DisableCache false
#MaxScanSize 100M
MaxScanSize 0
#MaxFileSize 25M
MaxFileSize 0
MaxRecursion 16
MaxFiles 10000
MaxPartitions 50
MaxIconsPE 100
PCREMatchLimit 10000
PCRERecMatchLimit 5000
PCREMaxFileSize 25M
ScanXMLDOCS true
ScanHWP3 true
MaxRecHWP3 16
StreamMaxLength 25M
LogFile /var/log/clamav/clamav.log
LogTime true
LogFileUnlock false
LogFileMaxSize 0
Bytecode true
BytecodeSecurity TrustSigned
BytecodeTimeout 60000

VirusEventに指定したデスクトップへの通知用のシェルは、以下のようにしてみました。以下、「1000」については、通知するユーザのIDを指定します。

$ cat /home/admin001/bin/notify_viruscheck.sh
#!/bin/bash

DATESTR=`date`
sudo -u admin001 DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus /usr/bin/notify-send "$DATESTR Virus Found $CLAM_VIRUSEVENT_VIRUSNAME" 

ウィルス定義の最新化

ウィルス定義を更新し最新化を行いますが、その前に更新のための定義の内容を確認しておきます。定義ファイルの確認が1日24回行われることがわかります。

$ more /etc/clamav/freshclam.conf 
# Automatically created by the clamav-freshclam postinst
# Comments will get lost when you reconfigure the clamav-freshclam package

DatabaseOwner clamav
UpdateLogFile /var/log/clamav/freshclam.log
LogVerbose false
LogSyslog false
LogFacility LOG_LOCAL6
LogFileMaxSize 0
LogRotate true
LogTime true
Foreground false
Debug false
MaxAttempts 5
DatabaseDirectory /var/lib/clamav
DNSDatabaseInfo current.cvd.clamav.net
ConnectTimeout 30
ReceiveTimeout 30
TestDatabases yes
ScriptedUpdates yes
CompressLocalDatabase no
SafeBrowsing false
Bytecode true
NotifyClamd /etc/clamav/clamd.conf
# Check for new database 24 times a day
Checks 24
DatabaseMirror db.local.clamav.net
DatabaseMirror database.clamav.net

1時間を過ぎたら、ログファイルで自動更新が動作しているか確認します。

$ cat /var/log/clamav/freshclam.log

AppArmorによる制限を解除します。

$ sudo apt install apparmor-utils
...
$ sudo aa-complain clamd
Setting /usr/sbin/clamd to complain mode.

ClamAVのdaemonを起動します。

$ sudo systemctl start clamav-daemon
$ sudo systemctl status clamav-daemon

定義ファイルを小苦心する常駐プロセスの起動状態を確認し、起動している場合は停止します。

$ sudo systemctl status clamav-freshclam
$ sudo systemctl stop clamav-freshclam

手動で更新を行います。

$ sudo freshclam 

定義ファイル更新の常駐プロセスを起動し直します。

$ sudo systemctl stop clamav-freshclam
$ sudo systemctl status clamav-freshclam

ウィルスチェックの実行

ウィルスチェックを実行します。

ウィルスチェックの実行(clamscan)

clamscanコマンドを使用してウィルスチェックを実行した場合の例です。サブディレクトリも検索(-r)し、ウィルス検知したファイルのみ表示(-i)するオプションを指定しました。検疫対象ディレクトリは、eicarをダウンロードしたフォルダを指定してみました。

$ sudo clamscan -r -i ~/Downloads/eicar
/home/admin001/Downloads/eicar/eicar.com.txt: Eicar-Test-Signature FOUND
/home/admin001/Downloads/eicar/eicar.com: Eicar-Test-Signature FOUND
/home/admin001/Downloads/eicar/eicar_com.zip: Eicar-Test-Signature FOUND
/home/admin001/Downloads/eicar/eicarcom2.zip: Eicar-Test-Signature FOUND

----------- SCAN SUMMARY -----------
Known viruses: 6638863
Engine version: 0.100.1
Scanned directories: 1
Scanned files: 4
Infected files: 4
Data scanned: 0.00 MB
Data read: 0.00 MB (ratio 0.00:1)
Time: 20.483 sec (0 m 20 s)

ウィルスチェックの実行(clamdscan)

clamsdcanコマンドを使用してウィルスチェックを実行した場合の例です。こちらは、clamav-deamonを使用していますが、clamscanと比較して圧倒的に速いです。というよりは、clamscanが遅すぎです。

$ clamdscan ~/Downloads/eicar/
/home/admin001/Downloads/eicar/eicar.com: Eicar-Test-Signature FOUND
/home/admin001/Downloads/eicar/eicar.com.txt: Eicar-Test-Signature FOUND
/home/admin001/Downloads/eicar/eicar_com.zip: Eicar-Test-Signature FOUND
/home/admin001/Downloads/eicar/eicarcom2.zip: Eicar-Test-Signature FOUND

----------- SCAN SUMMARY -----------
Infected files: 4
Time: 0.012 sec (0 m 0 s)

詳細なログは、以下に出力されます。

$ cat /var/log/clamav/clamav.log
...
Sat Sep  8 21:20:06 2018 -> /home/admin001/Downloads/eicar/eicar.com: Eicar-Test-Signature(44d88612fea8a8f36de82e1278abb02f:68) FOUND
Sat Sep  8 21:20:06 2018 -> /home/admin001/Downloads/eicar/eicar.com.txt: Eicar-Test-Signature(44d88612fea8a8f36de82e1278abb02f:68) FOUND
Sat Sep  8 21:20:06 2018 -> /home/admin001/Downloads/eicar/eicar_com.zip: Eicar-Test-Signature(44d88612fea8a8f36de82e1278abb02f:68) FOUND
Sat Sep  8 21:20:06 2018 -> /home/admin001/Downloads/eicar/eicarcom2.zip: Eicar-Test-Signature(44d88612fea8a8f36de82e1278abb02f:68) FOUND

デスクトップにも「Virus Found」のメッセージが通知されるはずなので、確認しましょう。

オンスキャンの確認

オンスキャン(リアルタイムスキャン)が有効であるか確認します。以下のように表示されればOKです!

$ cat ~/Downloads/eicar/eicar.com
$ tail /var/log/clamav/clamav.log
...
Sat Sep  8 22:45:03 2018 -> ScanOnAccess: /home/admin001/Downloads/eicar/eicar.com: Eicar-Test-Signature(44d88612fea8a8f36de82e1278abb02f:68) FOUND

しかし、何故かVirusEventで指定したシェルが起動せず、以下で代替しました。(毎分10秒検知した回数がデスクトップに通知されます。)
<シェル>

$ cat /home/admin001/bin/notify_viruscheck_cron.sh
#!/bin/bash

CNT=`grep ScanOnAccess /var/log/clamav/clamav.log | grep FOUND | wc -l`
if [ $CNT != 0 ]; then
  DATESTR=`date`
  sudo -u admin001 DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus /usr/bin/notify-send -t 10000 "$DATESTR Virus Found $CNT"
fi

<cronの設定>

$ crontab -l
* * * * * DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus /home/admin001/bin/notify_viruscheck_cron.sh

GUIでウィルスチェックを実行

GUIでウィルスチェックを行うインターフェースもあります。こちらは、clamscanのフロントエンドのようで実行には時間がかかります。

clamtkをaptコマンドでインストール

clamtkをaptコマンドでインストールします。

$ sudo apt install clamtk

clamtkを使用してウィルスチェックを実行

clamtkを起動します。

「Settingsのアイコン」をダブルクリックして、以下のように設定します。「Potentially Unwanted Application (PUA)」のチェックは行わない例です。

元の画面で「Scan a directory」のアイコンをダブルクリックし、ディレクトリを指定してスキャンを行うと、以下のようにウィルスを検知します。

おわりに

Ubuntu 18.04 LTS DesktopにClamAVをインストールして、ウィルスチェックを行いました。cramscan、cramtkによるウィルスチェックは遅すぎるので、cramdscanの設定は必須と思います。Windowsのパソコンと同じようにリアルタイムスキャンも問題なく行うことができます。

参考