CentOS8にClamAVをインストールする

ClamAVはClam AntiVirus、つまりウィルス対策ソフトです。(18禁のアレじゃないです)

オープンソースで、無料で使えるウィルス対策ソフトとなります。

Windowsなど他のプラットフォームを対象としたウィルスも検知できます。

主にメールの添付ファイルや共有ストレージなどにウィルスファイルが入り込んでクライアントPCに感染するのを防ぐために使われます。

例えば、RSPAMDと連携してメールの添付ファイルをチェックするといったことができます。

なおClamAVはメモリの使用量が多く、メモリの少ないサーバでの使用は難しいので注意してください。(単体で1GB以上使います)

この記事で行うこと

  1. ClamAVのインストール
  2. ClamAVの設定
    1. scan.conf の設定
    2. freshclam.conf の設定
  3. SELinuxの設定
  4. ウィルス検体データを更新する
  5. ClamAVを起動する
  6. ClamAVのテスト

1. ClamAVのインストール

ClamAVはEPELリポジトリからインストールできます。

EPELリポジトリは上記記事の3-1-1の例でインストールをしています

EPELリポジトリがインストールされていればdnfコマンドで簡単にインストールできます。

[root@localhost ~]# dnf install clamav clamd clamav-update

clamav はClamAVの本体、clamd はClamAVのスキャンを待ち受けするためのプログラム(デーモン)で、 clamav-update はClamAVのウィルス検体データ更新用のプログラムです。検体データの更新を行わないと新しいウィルスに対応が出来なくなってしまいます。

2.ClamAVの設定

ClamAVの設定は2つのファイルで行います。

1つは、 scan.conf でClamAV本体の設定です。もう片方は freshclam.conf で検体更新用プログラムの設定となります。

今回はこれらの設定を行います。

行頭に + 記号がある行が追加する行。 - 記号の行は削除する行となります。

2-1. scan.conf の設定

CentOS8のEPELリポジトリからインストールした場合、設定ファイルのフルパスは /etc/clamd.d/scan.conf となります。

設定はこのファイルを改変して行います。

まず、LocalSocketを有効化します。

これはUNIXドメインソケットを作成する設定で、同じサーバで動いているプログラム同士でのやりとりを行えるようにします。

例えばRSPAMDなど他のプログラムのウィルススキャンでClamAVを使う際に必要です。

ドメインソケットのファイルは /run/clamd.scan/clamd.sock 、所有グループは virusgroup 、権限設定は660(所有者・グループは読み書き可能。その他はアクセス不可)で設定します。

ClamAVと連携したいシステムは、そのシステムの実行ユーザを virusgroup に加えることになります。

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

+ LocalSocket /run/clamd.scan/clamd.sock

  # Sets the group ownership on the unix socket.
  # Default: disabled (the primary group of the user running clamd)
- #LocalSocketGroup virusgroup

+ LocalSocketGroup virusgroup

  # Sets the permissions on the unix socket to the specified mode.
  # Default: disabled (socket is world accessible)
- #LocalSocketMode 660
+ LocalSocketMode 660

通常スキャン時に除外するパスを設定します。

/proc//sys/ はシステム的に頻繁に読み書きされるため、毎度スキャンをするとリソースを大きく消費します。このためスキャン対象から除外しておきます。

  # Don't scan files and directories matching regex
  # This directive can be used multiple times
  # Default: scan all
- #ExcludePath ^/proc/
- #ExcludePath ^/sys/
+ ExcludePath ^/proc/
+ ExcludePath ^/sys/

全てのファイルを検査できるようにroot権限のままでスキャンを実行するようにします。

リアルタイムスキャンなどClamAVで直接スキャンを行う場合はファイルの権限で検査できないということが起きがちなので、この設定を行います。

(RSPAMDなど他のプログラムと連携するだけの場合は不要です)

  # Run as another user (clamd must be started by root for this option to work)
  # Default: don't drop privileges
- User clamscan
+ #User clamscan

リアルタイムスキャンの監視対象を設定します。

例えばファイルストレージとして使っているディレクトリや、Webサーバでアップロードができるようにしているディレクトリなど、危険なファイルが入りそうなディレクトリを指定します。

行を分けることで何カ所でも指定できます。

また、監視対象と設定しているディレクトリでも一部だけ監視対象から外すと言ったことも出来ます。

なお、 / を指定することは出来ません。(つまり、システム全てを監視させるという事は出来ません)

  # Set the include paths (all files inside them will be scanned). You can have
  # multiple OnAccessIncludePath directives but each directory must be added
  # in a separate line.
  # Default: disabled
  #OnAccessIncludePath /home
  #OnAccessIncludePath /students
+ OnAccessIncludePath 「リアルタイムスキャンを行いたいディレクトリ」

  # Set the exclude paths. All subdirectories are also excluded.
  # Default: disabled
  #OnAccessExcludePath /home/user
+ OnAccessExcludePath 「OnAccessIncludePathで指定されている中でリアルタイムスキャンを行いたくないディレクトリ」

リアルタイムスキャンでのウィルス検知時にファイルをブロックするように設定します。

これは、検出されたウィルスファイルが開かれたり実行されようとした際にそれを防ぐものです。

※2022/6/21現在、RHEL8において以下 yes と設定している部分が yes ではエラーとなり、 1 と設定する必要があったというコメントを頂きました。CentOS8自体は既にサポートの終了したOSですがCentOS StreamやRHEL等の類似OSで試して上手く行かない際は、一度 yes1 に置き換えて試してみてください。

  # Modifies fanotify blocking behaviour when handling permission events.
  # If off, fanotify will only notify if the file scanned is a virus,
  # and not perform any blocking.
  # Default: no
- #OnAccessPrevention yes
+ OnAccessPrevention yes

ファイルが作成されたときや移動されたときにスキャンを行う設定です。

これを無効化している場合はファイルを開こうとした場合のみにスキャンが行われます。

  # Toggles extra scanning and notifications when a file or directory is
  # created or moved.
  # Requires the  DDD system to kick-off extra scans.
  # Default: no
- # OnAccessExtraScanning yes
+ OnAccessExtraScanning yes

rootをスキャン対象から除外する設定です。

この設定を行わない場合、 ERROR: ClamCom: TIMEOUT while waiting on socket (recv) といったエラーが表示されます。

スキャン行為で発生する一時ファイルといったものをスキャンしようとして無限ループに陥ってしまうようです。

  # With this option you can whitelist the root UID (0). Processes run under
  # root with be able to access all files without triggering scans or
  # permission denied events.
  # Note that if clamd cannot check the uid of the process that generated an
  # on-access scan event (e.g., because OnAccessPrevention was not enabled, and
  # the process already exited), clamd will perform a scan.  Thus, setting
  # OnAccessExcludeRootUID is not *guaranteed* to prevent every access by the
  # root user from triggering a scan (unless OnAccessPrevention is enabled).
  # Default: no
- #OnAccessExcludeRootUID no
+ OnAccessExcludeRootUID yes

同様に、スキャン対象からClamAVを除外する設定です。

実行ユーザがrootユーザのままであれば OnAccessExcludeRootUID の設定だけでも問題ありませんが、設定しておいて損は無いかと。

  # This option allows exclusions via user names when using the on-access
  # scanning client. It can be used multiple times.
  # It has the same potential race condition limitations of the
  # OnAccessExcludeUID option.
  # Default: disabled
- #OnAccessExcludeUname clamav
+ OnAccessExcludeUname clamav

2-2. freshclam.conf の設定

CentOS8のEPELリポジトリからインストールした場合、フルパスは /etc/freshclam.conf となります。

まず本体と違って、検体更新の方は初期設定ではログが残らないので、システムログに記録する設定を行います。

  # Use system logger (can work together with UpdateLogFile).
  # Default: no
- #LogSyslog yes
+ LogSyslog yes

次に、検体更新時にClamAV本体を再起動するように設定します。

これを行わないと検体を更新してもそれが使われないままとなってしまいます。

ここで設定する場所は、先ほど設定した scan.conf の場所となります。

  # Send the RELOAD command to clamd.
  # Default: no
- #NotifyClamd /path/to/clamd.conf
+ NotifyClamd /etc/clamd.d/scan.conf

3. SELinuxの設定

SELinuxが稼働している場合、ClamAVのファイル検査もブロックしてしまいます。

このため、ClamAVなどのアンチウィルスソフトがスキャンを出来るようにSELinuxの設定を変更します。

[root@localhost ~]# setsebool -P antivirus_can_scan_system on

4. ウィルス検体データを更新する

自動更新の設定の準備は行いましたが、起動する前に今の最新の状態に更新しておきましょう。

100MB以上のデータをダウンロードしてくるので注意してください。

[root@localhost ~]# freshclam

5. ClamAVを起動する

ClamAVの自動起動設定と起動を行います。

前から順に、ClamAVのデーモン、リアルタイムスキャン、ウィルス検体更新となります。

[root@localhost ~]# systemctl enable --now clamd@scan clamav-clamonacc.service clamav-freshclam.service

これでClamAVが起動します。

6. ClamAVのテスト

今回はテストとして、eicar.comという検知用のファイルを作成してみます。

リアルタイムスキャンの対象となるディレクトリにrootで以下の内容のファイルを作成します。

eicar.com

X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*

そして、root以外のそのディレクトリに権限を持つユーザでファイルを開こうとしても開けないはずです。

また、一般ユーザでリアルタイムスキャンの対象外のディレクトリに上記のファイルを作成してから、そのファイルをリアルタイムスキャンの対象となるディレクトリに移そうとしても操作が許可されていない旨のエラーが出るはずです。

まとめ

今回はClamAVをインストールしてリアルタイムスキャンを行う方法を説明しました。

しかし、ファイルをネット上でやりとりするようなソフトウェアの多くはプラグインなどを使ってClamAVと連携する機能を持っています。

このため、多くの場合はリアルタイムスキャンでは無く連携機能を使ってウィルス検知を行うかと思います。

リアルタイムスキャンはサーバへの負荷もそれなりにあるのでプラグインなどがない場合に、必要なフォルダに絞って行うことをおすすめします。

2022/6/21 コメントで設定の yes1 にしないとエラーが出たという情報が寄せられたので注記を追加

「CentOS8にClamAVをインストールする」への2件のフィードバック

  1. 情報ありがとうございます。
    2022年6月21日現在でRedhat Enterprise Linux 8
    でinstall出来ました。
    ただ、以下の変更がありました。
    – #OnAccessExcludeRootUID no
    + OnAccessExcludeRootUID yes
    あたらしい変更
    – #OnAccessExcludeRootUID −1
    + OnAccessExcludeRootUID 1
    yesにするとErrorになります。

    1. 情報提供していただきありがとうございます。
      私はCentOS8のサポート切れに伴いDebianに切り替えたので検証できていないのですが、投稿していただいた内容を上手くいかなかった際に試すよう注記しました。

コメントを残す

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