必要最低限の設定で監視エージェントに監視させる

監視エージェントで監視をする際に,必要最低限の権限設定で監視できるようにしてみる.
Zabbix Agentを例にとって記述するが,他の監視エージェントでも同様のことが言えると思う.

なお,ここでは監視に必要な必要最低限の権限を付与するという点を最優先した設定を考える.運用を考えると必ずしも最適とは言えない可能性があるため注意が必要.

環境

$ cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
$ yum list installed zabbix-agent
zabbix-agent.x86_64                3.4.10-1.el7                     @zabbix

実行ユーザ

エージェントの実行ユーザはrootなどの特別な権限を持ったユーザは避ける. Zabbix Agentではデフォルトでzabbixユーザで実行するようになっているためそのままにする.

$ ps -ef | grep [z]abbix
zabbix    9075     1  0 01:23 ?        00:00:00 /usr/sbin/zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf
zabbix    9076  9075  0 01:23 ?        00:00:00 /usr/sbin/zabbix_agentd: collector [idle 1 sec]
zabbix    9077  9075  0 01:23 ?        00:00:00 /usr/sbin/zabbix_agentd: listener #1 [waiting for connection]
zabbix    9078  9075  0 01:23 ?        00:00:00 /usr/sbin/zabbix_agentd: listener #2 [waiting for connection]
zabbix    9079  9075  0 01:23 ?        00:00:00 /usr/sbin/zabbix_agentd: listener #3 [waiting for connection]
zabbix    9080  9075  0 01:23 ?        00:00:00 /usr/sbin/zabbix_agentd: active checks #1 [idle 1 sec]

パーミッション

このままでも各種メトリクスは取得できるが,ログ監視のために追加の設定が必要となる. 例えば/var/log/messagesは以下のような権限が設定されており,そのままだとzabbixユーザでは監視することができない.

$ ls -l /var/log/messages
-rw-------. 1 root root 75591  6月 10 02:35 /var/log/messages
$ sudo su -s /bin/sh zabbix sh -c 'tail /var/log/messages'
tail: cannot open '/var/log/messages' for reading: Permission denied

zabbixユーザでファイルを開けるようにするには以下のような設定が考えられる.

rootグループに対して読み取り権限を設定しzabbixユーザをrootグループに所属させる

$ sudo usermod -a -G root zabbix
$ sudo chmod g+r /var/log/messages

これでログを開けるようになる.さらに少ない権限でいくならアクセスACLという機能が使える.
この機能を使えば特定のユーザに対して特定のファイルにのみ権限を設定することができる.

$ getfacl /var/log/messages
getfacl: Removing leading '/' from absolute path names
# file: var/log/messages
# owner: root
# group: root
user::rw-
group::---
other::---
$ sudo setfacl -m u:zabbix:r /var/log/messages
$ sudo getfacl /var/log/messages
getfacl: Removing leading '/' from absolute path names
# file: var/log/messages
# owner: root
# group: root
user::rw-
user:zabbix:r--
group::---
mask::r--
other::---

SELinux

上の設定だけでは不十分で,実際にはSELinuxによりZabbix Agentは/var/log/messagesを開くことはできない. audit.logには以下のようなログが記録される.

$ sudo ausearch -c 'zabbix_agentd'
time->Tue Jun 12 13:25:06 2018
type=PROCTITLE msg=audit(1528809906.258:3512): proctitle=2F7573722F7362696E2F7A61626269785F6167656E74643A2061637469766520636865636B73202331205B70726F63657373696E672061637469766520636865636B735D
type=SYSCALL msg=audit(1528809906.258:3512): arch=c000003e syscall=2 success=no exit=-13 a0=55745cdc7ee0 a1=0 a2=0 a3=2 items=0 ppid=14622 pid=14627 auid=4294967295 uid=997 gid=994 euid=997 suid=997 fsuid=997 egid=994 sgid=994 fsgid=994 tty=(none) ses=4294967295 comm="zabbix_agentd" exe="/usr/sbin/zabbix_agentd" subj=system_u:system_r:zabbix_agent_t:s0 key=(null)
type=AVC msg=audit(1528809906.258:3512): avc:  denied  { read } for  pid=14627 comm="zabbix_agentd" name="messages" dev="sda1" ino=8802128 scontext=system_u:system_r:zabbix_agent_t:s0 tcontext=system_u:object_r:var_log_t:s0 tclass=file

これを許可するようなBooleanもなさそう

$ sudo semanage boolean -l | grep zabbix
zabbix_can_network             (off  ,  off)  Allow zabbix to can network
httpd_can_connect_zabbix       (off  ,  off)  Allow httpd to can connect zabbix

そのため独自の許可ルールを作成することになる

SELinuxをPermissiveモードにして拒否されるであろう動作を洗い出す

$ sudo setenforce 0
(しばらく待つ)
$ sudo ausearch -c 'zabbix_agentd'
time->Tue Jun 12 13:40:21 2018
type=PROCTITLE msg=audit(1528810821.374:3621): proctitle=2F7573722F7362696E2F7A61626269785F6167656E74643A2061637469766520636865636B73202331205B70726F63657373696E672061637469766520636865636B735D
type=SYSCALL msg=audit(1528810821.374:3621): arch=c000003e syscall=2 success=yes exit=6 a0=55745cdc7ee0 a1=0 a2=0 a3=2 items=0 ppid=14622 pid=14627 auid=4294967295 uid=997 gid=994 euid=997 suid=997 fsuid=997 egid=994 sgid=994 fsgid=994 tty=(none) ses=4294967295 comm="zabbix_agentd" exe="/usr/sbin/zabbix_agentd" subj=system_u:system_r:zabbix_agent_t:s0 key=(null)
type=AVC msg=audit(1528810821.374:3621): avc:  denied  { open } for  pid=14627 comm="zabbix_agentd" path="/var/log/messages" dev="sda1" ino=8802128 scontext=system_u:system_r:zabbix_agent_t:s0 tcontext=system_u:object_r:var_log_t:s0 tclass=file
type=AVC msg=audit(1528810821.374:3621): avc:  denied  { read } for  pid=14627 comm="zabbix_agentd" name="messages" dev="sda1" ino=8802128 scontext=system_u:system_r:zabbix_agent_t:s0 tcontext=system_u:object_r:var_log_t:s0 tclass=file

カスタムルールを生成して読み込ませる

$ sudo ausearch -c 'zabbix_agentd' --raw | audit2allow -M my-zabbixagentd
$ cat my-zabbixagentd.te

module my-zabbixagentd 1.0;

require {
        type var_log_t;
        type zabbix_agent_t;
        class file { open read };
}

#============= zabbix_agent_t ==============
allow zabbix_agent_t var_log_t:file { open read };
$ sudo semodule -i my-zabbixagentd.pp

これでログが読めるようになる. ちなみにSELinuxによる拒否が発生した場合に必要なアクションを調べるにはsetroubleshootパッケージが便利.

監視内容によってはまだ追加の設定が必要になると思うが,基本的には上の考え方を応用すれば設定できるはず.

参考

関連記事

comments powered by Disqus