freshclamが動かない。(SELinux関連)

事の起こりは サーバーOSのアップデート後 Logwatchのclam-update Beginの項に「動いてないよ」ってメッセージが記録されてた事。内容はこんな感じ。

No updates detected in the log for the freshclam daemon (the
 ClamAV update process).  If the freshclam daemon is not running,
 you may need to restart it.  Other options:
以下省略

サーバーにログインして/var/log/freshclam.logを調べてみた。以下のメッセージがひたすら続く。freshclamはrootで動かしてる。設定したのはずいぶん前なのでよく覚えていない。 たぶんClamAVをrootでチェックしてるのでfreshclamもrootで動かしているんだと思う。 

WARNING: lchown to user 'root' failed on log file '/var/log/freshclam.log'.  Error was 'Permission denied'
ERROR: Failed to switch to root user.

freshclamのステータスを調べてみたら 動いてない。

[]$ sudo systemctl status clamav-freshclam.service
× clamav-freshclam.service - ClamAV virus database updater
     Loaded: loaded (/usr/lib/systemd/system/clamav-freshclam.service; enabled; preset: disabled)
     Active: failed (Result: exit-code) since Tue 2024-11-05 15:14:59 JST; 9min ago
以下省略・・

色々ググって調べてみたけど これと言う情報は出てこない。

一時的にSELinuxを停止して試してみる。

[]$ setenforce 0
[]$ sudo systemctl restart clamav-freshclam.service

結果は省略するけど clamav-freshclam.serviceは動いた。
つまり原因はSELinux絡みか・・ 巷のサイトでは この後 SELinuxは邪魔なので無効化してしまえってのが多いけど、私のサイトの信条はSELinuxは絶対有効。
SELinuxを稼働状態に戻す。

[]$ setenforce 1

原因を探してみる。下記のコマンドでSELinuxのログファイルを調べて エラーの内容を報告してくれる。

[]$ sudo audit2allow -i /var/log/audit/audit.log

色々なエラーが出力されたけどその中でclamav-freshclam.serviceに関係ありそうなのはこれかな?

#============= antivirus_t ==============

#!!!! This avc can be allowed using the boolean 'domain_kernel_load_modules'
allow antivirus_t kernel_t:system module_request;
allow antivirus_t var_log_t:file setattr;

“domain_kernel_load_modules”の現在の設定を調べてみる。

[]$ sudo getsebool -a | grep domain
cron_userdomain_transition --> on
domain_can_mmap_files --> off
domain_can_write_kmsg --> off
domain_fd_use --> on
domain_kernel_load_modules --> off
samba_domain_controller --> off
sge_domain_can_network_connect --> off
virt_transition_userdomain --> off

offになっていたのでONにする。

[]$ sudo setsebool -P domain_kernel_load_modules ON

freshclamを試しに動かしてみる

[]$ sudo systemctl restart clamav-freshclam.service
[]$ sudo systemctl status clamav-freshclam.service
結果省略

まだエラーになる。
もう一度ログからfreshclamに関するエラーについて出力する。
メッセージが変わってる。 ポリシーを変えるしか方法が無いようだ。
今回はfreshclamに関するエラーメッセージだけを出力してみた。

[]$ sudo ausearch -m AVC -c freshclam | sudo audit2allow -a


#============= antivirus_t ==============

#!!!! This avc is allowed in the current policy
allow antivirus_t kernel_t:system module_request;
allow antivirus_t var_log_t:file setattr;

ログファイルから新しいポリシーファイルを出力する。
-Mオプションのfreshclamは出力するファイル名を指定してるだけなので何でも良い。分かりやすいように同じ名前にした。

[]$ sudo ausearch -m AVC -c freshclam | sudo audit2allow -a -M freshclam
******************** 重要 ***********************
このポリシーパッケージを有効にするには、以下を実行してください。

semodule -i freshclam.pp

出力されたファイルはこんな感じ。ちなみにxxx.ppファイルは設定されるポリシーの内容がテキスト交じりのバイナリデータで入ってる。xxx.teがテキストファイルで設定される内容が確認できる。見てもよく解らないけど・・・ (大汗

[]$ ll
合計 20
-rw-r--r--. 1 root root 1204 11  5 16:10 freshclam.pp
-rw-r--r--. 1 root root  323 11  5 16:10 freshclam.te
・・以下省略

指示された通りにコマンド実行して 新しいポリシーを設定する。

[]$ sudo semodule -i freshclam.pp

再度 freshclamを実行してみる。

[]$ sudo systemctl restart clamav-freshclam.service
[]$ sudo systemctl status clamav-freshclam.service
 clamav-freshclam.service - ClamAV virus database updater
     Loaded: loaded (/usr/lib/systemd/system/clamav-freshclam.service; enabled; preset: disabled)
     Active: active (running) since Tue 2024-11-05 16:18:16 JST; 9s ago
以下省略

上手く動き出したようだ。