はじめに
Zabbixでsyslog監視を行うためだけに、AllowRootを有効にすることはお勧めしません。
しかも、SELinuxをdisabledに設定することも避けるべきです。
さらに、Zabbixエージェントの設定で、EnableRemoteCommandsも有効にしていたら、危険度は数十倍増してしまいます。
zabbix_agentd.confのServerの設定でZabbixサーバーを指定しているからといっても、Zabbixサーバーを踏み台にすれば、各Zabbixエージェントがインストールされている甘い設定のサーバーへの攻撃が容易になってしまうことをご認識ください。
セキュリティ上問題のある甘い設定をした環境を攻撃されてもZabbixのせいにしないでくださいね。
想定環境
ということで、参考にすべきではない情報を駆逐するためにも、より安全な方法を整理してみます。
ZabbixのバージョンとOSの組み合わせとしては、今回は、Zabbix 3.0.2 + CentOS 7.2で確認します。
CentOS 7.2のデフォルトでは、syslogにはrsyslogが利用されていて、出力ファイルは「/var/log/messages」となります。
しかし、デフォルトのファイルのパーミッションは、
# ls -l /var/log/messages
-rw-------. 1 root root 594277 4月 19 19:01 /var/log/messages
#
となっていて、rootユーザー以外のユーザーではアクセスすることができません。
その対策として、安易な方法としては、Zabbixエージェントの設定内の「AllowRoot」を「1」にして、Zabbixエージェントのプロセス自体をrootユーザーで起動してしまうこともできます。
しかし、不用意にZabbixエージェントをrootユーザーで起動してしまうと、Zabbixエージェントを経由した攻撃を受けてしまう可能性があります。
しかも、とある方の投稿では、「SELinuxをdisabledに」などと書かれています。
そういった投稿を参考にしてしまって、さらに「EnableRemoteCommands」も有効にしてしまっていたら、Zabbixエージェントを経由して、rootユーザー権限で様々なコマンドをスルーで実行されてしまう可能性があるので、最悪の場合、システムが破壊されてしまいます。
そのようなセキュリティを考慮しない設定にすることは、強く強く強く(大事なので3回繰り返し)お勧めしません。
より安全な設定は?
それでは、どのような設定をした方が望ましいかを検討してみましょう。
SELinuxをどうしても利用したくない場合
どうしてもSELinuxを有効にしたくないのであれば、ファイルのパーミッションでzabbixユーザでも読めるようにすることでsyslogのファイルを監視できるようになります。
デフォルトの設定のファイルのパーミッションが、
# ls -l /var/log/messages
-rw-------. 1 root root 594277 4月 19 19:01 /var/log/messages
#
ですので、このファイルのオーナーとパーミッションを以下のように変更します。
# chown root:zabbix /var/log/messages
# chmod 640 /var/log/messages
# ls -l /var/log/messages
-rw-r-----. 1 root zabbix 594277 4月 19 19:01 /var/log/messages
#
これで、Zabbixエージェントから/var/log/messagesにアクセスできるようになります。
logrotateの設定も忘れずに。
設定しておかないと、ログファイルのローテーション時に、ログファイルのオーナーとパーミッションをデフォルトの状態に戻されてしまいます。
設定例としては、以下のような設定をしておきます。
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
missingok
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
create 0640 root zabbix
}
「create 0640 root zabbix」を追加しておくことで、ログローテーションを実行する際、新しいファイルのパーミッションとオーナーを明示的に指定しておくわけです。
SELinuxを利用する場合
SELinuxを利用する場合は、単純にファイルのパーミッションの設定だけではなく、SELinuxのポリシーとして、/var/log以下のファイルにアクセスする権限を付与することが必要になります。
細かな説明は省きますが、デフォルトの設定で/var/log/messagesを監視しようとすると、/var/logに対してread権限が無いと怒られます。
type=AVC msg=audit(1461052103.437:366): avc: denied { read } for pid=2057 comm="zabbix_agentd" name="messages" dev="dm-0" ino=319455 scontext=system_u:system_r:zabbix_agent_t:s0 tcontext=system_u:object_r:var_log_t:s0 tclass=file
そして、read権限を与えると、今度はopen権限が無いと怒られます。
type=AVC msg=audit(1461052723.005:364): avc: denied { open } for pid=2087 comm="zabbix_agentd" path="/var/log/messages" dev="dm-0" ino=319455 scontext=system_u:system_r:zabbix_agent_t:s0 tcontext=system_u:object_r:var_log_t:s0 tclass=file
この結果をもとに、ポリシーファイルを生成すると以下のようになります。
まず、ログを切り出しておきます。
type=AVC msg=audit(1461052103.437:366): avc: denied { read } for pid=2057 comm="zabbix_agentd" name="messages" dev="dm-0" ino=319455 scontext=system_u:system_r:zabbix_agent_t:s0 tcontext=system_u:object_r:var_log_t:s0 tclass=file
type=AVC msg=audit(1461052723.005:364): avc: denied { open } for pid=2087 comm="zabbix_agentd" path="/var/log/messages" dev="dm-0" ino=319455 scontext=system_u:system_r:zabbix_agent_t:s0 tcontext=system_u:object_r:var_log_t:s0 tclass=file
このファイルを元に、以下のコマンドでポリシーを生成します。
# cat selinux-syslogread | audit2allow -M syslog-read
ちなみに、生成されたポリシーは以下のような感じです。
module syslog-read 1.0;
require {
type var_log_t;
type zabbix_agent_t;
class file { read open };
}
#============= zabbix_agent_t ==============
allow zabbix_agent_t var_log_t:file { read open };
そして、生成されたポリシーを読み込ませます。
# semodule -i syslog-read.pp
これで、SELinuxが有効でもログの監視ができるようになります。
最後に
安直にAllowRootを有効にしてしまうことは避けましょう。
サーバーのセキュリティレベルを下げてしまって、攻撃された際の被害が大きくなってしまうことがないよう留意されることをお勧めします。