Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

ClamAVのデーモン化

More than 5 years have passed since last update.

前回の続きです。

今回はウイルス検知処理をデーモン化するのと、ウイルス定義ファイルの自動更新するところをまとめますね。

1. ウイルススキャン処理のデーモン化

デーモン化にはclamdというパッケージが必要です。yumでインストールします。

# yum install clamd
Loaded plugins: fastestmirror, security
Loading mirror speeds from cached hostfile
 * epel: ftp.kddilabs.jp
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package clamd.x86_64 0:0.98.1-1.el6 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

==============================================================================================================
 Package                 Arch                     Version                        Repository              Size
==============================================================================================================
Installing:
 clamd                   x86_64                   0.98.1-1.el6                   epel                   150 k

Transaction Summary
==============================================================================================================
Install       1 Package(s)

Total download size: 150 k
Installed size: 563 k
Is this ok [y/N]: y
Downloading Packages:
clamd-0.98.1-1.el6.x86_64.rpm                                                          | 150 kB     00:00
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : clamd-0.98.1-1.el6.x86_64                                                                  1/1
  Verifying  : clamd-0.98.1-1.el6.x86_64                                                                  1/1

Installed:
  clamd.x86_64 0:0.98.1-1.el6

Complete!
#

サクッとインストできました。

clamdはサービス起動スクリプトが用意されているので、serviceコマンドで起動しましょう。またchkconfigで自動起動するようにしておきます。

# /sbin/service clamd start
Starting Clam AntiVirus Daemon:                            [  OK  ]
# chkconfig clamd on

ウイルススキャンはclamdscanコマンドを使います。

# clamdscan /bin/
/bin/loadkeys: lstat() failed: Permission denied. ERROR
/bin/umount: lstat() failed: Permission denied. ERROR
/bin/ping: lstat() failed: Permission denied. ERROR
/bin/dmesg: lstat() failed: Permission denied. ERROR
/bin/rpm: lstat() failed: Permission denied. ERROR
/bin/ping6: lstat() failed: Permission denied. ERROR
/bin/login: lstat() failed: Permission denied. ERROR
/bin/hostname: lstat() failed: Permission denied. ERROR
/bin/tracepath6: lstat() failed: Permission denied. ERROR
/bin/tracepath: lstat() failed: Permission denied. ERROR
/bin/traceroute: lstat() failed: Permission denied. ERROR
/bin/dbus-daemon: lstat() failed: Permission denied. ERROR
/bin/alsaunmute: lstat() failed: Permission denied. ERROR
/bin/plymouth: lstat() failed: Permission denied. ERROR
/bin/mount: lstat() failed: Permission denied. ERROR
/bin/su: lstat() failed: Permission denied. ERROR

----------- SCAN SUMMARY -----------
Infected files: 0
Total errors: 16
Time: 0.034 sec (0 m 0 s)
#

(゚д゚)!おっと、権限の問題が発生です。
今回、clamdはclamユーザで起動しており、さらにSELinuxもEnforcingにしております。
/etc/clamd.conf を変更してclamdをrootユーザで起動してもいいのですが、ここはセキュリティのバランス加減でclamユーザのままにしておき、システム系のファイルもチェックしてもらうよう変更します。

/var/log/audit/audit.logを確認すると、clamdのアクセスがdeniedされているログがあるので、それをaudit2allowに食わせてみましょう。

# grep denied /var/log/audit/audit.log | grep clam | audit2allow

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

#!!!! This avc can be allowed using the boolean 'antivirus_can_scan_system'
allow antivirus_t NetworkManager_var_lib_t:dir getattr;

#!!!! This avc can be allowed using the boolean 'antivirus_can_scan_system'
allow antivirus_t abrt_dump_oops_exec_t:file getattr;

#!!!! This avc can be allowed using the boolean 'antivirus_can_scan_system'
allow antivirus_t acct_exec_t:file getattr;
~省略~
#!!!! This avc can be allowed using the boolean 'antivirus_can_scan_system'
allow antivirus_t xdm_tmp_t:dir getattr;

すると多数のルールが出力されますが、よくよく見るとantivirus_can_scan_systemというBooleanを設定すればいけそうな雰囲気ですね。

念のためsesearchでantivirus_can_scan_systemをonにした時のルールを確認しときます。

# sesearch -b antivirus_can_scan_system -AC
Found 9 semantic av rules:
DT allow antivirus_domain device_node : chr_file getattr ; [ antivirus_can_scan_system ]
DT allow antivirus_domain device_node : blk_file getattr ; [ antivirus_can_scan_system ]
DT allow antivirus_domain file_type : dir { ioctl read getattr lock search open } ; [ antivirus_can_scan_system ]
DT allow antivirus_domain file_type : sock_file getattr ; [ antivirus_can_scan_system ]
DT allow antivirus_domain file_type : fifo_file getattr ; [ antivirus_can_scan_system ]
DT allow antivirus_domain device_t : dir { getattr search open } ; [ antivirus_can_scan_system ]
DT allow antivirus_domain non_security_file_type : file { ioctl read getattr lock open } ; [ antivirus_can_scan_system ]
DT allow antivirus_domain non_security_file_type : dir { ioctl read getattr lock search open } ; [ antivirus_can_scan_system ]
DT allow antivirus_domain non_security_file_type : lnk_file { read getattr } ; [ antivirus_can_scan_system ]
#

ではBooleanを設定します。

# setsebool -P antivirus_can_scan_system on

変更できたので再度/binをチェックしてみます。

]# clamdscan /bin/
/bin: OK

----------- SCAN SUMMARY -----------
Infected files: 0
Time: 0.051 sec (0 m 0 s)
#

成功です。
今回、clamユーザでのclamd起動とSELinuxがEnforcingという状態で動作させてます。
DACによる制御では、例えばrootのみ閲覧可能な/rootやログとかはチェックできませんし、またMACによる制御でもアクセスできないファイルがありますが、ClamAVとSELinux双方で守備するという考え方で、これでよしとしました。

まあ気になるファイルがある時は、rootユーザにてclamscanを手動で実行させましょう。

2. ウイルス定義ファイルの自動更新

freshclamのマニュアルを見ると、-dオプションと-cオプションを使うことでデーモン化して自動更新できるようです。

# man freshclam
freshclam(1)                    Clam AntiVirus                    freshclam(1)

NAME
       freshclam - update virus databases

SYNOPSIS
       freshclam [options]

DESCRIPTION
       freshclam is a virus database update tool for ClamAV.

OPTIONS
       Freshclam  reads its configuration from freshclam.conf. The settings can be overwritten with
       command line options.

~省略~
       -d, --daemon
              Run in a daemon mode. This option requires --checks.  -p FILE, --pid=FILE Write  dae-
              mon’s pid to FILE.

       --no-dns
              This option forces old non-DNS verification method (without a TTL delay).

       -c #n, --checks=#n
              Check #n times per day for a new database. #n must be between 1 and 50.
~後略~

1日1回の頻度でチェックするよう起動しておきました。

# freshclam -d -c 1
# ps -ef | grep fresh
clam     17534     1 64 09:28 ?        00:00:02 freshclam -d -c 1
root     17536 17327  0 09:28 pts/0    00:00:00 grep fresh
#

またOS再起動時にもfreshclamが起動するよう /etc/rc.local へ下記を追記してます。

/etc/rc.local
/usr/bin/freshclam -d -c 1

あと順番が前後してしまうのですが、freshclamで定義ファイルを更新したら、clamdにそれをRELOADしてもらう必要があるので、連携が必要です。
freshclam.conf にその設定パラメータがあるので、clamdの設定ファイルを指定するよう変更しておきましょう。

/etc/freshclam.conf
# Send the RELOAD command to clamd.
# Default: no
NotifyClamd /etc/clamd.conf

設定ファイルを変更したので再起動します。

# killall freshclam && freshclam -d -c1

※後で気付いたのですが、/etc/cron.daily/freshclamというファイルが配置されているので、1日1回のアップデートならcronに任せちゃうのがいいですね。なのでrc.localの自動起動も不要です。

3. 活用

とりあえず入れてみたという手順なので、運用めいたことは考えてないのですが、clamdでデーモン化しておくことで、メールのウイルスチェックをしたり、外部からSTREAMでデータを流してウイルスチェックしてもらうことができるようですね。

ClamAVのパッケージはマニュアルがしっかりしているので、clamdやclamd.confのmanを見て使えそうなプラクティスを探ってみます。

ではでは。

todaemon
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away