NRPEを介してIcinga2によって監視されている同じLAN内にいくつかの仮想マシンがあります。
[マシンA]
CentOS 6
Icinga2。
[マシンB]
CentOS 6
MariaDBv10.1.12が正しく実行されている
My.cnfのDatadirとソケットの設定:
datadir=/database/mariadb
socket=/database/mariadb/mysql.sock
次のシンボリックリンクもあります。
/var/lib/mysql -> /database/mariadb
上記すべてのowner:groupはmysql:mysqlです。
SELinuxが有効
/ usr/lib64/nagios/plugins/check_mysql v2.0.3
次のセキュリティコンテキストを使用します。
-rwxr-xr-x. root root system_u:object_r:nagios_services_plugin_exec_t:s0 /usr/lib64/nagios/plugins/check_mysql
command[check_mysql]=/usr/lib64/nagios/plugins/check_mysql -H localhost -u xxx -p xxx -P 3306
今問題:
Icinga(マシンAから)のレポート:
"Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (13)"
マシンBで次のラインを手動で実行した場合:
Sudo -u nrpe /usr/lib64/nagios/plugins/check_mysql -H localhost -u xxx -p xxx -P 3306
結果は正常です(終了コード0):
Uptime: 2085 Threads: 1 Questions: 68204 Slow queries: 0 Opens: 37 Flush...
マシンBでSELinuxを無効にした場合のみ(echo 0 > /selinux/enforce
)Icingaはmysqlに接続して、ステータスOKを表示できます。しかし、SELinuxを無効にしたくありません。 SELinuxを有効にし、Icingaをmysqlに正しく接続するための適切な設定を見つけようとしています。
[編集]
IcingaがマシンBのmysqlをチェックするたびに、マシンBのaudit.logに次の2つの新しい行が表示されます。
type=AVC msg=audit(1460038526.265:69): avc: denied { read } for pid=4858 comm="check_mysql" name="mysql" dev=dm-0 ino=130900 scontext=system_u:system_r:nagios_services_plugin_t:s0 tcontext=unconfined_u:object_r:var_lib_t:s0 tclass=lnk_file
type=SYSCALL msg=audit(1460038526.265:69): Arch=c000003e syscall=42 success=no exit=-13 a0=3 a1=7fffe4d270f0 a2=6e a3=7fffe4d263e0 items=0 ppid=4857 pid=4858 auid=4294967295 uid=497 gid=498 euid=497 suid=497 fsuid=497 egid=498 sgid=498 fsgid=498 tty=(none) ses=4294967295 comm="check_mysql" exe="/usr/lib64/nagios/plugins/check_mysql" subj=system_u:system_r:nagios_services_plugin_t:s0 key=(null)
これを試して:
setsebool -P nagios_run_Sudo 1
NRPEを使用するホスト上。このオプションは、SELinuxポリシーではデフォルトで無効になっています。
やっと解決できました。他の人にも役立つかもしれないので、以下の解決策を共有します。
以下の行だけを含むaudit.logという名前の作業ファイルを作成しました。
type=AVC msg=audit(1460038526.265:69): avc: denied { read } for pid=4858 comm="check_mysql" name="mysql" dev=dm-0 ino=130900 scontext=system_u:system_r:nagios_services_plugin_t:s0 tcontext=unconfined_u:object_r:var_lib_t:s0 tclass=lnk_file
type=SYSCALL msg=audit(1460038526.265:69): Arch=c000003e syscall=42 success=no exit=-13 a0=3 a1=7fffe4d270f0 a2=6e a3=7fffe4d263e0 items=0 ppid=4857 pid=4858 auid=4294967295 uid=497 gid=498 euid=497 suid=497 fsuid=497 egid=498 sgid=498 fsgid=498 tty=(none) ses=4294967295 comm="check_mysql" exe="/usr/lib64/nagios/plugins/check_mysql" subj=system_u:system_r:nagios_services_plugin_t:s0 key=(null)
私は走った:
sealert -a audit.log > sealert.log
結果のsealert.logには、問題の説明が含まれていました。
SELinuxは、/ usr/lib64/nagios/plugins/check_mysqlがlnk_filemysqlへの読み取りアクセスを阻止しています。
また、それを修正するための提案。そこで提案されているように、私は次のことを実行しました。
grep check_mysql audit.log | audit2allow -M mypol
これにより、mypol.ppとmypol.teの2つのファイルが出力されました。
最後に、次のコマンドを実行しました。これで問題は完全に解決しました。
semodule -i mypol.pp
問題は、ソケットが通常、データファイルとともに/var/lib/mysql
内にあることです。
別のデータベースディレクトリを使用しているため、シンボリックリンクに関係なく、SELinuxはリクエストをブロックしています。
TCP接続(127.0.0.1
およびnotlocalhost
を使用)を介してMySQLへのアクセスを試みることができます)
ただし、これでも、MySQLデーモン自体を使用したSELinuxで問題が発生する可能性があります。