はじめに
オープンソースのアンチウイルスソフトの ClamAV で思わぬ権限エラーに遭遇しました。一応対処できたのでその方法をここに残しておきます。
TL;DR
/usr/lib/systemd/system/clamd@.service
(サービス起動スクリプト)で /run/clamd.scan/
の所有者グループに tomcat を指定することで解決。
[Service]
~~~
ExecStartPost = /bin/bash -c 'chown root:tomcat -R /run/clamd.scan/'
~~~
システム構成
役割 | 名称 |
---|---|
OS | Amazon Linux 2 |
Webサーバー | Tomcat 8.5 |
アンチウイルスソフト | ClamAV |
エラー内容
Tomcat 経由でファイルアップロードを実行したらエラーになりました。
試しに以下の様にコマンドを実行してみたところ、エラーが発生しました。
$ sudo -u tomcat clamdscan test.txt
ERROR: Could not connect to clamd on LocalSocket /run/clamd.scan/clamd.sock: Permission denied
----------- SCAN SUMMARY -----------
Infected files: 0
Total errors: 1
Time: 0.000 sec (0 m 0 s)
Start Date: 2023:10:03 16:12:09
End Date: 2023:10:03 16:12:09
施策1- 未解決
chown -R root:tomcat /run/clamd.scan/
を実施してみたところ、エラーは出なくなったのですが、システムを再起動したらこの設定が元に戻ってしまいました。
施策2- 未解決
/etc/clamd.d/scan.conf
を修正しました。
-#LocalSocketGroup virusgroup
+LocalSocketGroup tomcat
しかし、エラーが出る状況を改善できませんでした。
ディレクトリのアクセス権限が tomcat ではないのが悪いみたいです。
$ sudo ls -al /run/clamd.scan/
合計 0
drwx--x--- 2 clamscan virusgroup 60 10月 3 16:09 .
drwxr-xr-x 31 root root 1040 10月 3 16:09 ..
srw-rw-rw- 1 root tomcat 0 10月 3 16:09 clamd.sock
施策3 - 解決
施策1
の方針が良さそうなので、あとはシステムを再起動しても設定が反映されるようにすれば良いはずです。
というわけで、以下の様に clamd の起動スクリプトで ExecStartPost
を設定しました。
※参考資料:https://qiita.com/JhonnyBravo/items/a28074c20fa9adf02be3
[Service]
~~~
ExecStartPost = /bin/bash -c 'chown root:tomcat -R /run/clamd.scan/'
~~~
システムを再起動してもエラーが出なくなりましたー。
$ sudo -u tomcat clamdscan test.txt
test.txt: OK
----------- SCAN SUMMARY -----------
Infected files: 0
Time: 0.003 sec (0 m 0 s)
Start Date: 2023:10:03 17:50:58
End Date: 2023:10:03 17:50:58
まとめ
アップロードされたファイルのウイルスチェックを ClamAV を使って実装してみましたが、思わぬ権限エラーに遭遇しました。ClamAV の設定ファイルだけではうまく解決できなかったので、サービス起動スクリプトで強引に所有者を変更することで解決できました。
ここではあっさり記載していますが、実際にはエラーを解決するまでに 2 時間程費やしました。
ITシステムにおける問題解決のアプローチ方法が多岐にわたることを改めて実感しました。