オープンソースのウイルス対策ソフトの実装

# はじめに
[CYBIRD Advent Calendar 2024](https://qiita.com/advent-calendar/2024/cybird)

6日担当の@cy_yusuke_itoです
ゲームや商用コンテンツのインフラ基盤の構築や保守といったことをしています。
5日は、[@kanacha](https://qiita.com/kanacha)さんの[unity1week「ちゅう」の参加記録](https://qiita.com/kanacha/private/afc8124135bcc5613970)でしたね。

# 導入契機について
最近、クレジットカード会社よりセキュリティに関して、ウイルス対策ソフトの導入が必須との通達が来ました。
ウイルスソフトといえば、トレンドマイクロやNortonといった有償のものもありますが、オープンソースでもないのかということで検索したところ、ウイルス対策ソフト：ClamAVなるものがありました。
オープンソースということで入れてみようとなり、導入と検証を行いました。
導入のための手順やサーバー側の必要スペックなどを記載していきます。

# ClamAVとは
オープンソースのアンチウイルスソフトウェアで、特にメールサーバーやファイルサーバーでのマルウェア検出に使用されます。
- ウイルスやトロイの木馬、フィッシング攻撃、その他のマルウェアを検出可能
- Linux、Windows、macOSなどのさまざまなオペレーティングシステムで使用可能
- ウイルス定義ファイルの自動更新機能

# サーバースペック
## 1. 今回実装したサーバーのスペック
今回の対象サーバでのスペックでは動きますが、ギリギリなので非推奨です。
※リアルタイムスキャンも動かない状態です。。。。。。
CPU 　　　：1CPU(1.6GHz)
メモリ　　：2GB
ディスク　：20GB

## 2. 推奨サーバーのスペック
本来は以下のスペックが推奨で、メモリを1.5GBはClamAVで使用するため、他ソフトウェアとの兼ね合いもありますので4GBは欲しいところです。
※リアルタイムスキャンを実装する場合はよりメモリを実装すべきです。
CPU 　　　：1CPU(2.4GHz)
メモリ　　：4GB以上
ディスク　：20GB以上

# 実装手順
## 1. epelの有効化
以下のコマンドを使用してepelをインストール・有効化していきます。 
```
 #インストールされているかの確認
 yum repolist all | grep -i epel 
 
 #インストールされて無い時は以下でインストール
 yum install epel-release
 
 #epelを有効化する
 yum-config-manager --enable epel 
```

確認コマンドで、以下のように有効になっていればOKです。 
```
[root@hogehoge ~]# yum repolist all | grep -i epel
 * epel: d2lzkl7pfhq30w.cloudfront.net
epel/x86_64                         Extra Packages for Enterprise L 有効: 13,791
epel-debuginfo/x86_64               Extra Packages for Enterprise L 無効
epel-source/x86_64                  Extra Packages for Enterprise L 無効
epel-testing/x86_64                 Extra Packages for Enterprise L 無効
epel-testing-debuginfo/x86_64       Extra Packages for Enterprise L 無効
epel-testing-source/x86_64          Extra Packages for Enterprise L 無効
```
## 2. ClamAVのセットアップ
1. ClamAVをインストール
   ```
   yum install clamav clamav-update clamd
   ```
2. ウイルス定義データベースを作成
   ```
   freshclam
   ```
3. 各種コンフィグを設定
ここでは基本的なものを記載していくので、より詳しくは検索して調べてください。

- ウイルス定義DB設定ファイル：/etc/freshclam.conf
  | 構文 | 内容 |
  | --- | --- |
  | #Example | コメントアウトされてない場合はコメントアウト(デフォルトではコメントアウト) |
  | UpdateLogFile /var/log/freshclam.log | ログファイル指定 |
  | LogFileMaxSize 2M | ログファイルの最大サイズ指定 |
  | LogTime yes | ログに時間を記載 |
  |LogRotate yes  |ログローテーションの指定  |
  |NotifyClamd /etc/clamd.d/scan.conf  |ウイルス定義に更新があった場合の通知先  |

- ウイルス定義DBのアップデート設定ファイル：
スケジュールは、cronと同じ記述内容で設定できます。
※設定内容の確認、記載がない場合は設定する。
 ```/etc/cron.d/clamav-update
 ## Adjust this line...
 MAILTO=root
 
 ## It is ok to execute it as root; freshclam drops privileges and becomes
 ## user 'clamupdate' as soon as possible
 0  1 * * * root /usr/share/clamav/freshclam-sleep
 ```
- ウイルススキャン設定ファイル：/etc/clamd.d/scan.conf
代表的な個所の記載です。もう少し細かな設定はできますが省略します。

| 構文 | 内容 |
| --- | --- |
| #Example | コメントアウトされてない場合はコメントアウト<br>(デフォルトではコメントアウト) |
| LogFile /var/log/clamd.scan | ログファイル指定 |
| LogFileUnlock yes | ログファイルのロックを解除 |
| LogFileMaxSize 2M | ログファイルの最大サイズ指定 |
| LogTime yes | ログに時間を記載 |
| LogRotate yes | ログローテーションの指定 |
| LocalSocket /run/clamd.scan/clamd.sock | デーモンがリッスンするローカル ソケット ファイルへのパスの指定 |
| FixStaleSocket yes | 予定外シャットダウン時のソケット削除設定 |
| ExcludePath ^/proc/ | スキャン対象外ディレクトリの指定：システムディレクトリのため |
| ExcludePath ^/sys/ | スキャン対象外ディレクトリの指定：システムディレクトリのため |
| ExcludePath ^/dev/ | スキャン対象外ディレクトリの指定：システムディレクトリのため |
| User root | スキャン実行ユーザーの指定 |
## 3. サービスの使用リソースの制限をかける
今回、実装したサーバーはリソースが小さいため使用率を制限しました。
本来は制限をかけない方がよく、メモリを制限した場合はSWAP領域を頻繁に使用することになるためCPU高騰の原因になります。
今回は、以下を追記しました。
```/usr/lib/systemd/system/clamd@.service
[Unit]
Description = clamd scanner (%i) daemon
Documentation=man:clamd(8) man:clamd.conf(5) https://www.clamav.net/documents/
After = syslog.target nss-lookup.target network.target

[Service]
Type = forking
ExecStart = /usr/sbin/clamd -c /etc/clamd.d/%i.conf
# Reload the database
ExecReload=/bin/kill -USR2 $MAINPID
Restart = on-failure
TimeoutStartSec=420

#以下を追記する
MemoryLimit：512M　#メモリ使用量を512MBに設定
CPUQuota：35%　　　#CPU使用量を35%に設定

[Install]
WantedBy = multi-user.target
```
保存したら以下のコマンドで、リロードをしてください。
```
systemctl daemon-reload
```

## 4. サービスの開始とスキャンスケジュールの設定
ClamAV自体の設定が完了したら、サービスの起動とLinux自体のcron設定を行います。
cron設定を行うことでスケジューリングされたフルスキャンを実施ができます。

### 4-1. 自動起動の設定
```
systemctl enable clamd@scan
```
### 4-2. サービス起動
```
systemctl start clamd@scan
```
### 4-3. cronでフルスキャンのスケジュール設定を行う
今回は月1回のフルスキャンでしたので、毎月第2月曜日に実施する用に設定しました。
```
crontab -e 0 3 8-14 * * [ "$(date +\%u)" = "1" ] && clamdscan -c /etc/clamd.d/scan.conf --fdpass -l /var/log/clamd.scan /
```

# まとめ
今回は基本的なインストール方法と設定方法、cron設定について記載しました。
リアルタイムスキャンもできるようではありますが、その場合だと今回インストールしたサーバースペックでは到底足りません。
検証出来たら、この記事に追記していきたいと思います。

# 最後に
明日は、[@shiso_c](https://qiita.com/shiso_c)さんの[Unity1Weekで使う時短のためのあれこれ](https://qiita.com/shiso_c/private/42a545c4d8d93f73c30a)です。
お楽しみに！