オープンソースのアンチウイルスソフトウェア、ClamAVをCentOS 7にインストールする

# TL;DR
* CentOSにClamAVをインストールしたい
* EPELからインストールするのが簡単
* `clamd`および`freshclam`の設定をする
* `clamdscan`を定期的に実行できるようにする


# ClamAV

ClamAVは、オープンソースのアンチウイルスソフトウェアです。

[ClamAV](https://www.clamav.net/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309669/682f79b1-eee8-b11e-2b20-9284f6d74fd0.png)

スタンダードだよ（メールのスキャンで）、みたないことを言っています。

> ClamAV® is the open source standard for mail gateway scanning software.

ClamAVの機能は、こちら。

[About](https://www.clamav.net/about)

* Command-line scanner
* Milter interface for sendmail
* Advanced database updater with support for scripted updates and digital signatures
* Virus database updated multiple times per day
* Built-in support for all standard mail file formats
* Built-in support for various archive formats, including Zip, RAR, Dmg, Tar, Gzip, Bzip2, OLE2, Cabinet, CHM, BinHex, SIS and others
* Built-in support for ELF executables and Portable Executable files packed with UPX, FSG, Petite, NsPack, wwpack32, MEW, Upack and obfuscated with SUE, Y0da Cryptor and others
* Built-in support for popular document formats including MS Office and MacOffice files, HTML, Flash, RTF and PDF

コマンドラインのスキャナーがあり、ウイルス定義データベースのアップデートが可能だったり、多くのファイルフォーマットをサポートしている、という感じです。


# 環境

インストール先のCentOSのバージョンは、こちらです。

`/etc/redhat-release`

```shell
CentOS Linux release 7.6.1810 (Core)
```

今回利用するClamAVのバージョンは、`0.101.4`です。


# インストール

CentOSへのインストール手順はあるのですが、ソースコードからのコンパイルからになります。

[Installation on Redhat and CentOS Linux Distributions](https://www.clamav.net/documents/installation-on-redhat-and-centos-linux-distributions)

EPELを使用した導入方法も書かれているので、今回はこちらを使いましょう。

[Fedora & EPEL](https://www.clamav.net/downloads#collapseFedora)


## EPELを有効にする

今回のClamAVは

```shell
$ sudo yum install epel-release
```

## 必要なパッケージをインストールする

以下のコマンドで、必要なパッケージをインストールします。

```shell
$ sudo yum install clamav clamav-update clamd
```

各パッケージに含まれている役割は以下に書かれています。

[Usage](https://www.clamav.net/documents/usage)


### `clamd`

ファイルに対するウイルススキャンの機能を提供するDaemonで、他のツールと連動して動作します。


### `clamdscan`

スキャンクライアントで、`clamd`と連動して動作します。

### `on-access scanning`

リアルタイムプロテクション機能を`clamd`に提供します（オンアクセススキャン）。

こちらは、参考程度に。


### `freshclam`

ClamAVのウイルス定義データベースのダウンロード、更新を行います。

[freshclam](https://www.clamav.net/documents/signature-testing-and-management#freshclam)



## `freshclam`の設定とウイルス定義データベースの初回作成

`freshclam`を使用して、`clamd`が使用するウイルス定義データベースの初回作成を行います。これをやらないと、`clamd`が起動できません。

`freshclam`の設定ファイル、`/etc/freshclam.conf`を修正します。

ウイルス定義に更新があった場合の通知先となる、`clamd`の設定ファイルパスのコメントアウトを解除し、以下のように設定します。

```shell
NotifyClamd /etc/clamd.d/scan.conf
```

インターネットアクセスにプロキシサーバーが必要な場合は、以下を設定してください。

```shell
#HTTPProxyServer myproxy.com
#HTTPProxyPort 1234
```

以下のコマンドを実行すると、ウイルス定義ファイルをダウンロードしてきて、データベースを作成します。

```shell
$ sudo freshclam 
```

以降は、`/etc/cron.d/clamav-update`により`cron`で自動アップデートされます。

```shell
## user 'clamupdate' as soon as possible
0  */3 * * * root /usr/share/clamav/freshclam-sleep
```


## `clamd`の設定を行う

設定ファイル`/etc/clamd.d/scan.conf`を修正します。

このファイルに`Exapmle`と書かれたままだとちゃんと動作しないので、

```shell
# Comment or remove the line below.
Example
```

これをコメントアウトします。

```shell
# Comment or remove the line below.
#Example
```

また、TCPソケットもしくはUNIXドメインソケットを使ってサーバーを起動する必要があるので、今回はUNIXドメインソケットを使用します。

```shell
# Path to a local socket file the daemon will listen on.
# Default: disabled (must be specified by a user)
LocalSocket /var/run/clamd.scan/clamd.sock
```

また、実行ユーザーは`root`にしておきます。

```shell
User root
```

`/proc`や`/sys`はスキャン除外設定にしておくと良いでしょう（コメントアウトを解除すればOKです）。

```shell
ExcludePath ^/proc/
ExcludePath ^/sys/
```

`systemd`で`clamd@scan`を有効化して、`clamd@scan`を起動。

```shell
$ sudo systemctl enable clamd@scan
$ sudo systemctl start clamd@scan
```

SELinuxが有効な場合は、`antivirus_can_scan_system`を`on`にしておきます。

```shell
$ sudo setsebool -P antivirus_can_scan_system on
```

### 参考：オンアクセススキャンの設定

ClamAVでは、オンアクセススキャンを行うこともできます。

以下のドキュメントに沿って、`ScanOnAccess`、`OnAccessIncludePath`、`OnAccessPrevention`を設定します。

[On-Access Scanning](https://www.clamav.net/documents/on-access-scanning)

**`clamd`だけでは、スキャンは行われません。**

スキャンを行う、`clamdscan`の利用が必要です。  
※`clamscan`というコマンドで、`clamd`なしで実行もできますが、こちらは参考程度に

## 確認

スキャンは、`clamdscan`を使用して行います。

テスト用のウイルス入りファイルをダウンロードして、確認してみます。

```shell
$ cd /tmp

$ wget https://secure.eicar.org/eicar.com
$ wget https://secure.eicar.org/eicar.com.txt
$ wget https://secure.eicar.org/eicar_com.zip
$ wget https://secure.eicar.org/eicarcom2.zip
```


以下のように、`-c`で設定ファイルを指定し、`/`で全ディレクトリをスキャンしてみましょう。

```shell
$ sudo clamdscan -c /etc/clamd.d/scan.conf /
```

スキャン結果の中に、以下のような出力が含まれているはずです。

```
/tmp/eicar_com.zip: Eicar-Test-Signature FOUND
/tmp/eicar.com.txt: Eicar-Test-Signature FOUND
/tmp/eicar.com: Eicar-Test-Signature FOUND
/tmp/eicarcom2.zip: Eicar-Test-Signature FOUND
```

なお、実行にはけっこうリソースを使い、CPUひとつとメモリ1Gくらいを使ったりしてました…。

これを削除する場合は、`--remove`を付与して`clamdscan`を実行します。

```shell
$ sudo clamdscan -c /etc/clamd.d/scan.conf --remove /
```

検出されたファイルは、削除されます。

```
/tmp/eicar_com.zip: Eicar-Test-Signature FOUND
/tmp/eicar_com.zip: Removed.
/tmp/eicar.com.txt: Eicar-Test-Signature FOUND
/tmp/eicar.com.txt: Removed.
/tmp/eicar.com: Eicar-Test-Signature FOUND
/tmp/eicar.com: Removed.
/tmp/eicarcom2.zip: Eicar-Test-Signature FOUND
/tmp/eicarcom2.zip: Removed.
```

どこか別のディレクトリに退避する場合は、`--move`と退避先のディレクトリを指定して`clamdscan`を実行します。

```shell
$ sudo clamdscan -c /etc/clamd.d/scan.conf --move [検出したウイルスの退避先ディレクトリ] /
```

例えば、以下のようなディレクトリを作成して退避するようにする場合は…

```shell
$ mkdir /tmp/clamdscan-quarantinedir
```

設定ファイル`/etc/clamd.d/scan.conf`を修正して、退避先をスキャン対象外にして

```shell
ExcludePath ^/tmp/clamdscan-quarantinedir/
```

実行。

```shell
$ sudo clamdscan -c /etc/clamd.d/scan.conf --move /tmp/clamdscan-quarantinedir /
```

今度は、退避が行われます。

```
/tmp/eicarcom2.zip: Eicar-Test-Signature FOUND
/tmp/eicarcom2.zip: moved to '/tmp/clamdscan-quarantinedir/eicarcom2.zip'
/tmp/eicar.com: Eicar-Test-Signature FOUND
/tmp/eicar.com: moved to '/tmp/clamdscan-quarantinedir/eicar.com'
/tmp/eicar_com.zip: Eicar-Test-Signature FOUND
/tmp/eicar_com.zip: moved to '/tmp/clamdscan-quarantinedir/eicar_com.zip'
/tmp/eicar.com.txt: Eicar-Test-Signature FOUND
/tmp/eicar.com.txt: moved to '/tmp/clamdscan-quarantinedir/eicar.com.txt'
```


## 定期的にスキャンする

定期的にスキャンを行うには、`clamdscan`を`cron`で定期実行するように仕込めばOKです。

```shell
0 3 * * * clamdscan -c /etc/clamd.d/scan.conf --remove /
```

検出したファイルを退避する場合は、`--move`と組み合わせるとよいでしょう。


## `clamd`、`freshclam`のログ設定

`clamd`にも`freshclam`にも、ログ出力設定があります。デフォルトではsyslogを使うように構成されていますが、必要に応じて設定しましょう。

`clamd`の場合はこのあたりを

```shell
LogFile
LogFileMaxSize
LogTime
LogRotate
```

`freshclam`の場合は、このあたりを設定します。

```shell
UpdateLogFile
LogFileMaxSize
LogTime
LogRotate
```