スポンサーリンク

Muninでグラフが作られない場合の注意点

先日、自宅のサーバーを新しくした際にMuninを導入して各種監視を行うようにしたのですが、UPSの監視を行うプラグインを導入した際にトラブルが発生したので纏めておきます。これに関する情報は、いろいろ探してみたのですが現在のところは見当たりませんでした。なので、諦めている人も少なくないのではないかと思います。

ちなみに、今回のサーバーはサポート期間も考慮してCentOS7で構築しました。で、問題が発生したプラグインはapcupsd_wwとapcupsd_pctの二つになります。

現象としては、各プラグインを他のサイトを参考にインストールし、munin-runでチェックしても問題なくデータが取れていることを確認できるのにグラフが生成されないという現象です。他のプラグインでも同様の現象が発生した場合には同じ対応で回避できるのではないかと思います。

この問題が発生したときの /var/log/munin-node/munin-node.log を貼っておきます。こちらがapcupsd_wwのエラーログ。

2015/08/23-02:45:04 [25339] Error output from apcupsd_ww:
2015/08/23-02:45:04 [25339] Use of uninitialized value $data{"MODEL"} in concatenation (.) or string at /etc/munin/plugins/apcupsd_ww line 205.

で、こちらがapcupsd_pctのエラーログです。

2015/08/23-02:45:07 [25339] Error output from apcupsd_pct:
2015/08/23-02:45:07 [25339] Can't exec "/etc/munin/plugins/apcupsd_pct": 許可がありません at /usr/share/perl5/vendor_perl/Munin/Node/Service.pm line 263, line 55.
2015/08/23-02:45:07 [25339] Service 'apcupsd_pct' exited with status 42/0.
2015/08/23-02:45:07 [25339] Error output from apcupsd_pct:
2015/08/23-02:45:07 [25339] Can't exec "/etc/munin/plugins/apcupsd_pct": 許可がありません at /usr/share/perl5/vendor_perl/Munin/Node/Service.pm line 263, line 56.
2015/08/23-02:45:07 [25339] Service 'apcupsd_pct' exited with status 42/0.

これらの情報を元に検索してみたのですが、各プラグインの設定ファイルに実行ユーザーをrootにする設定を入れてみたらどうか?という話しか見つかりませんでした。で、やってみたのですが現象変わらずだったので、そこは問題ではないようです。

そんでもって、プラグインのコードを読んでみたりしたのですが、普通にapcaccessコマンドを実行して得られる文字列から必要な情報を抜き取っているようにしか見えませんでした。ただ、気になるのはapcpusd_wwのエラーログの意味するところで、これは「$data{“MODEL”}が空の場合に発生」するエラーのようです。そこで、試しにmuninユーザーでapcaccessコマンドを叩いてみたのですが、まぁ普通に実行できてデータも取れているわけです。益々判らなくなってきました。

打つ手が無くなったところで、そう言えば「問題が発生するとSELinuxを無効にする輩が多い」という話を先日目にしたことを思いだして、試しにSELinuxを無効にしてみました。

# getenforce
Enforcing
# setenforce 0
# getenforce
Permissive

すると、正常にグラフが作られるではありませんか!問題はお前(SELinux)か!という事で、SELinuxを有効にした状態でグラフが正常に作られるための方策を調べてみますと、SELinuxのログ( /var/log/audit/audit.log )を見てアクセス拒否されているものを許諾するようにポリシーファイルを作って適用すれば良いと言う事が判明。早速やってみます。ちなみに、ログはこんな感じ。

type=AVC msg=audit(1440264906.523:31938): avc: denied { execute } for pid=23907 comm="/usr/sbin/munin" name="apcupsd_pct" dev="dm-0" ino=135780615 scontext=system_u:system_r:munin_t:s0 tcontext=unconfined_u:object_r:user_home_t:s0 tclass=file
type=AVC msg=audit(1440265143.263:31956): avc: denied { net_admin } for pid=24212 comm="munin-node" capability=12 scontext=system_u:system_r:munin_t:s0 tcontext=system_u:system_r:munin_t:s0 tclass=capability
type=AVC msg=audit(1440265205.038:31993): avc: denied { name_connect } for pid=24715 comm="apcaccess" dest=3551 scontext=system_u:system_r:munin_t:s0 tcontext=system_u:object_r:apcupsd_port_t:s0 tclass=tcp_socket
type=AVC msg=audit(1440265802.588:32100): avc: denied { read open } for pid=25993 comm="/usr/sbin/munin" path="/usr/share/munin/plugins/apcupsd_pct" dev="dm-0" ino=135780615 scontext=system_u:system_r:munin_t:s0 tcontext=unconfined_u:object_r:user_home_t:s0 tclass=file
type=AVC msg=audit(1440265802.588:32100): avc: denied { execute_no_trans } for pid=25993 comm="/usr/sbin/munin" path="/usr/share/munin/plugins/apcupsd_pct" dev="dm-0" ino=135780615 scontext=system_u:system_r:munin_t:s0 tcontext=unconfined_u:object_r:user_home_t:s0 tclass=file
type=AVC msg=audit(1440265802.594:32101): avc: denied { ioctl } for pid=25993 comm="perl" path="/usr/share/munin/plugins/apcupsd_pct" dev="dm-0" ino=135780615 scontext=system_u:system_r:munin_t:s0 tcontext=unconfined_u:object_r:user_home_t:s0 tclass=file

まぁ、これは一例で他にも幾つかありまして、作成したポリシーがこれ。

module mypol 1.0;
require {
type munin_t;
type services_munin_plugin_t;
type node_t;
type user_home_t;
type apcupsd_port_t;
class file { execute read open execute_no_trans ioctl };
class tcp_socket { name_connect };
class udp_socket { node_bind };
}
allow munin_t user_home_t:file { execute read open execute_no_trans ioctl };
allow munin_t apcupsd_port_t:tcp_socket { name_connect };
allow services_munin_plugin_t node_t:udp_socket { node_bind };

こんな感じで、ポリシーファイルを作成してコンパイル→適用という感じで処理すればOKです。

# vi mypol.te
# make -f /usr/share/selinux/devel/Makefile
Compiling targeted mypol module
/usr/bin/checkmodule: loading policy configuration from tmp/mypol.tmp
/usr/bin/checkmodule: policy configuration loaded
/usr/bin/checkmodule: writing binary representation (version 17) to tmp/mypol.mod
Creating targeted mypol.pp policy package
rm tmp/mypol.mod.fc tmp/mypol.mod
# semodule -i mypol.pp

これで無事にグラフが作成されるようになりました。

これって、結構格闘している人が居そうな感じがするのですが全く情報が無いのはなんなんでしょうねぇ。みんな諦めているのか、巧く処理できたけど情報を出してないだけなのか、結構不思議です。という事で、ここに残しておきますので、是非とも参考にしてみてください。

コメント

タイトルとURLをコピーしました