SELinux が Zabbix エージェントの sudo 呼び出しをブロックするのはなぜですか?

SELinux が Zabbix エージェントの sudo 呼び出しをブロックするのはなぜですか?

sudoを必要とするZabbixチェックがいくつかあります。これらは/etc/sudoers.d/zabbixの内容です。

zabbix ALL=(ALL)    NOPASSWD: /bin/yum history
zabbix ALL=(ALL)    NOPASSWD: /bin/needs-restarting
zabbix ALL=(ALL)    NOPASSWD: /sbin/check31
zabbix ALL=(ALL)    NOPASSWD: /usr/sbin/crm_mon --as-xml

Zabbix プロキシから強制的にチェックすると、次の権限拒否エラーが発生します (pacemaker.status は を使用します/usr/sbin/crm_mon --as-xml)。

bash-5.0$ zabbix_get -s my-server -k pacemaker.status
sudo: PAM account management error: System error
sudo: unable to send audit message: Permission denied

SELinux を一時的に許可モードに設定することで、SELinux が実際に呼び出しをブロックしていることを確認しました。

次に、以下の手順を実行してこれらの呼び出しを許可してみました。

まず、以前の問題からの無関係なメッセージでいっぱいになっていたため、監査ログをローテーションしました。

service auditd rotate

次に、ポリシーからすべての dontaudits を削除しました。

semodule -DB

Zabbix プロキシでは、zabbix_get上記の呼び出しを実行することでエラーが発生しました。

ログから SELinux モジュールを作成し、次のようにインストールしましたsemodule:

cat /var/log/audit/audit.log | audit2allow -M zabbix-agent
semodule -i zabbix-agent.pp

それでも、 を実行すると、監査メッセージの送信時に同じ権限拒否エラーが発生しますzabbix_get。 調査したところ、dontaudits をオフにすると問題が解決し、SELinux が追加のメッセージをログに記録するように強制してこの問題を解決できるはずですが、実際に試してみたところ、私の状況ではうまくいきませんでした。

zabbix-agent.teビルドされたファイルは次のとおりですaudit2allow:

module zabbix-agent 1.0;

require {
    type zabbix_agent_t;
    type chkpwd_exec_t;
    class unix_dgram_socket create;
    class file execute_no_trans;
    class netlink_audit_socket create;
}

#============= zabbix_agent_t ==============
allow zabbix_agent_t chkpwd_exec_t:file execute_no_trans;
allow zabbix_agent_t self:netlink_audit_socket create;
allow zabbix_agent_t self:unix_dgram_socket create;

答え1

試しましたか:

setsebool -P zabbix_can_network=1

上記をすでに許可している場合は、以下を試してください:

yum install policycoreutils-python
semanage permissive -a zabbix_agent_t

幸運を

答え2

同様の問題が発生しました (selinux 対応マシンで RAID コントローラー チェックを実行)。

私にとって欠けていたリンクは次の点でした:

semodule -DB

いくつかの非監査ポリシーを有効にします。その後、ポリシーを再キャプチャします。

参照:https://forums.centos.org/viewtopic.php?t=62829 キャプチャするときには、まず selinux を permissive に設定することが重要です。私もほぼ同じように、次のようなことを行いました (permissive に設定してキャプチャし、ポリシーを適用した後):

ログをローテーションし、古いログを削除します:

service auditd rotate

semodule -DB (監査ルールを無効にします)

  • zabbix からコマンドを実行します (構成 - ホスト - 1 回実行)
  • ポリシーファイルを取得するには以下を実行します

    grep -i avc /var/log/audit/audit.log |audit2allow -M policyx

  • 走る

    semodule -i ポリシーx.pp

  • Zabbixでコマンドを再度実行して、動作するかどうかを確認します。

  • 走る

    semodule -B

    監査なしルールを再度有効にします。

私の sudoers ルールは次のようになります:

zabbix ALL=(root) NOPASSWD: /opt/MegaRAID/storcli/storcli64

zabbix ユーザー (nologin シェルを持つ) が次のようなコマンドを実行できるかどうか試しました:

su -s /bin/bash -c 'sudo /opt/MegaRAID/storcli/storcli64 /c0 /eall /sall show' zabbix

ユーザー zabbix として適切に実行されることを確認するために、コマンドに対しても同じことを試すことをお勧めします。

また、sudoers と shadow ファイルで restorecon を使用しましたが、それが役立ったかどうかはわかりません。また、実行するスクリプトで zabbix_agent_t コンテキストを設定しましたが、効果がない可能性があります。

最後になりましたが、私が適用してうまくいったポリシー ファイルを次に示します。これをコンパイルして適用し、動作するかどうかを確認してみてください。

cat mypolz1.te 

module mypolz1 1.0;

require {
    type zabbix_exec_t;
    type zabbix_agent_t;
    type system_dbusd_t;
    class capability { net_admin sys_admin };
    class dbus send_msg;
    class unix_dgram_socket write;
    class file { execute execute_no_trans };
    class netlink_audit_socket { read write };
}

#============= zabbix_agent_t ==============

#!!!! This avc is allowed in the current policy
allow zabbix_agent_t self:capability net_admin;
allow zabbix_agent_t self:capability sys_admin;

#!!!! This avc is allowed in the current policy
allow zabbix_agent_t self:netlink_audit_socket { read write };

#!!!! This avc is allowed in the current policy
allow zabbix_agent_t self:unix_dgram_socket write;

#!!!! This avc is allowed in the current policy
allow zabbix_agent_t system_dbusd_t:dbus send_msg;

#!!!! This avc is allowed in the current policy
allow zabbix_agent_t zabbix_exec_t:file { execute execute_no_trans };

ご覧のとおり、いくつかのポリシーが設定されていましたが、おそらくシステム管理者がそれを実行したのでしょう (コマンドを実行する前に出力はありませんでした)。

反復が重要だと思います。なぜなら、各ステップの後にさまざまな問題が発生し、ポリシーを適用することでそれらの問題が軽減されるからです。頑張ってください!

関連情報