Nagiosアップデートしたら動かなくなった

Nagios で問題を通知する

先日Nagiosが動作していない問題に遭遇した際のトラブルシューティングに関して記しています。ちなみに原因はselinuxでした。

はじめに

弊社ではシステム監視にNagios ( Nagios+Gangliaでシステムの異常を検知する ) を利用しているのですが、先日Nagiosが動作していない問題に遭遇しました ( yum-cron による自動アップデートがトリガのようです )。

動作させるまでに少々手こずったので、トラブルシューティング手順を以下示します。

環境

環境は以下。
Nagios+Gangliaでシステムの異常を検知する 執筆時点からは nagios はメジャーバージョンが上がっています。

OS CentOS 6.9
nagios nagios-4.3.2-5

事象

Nagiosの管理画面が以下のようになっていました。

Nagios:Not running

調査

実行確認

先ずは実際に Not running であるか確認。

# ps aux | grep nagios

実行されていれば幾つかのプロセス ( /usr/sbin/nagios ) が表示されるはずですが、表示されず。確かに Not running のようです。

再起動してみます。

# /etc/rc.d/init.d/nagios restart
Running configuration check...

が、起動しませんでした。

設定確認

以前は普通に動いていたので、設定周りに問題が発生したのかと思い、設定を確認します。

# nagios -v /etc/nagios/nagios.cfg

Warning: failure_prediction_enabled is obsoleted and no longer has any effect in host type objects (config file '/etc/nagios/objects/templates.cfg', starting at line 52)
Warning: failure_prediction_enabled is obsoleted and no longer has any effect in service type objects (config file '/etc/nagios/objects/templates.cfg', starting at line 163)
WARNING: The normal_check_interval attribute is deprecated and will be removed in future versions. Please use check_interval instead.
WARNING: The retry_check_interval attribute is deprecated and will be removed in future versions. Please use retry_interval instead.
WARNING: The normal_check_interval attribute is deprecated and will be removed in future versions. Please use check_interval instead.
WARNING: The retry_check_interval attribute is deprecated and will be removed in future versions. Please use retry_interval instead.
WARNING: Extinfo objects are deprecated and will be removed in future versions
WARNING: Extinfo objects are deprecated and will be removed in future versions
WARNING: Extinfo objects are deprecated and will be removed in future versions
   Read object config files okay...

Running pre-flight check on configuration data...

Checking objects...
        Checked 71 services.
        Checked 18 hosts.
        Checked 3 host groups.
        Checked 1 service groups.
        Checked 1 contacts.
        Checked 1 contact groups.
        Checked 29 commands.
        Checked 5 time periods.
        Checked 0 host escalations.
        Checked 0 service escalations.
Checking for circular paths...
        Checked 18 hosts
        Checked 0 service dependencies
        Checked 0 host dependencies
        Checked 5 timeperiods
Checking global event handlers...
Checking obsessive compulsive processor commands...
Checking misc settings...

Total Warnings: 0
Total Errors:   0

幾つかの WARNING (設定が無効になったもの、及び、将来のバージョンで無効になるため非推奨なもの) が表示さえていますが、エラーはないようなので設定自体には大きな問題はなさそうです。

※将来のバージョンアップで問題が出る可能性もあるため、警告が表示されている設定に関しては設定を変更しました。

設定でエラーが無いにもかかわらず起動しないので、原因は別のところにあるようです。

Selinux

selinux を有効にしているため、念のため一時的に無効にして起動してみます。

# getenforce
Enforcing
# setenforce 0
# getenforce
Permissive
# /etc/rc.d/init.d/nagios start
Starting nagios: done.

起動完了のメッセージが出力され、プロセスも確認できました。

# ps aux | grep nagios
...
nagios   13250  0.0  0.1  20656  1656 ?        Ss   16:18   0:00 /usr/sbin/nagios -d /etc/nagios/nagios.cfg
nagios   13252  0.0  0.0  12072   960 ?        S    16:18   0:00 /usr/sbin/nagios --worker /var/spool/nagios/cmd/nagios.qh
nagios   13253  0.0  0.0  12072   956 ?        S    16:18   0:00 /usr/sbin/nagios --worker /var/spool/nagios/cmd/nagios.qh
...

管理画面の表示も "Not running" だった箇所が "Daemon running with PID xxxxx" 表示になりました。

対策

selinux の問題だという事が判明したため対策します。

以前は selinux 有効でも普通に動作していたので、何らかの設定がなされているのでは?と思い、先ずは selinux のポリシー確認から実施。

ツールのインストール

確認のためのツールがインストールされていない場合インストールします。

# yum install policycoreutils-python

ロードされたポリシーの確認 (semodule)

# semodule -l | grep nagios
nagios  1.8.0

nagios 用のポリシーが存在している事が確認できました。

※実際のポリシーファイル (.ppファイル) は /etc/selinux/targeted/modules/active/modules/ 以下に存在します。

既存のポリシーをデコンパイルして (.ppファイルは .teファイルをコンパイルしたもの) 設定を編集してから再コンパイル/ロードできないか?と思ったのですが、.ppファイルを .teファイルに変換する方法が判らなかったため、追加ポリシーを別途作成する方向で対策する事にします。

Selinuxを有効にする

selinux を有効にし、Nagios を再起動する事で何が問題となっているかを調査します。

# setenforce 1
# getenforce
Enforcing
# /etc/rc.d/init.d/nagios restart
Running configuration check...

再起動しない訳ですが、/var/log/audit/audit.log にselinux のログが出力されるので、nagios 関連の出力がなされている事を確認します。

ログ内容の確認

audit.log を確認すると幾つか問題が見つかるはずです ( 以下例 )。

type=AVC msg=audit(1504079819.551:30610): avc:  denied  { write } for  pid=14780 comm="nagios" path="/tmp/.configtest.5GETBf8L" dev=dm-0 ino=28926 scontext=unconfined_u:system_r:nagios_t:s0 tcontext=unconfined_u:object_r:initrc_tmp_t:s0 tclass=file
type=SYSCALL msg=audit(1504079819.551:30610): arch=c000003e syscall=59 success=yes exit=0 a0=d7cce0 a1=d75d40 a2=d7f260 a3=7fff36be5be0 items=0 ppid=14773 pid=14780 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts1 ses=4791 comm="nagios" exe="/usr/sbin/nagios" subj=unconfined_u:system_r:nagios_t:s0 key=(null)
type=AVC msg=audit(1504079819.560:30611): avc:  denied  { chown } for  pid=14780 comm="nagios" capability=0  scontext=unconfined_u:system_r:nagios_t:s0 tcontext=unconfined_u:system_r:nagios_t:s0 tclass=capability
type=SYSCALL msg=audit(1504079819.560:30611): arch=c000003e syscall=93 success=no exit=-1 a0=3 a1=1f0 a2=1f1 a3=7fffafd47af0 items=0 ppid=14773 pid=14780 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts1 ses=4791 comm="nagios" exe="/usr/sbin/nagios" subj=unconfined_u:system_r:nagios_t:s0 key=(null)

audit2allow

もう少しユーザーフレンドリーなメッセージで確認したい場合、audit2allow を利用するとよいかもしれません ( これも policycoreutils-python に含まれる)。

# grep nagios /var/log/audit/audit.log | audit2allow -w -a

type=AVC msg=audit(1504079819.551:30610): avc:  denied  { write } for  pid=14780 comm="nagios" path="/tmp/.conf
igtest.5GETBf8L" dev=dm-0 ino=28926 scontext=unconfined_u:system_r:nagios_t:s0 tcontext=unconfined_u:object_r:i
nitrc_tmp_t:s0 tclass=file
        Was caused by:
                Missing type enforcement (TE) allow rule.

                You can use audit2allow to generate a loadable module to allow this access.

type=AVC msg=audit(1504079819.560:30611): avc:  denied  { chown } for  pid=14780 comm="nagios" capability=0  sc
ontext=unconfined_u:system_r:nagios_t:s0 tcontext=unconfined_u:system_r:nagios_t:s0 tclass=capability
        Was caused by:
                Missing type enforcement (TE) allow rule.

                You can use audit2allow to generate a loadable module to allow this access.

type=AVC msg=audit(1504079866.014:30618): avc:  denied  { connect } for  pid=14826 comm="check_nrpe" scontext=u
nconfined_u:system_r:nagios_services_plugin_t:s0 tcontext=unconfined_u:system_r:nagios_services_plugin_t:s0 tcl
ass=unix_dgram_socket
        Was caused by:
                Missing type enforcement (TE) allow rule.

                You can use audit2allow to generate a loadable module to allow this access.

「全然ユーザーフレンドリーじゃねぇよ!」と思う方もいるかもしれませんが、一応対策を書いてくれています ( "You can use audit2allow to generate a loadable module to allow this access" )。

モジュールの作成とロード

audit2allow を利用してロード可能なモジュールを作成しろとのお達しなので、これに従いましょう。

# cd 適当な作業ディレクトリ
# grep nagios /var/log/audit/audit.log | audit2allow -M my-nagios

my-nagios 部分は適当に変更してください。先に semodule -l で確認した際に表示されたモジュールとはかぶらない名前にしましょう。

上記コマンドを実行すると、以下ファイルが作成されます。

  • my-nagios.te
    テキストデータでポリシーが記載されている
  • my-nagios.pp
    .teファイルをコンパイルしたもの

作成されたポリシーをロードします (暫くかかります)。

# semodule -i my-nagios.pp

ロード完了後 semodule -l すれば作成/ロードしたモジュールもリストされるはずです。

Nagios再起動

モジュールの作成/ロードが完了したら、Nagios を再起動して動作を確認しましょう。

Nagiosは起動後に定期的にホストやサービスのチェック処理を行いますが、これら処理中に selinux の制限に引っかかる可能性もあります。こういった場合再度 audit2allow を利用して audit.log (後のエラーも追記された) からポリシーを生成する事で対応が可能です。

まとめ

アップデート起因っぽかったので、設定周りに問題が発生したのか?と思ったのですが、予想に反して selinux が原因でした。

但し、nagios に関しても環境構築時からはメジャーバージョンが上がって、デフォルトの設定も色々と変更されているような感じ ( まだちゃんと見れていない ) なので、どこかでバージョン4系用に設定をやり直した方がよさそうな気もしています。

( 次に問題が出るまで放置される可能性が高そうですが…… )