第4回 NRPEプラグインを作って確認「SELinux、異常なし!」


面 和毅
サイオステクノロジー株式会社
OSSテクノロジーセンター
開発支援グループ
グループマネージャー
2007/10/3


 SELinuxのステータスを返すプラグインの作成

 それでは、sestatusコマンドを利用して、SELinuxの状態を監視するための簡単なプラグインを作成しましょう。

●1. SELinuxのオン/オフ状態

 SELinuxのオン/オフ状態を見るために、“check_selinux_status.pl”を作成しました。簡略化のために、sestatusコマンドではなくgetenforceコマンドの出力を使用しています。

#! /usr/bin/perl
$STATE_OK              = 0;
$STATE_WARNING     = 1;
$STATE_CRITICAL     = 2;
$STATE_UNKNOWN    = 3;
$STATE_DEPENDENT = 4;

chomp($SELINUX_STATE = `/usr/sbin/getenforce`);
if($SELINUX_STATE eq 'Enforcing') {
         print "SELinux mode is $SELINUX_STATE\n";
         exit $STATE_OK;
} elsif ($SELINUX_STATE eq 'Permissive') {
         print "SELinux mode is $SELINUX_STATE\n";
         exit $STATE_WARNING;
} elsif ($SELINUX_STATE eq 'Disabled') {
         print "SELinux mode is $SELINUX_STATE\n";
         exit $STATE_CRITICAL;
} else {
         print "SELinux has unknown state\n";
         exit $STATE_UNKNOWN;
}
リスト2 check_selinux_status.plの内容

 ステータスは、SELinuxの状態をそれぞれ、

0: Enforcing
1: Permissive
2: Disabled
3: Unkown

としました。

●2. SELinuxのポリシーバージョン

 SELinuxのポリシーバージョンを見るために、“check_selinux_policy_version.pl”を作成しました。

#! /usr/bin/perl
$STATE_OK              = 0;
$STATE_WARNING     = 1;
$STATE_CRITICAL     = 2;
$STATE_UNKNOWN    = 3;
$STATE_DEPENDENT = 4;

$SELINUX_POLICY_VERSION = (`/usr/sbin/sestatus | grep version`);
chomp($SELINUX_STATE = `/usr/sbin/getenforce`);
if($SELINUX_STATE eq 'Enforcing') {
         print "SELinux $SELINUX_POLICY_VERSION\n";
         exit $STATE_OK;
} elsif ($SELINUX_STATE eq 'Permissive') {
         print "SELinux $SELINUX_POLICY_VERSION\n";
         exit $STATE_WARNING;
} elsif ($SELINUX_STATE eq 'Disabled') {
         print "SELinux is DISABLED\n";
         exit $STATE_CRITICAL;
} else {
         print "SELinux has unknown state\n";
         exit $STATE_UNKNOWN;
}
リスト3 check_selinux_policy_version.plの内容

 ステータスは、

0: バージョン番号 (Enforcing/Permissive)
2: バージョン番号なし(Disabled)
3: Unkonwn

としています。

●3. SELinuxが出力するログ

 SELinuxが出力するログに関しては、特にプラグインを自作しなくても“check_log”というプラグインが用意されていますので、こちらをそのまま使用します。

 check_logプラグインの使い方ですが、

check_log -F ログファイル名 -O 古いログファイル名 -q パターン

となります。例えば、selinuxのポリシーにより拒否(denied)されたログをチェックしたい場合には、

check_log -F /var/log/messages -O /usr/local/nagios/tmp/selinux_denied_log -q "avc: denied"

とします。これにより、/var/log/messages以下のパターン“avc: denied”に合致するログが出力されます。

 なお、/var/log/messagesと/usr/local/nagios/tmp/selinux_denied_logとの両方でパターンマッチングを行い、差異がない場合にはログは出力されません。これにより、check_logプラグインを実行しても、変化がない場合にはログは出力されませんので、常に新しいエラーログが出力されていくことになります。この場合、ステータスはすべて“Critical”となります。

 同様に、SELinuxにより許可(granted)されたログも見たい場合には、

check_log -F /var/log/messages -O /usr/local/nagios/tmp/selinux_granted_log -q "avc: granted"

とします。

 CentOS 4.5のデフォルトでは、rootアカウント以外は/var/log/messagesを見ることができなくなっています。そのため、マシンA上に新たに“secure”というグループを作成し、nagiosユーザーをそのsecureグループに所属させ、secureグループから/var/log/messagesがReadできるようにパーミッションを修正しています。/etc/xinetd.d/nrpeのgroup部分も合わせて修正しています。

変更前:
-rw------- 1 root root 225488 May 20 03:52 /var/log/messages.
変更後:
-rw-r----- 1 root secure 1743315 Jul 22 00:59 /var/log/messages
---------------------------------------------------------------
/etc/groupの内容

secure:x:503:nagios
---------------------------------------------------------------/etc/xinetd.d/nrpeのgroup部分を修正

# default: on
# description: NRPE (Nagios Remote Plugin Executor)
service nrpe
{
         flags                 = REUSE
         socket_type       = stream
         port                  = 5666
         wait                  = no
         user                 = nagios
#       group                = nagios
         group                = secure
         server              = /usr/local/nagios/bin/nrpe
         server_args       = -c /usr/local/nagios/etc/nrpe.cfg --inetd
         log_on_failure     += USERID
         disable             = no
         only_from         = 192.168.231.131
}
リスト4 SELinuxのログを見るための変更点

 nrpe.cfgファイルの修正

 上記で作成したプラグインとコマンドを結び付けるため、マシンA上の/usr/local/nagios/etc/nrpe.cfgファイルを修正します。リスト5の行を付け加えました。

command[check_selinux_status]
         =/usr/local/nagios/libexec/check_selinux_status.pl
command[check_selinux_policy_version]
         =/usr/local/nagios/libexec/check_selinux_policy_version.pl

command[check_selinux_denied]
         =/usr/local/nagios/libexec/check_log -F /var/log/messages -O /tmp/selinux_denied_log -q "avc: denied"
command[check_selinux_granted]
         =/usr/local/nagios/libexec/check_log -F /var/log/messages -O /tmp/selinux_granted_log -q "avc: granted"
リスト5 nrpe.cfgへ追加する行

 それぞれのコマンドを実行するために、マシンB上のNagiosサーバの設定を修正します。

define service{
      use                        local-service ; Name of service template to use
      host_name               plone2
      service_description   SELinux
      check_command       check_nrpe!check_selinux_status
    }

define service{
      use                        local-service ; Name of service template to use
      host_name               plone2
      service_description   SELinux-Policy-Version
      check_command       check_nrpe!check_selinux_policy_version
    }

define service{
      use                        local-service ; Name of service template to use
      host_name               plone2
      service_description   SELinux-denied-log
      check_command       check_nrpe!check_selinux_denied
    }

define service{
      use                        local-service ; Name of service template to use
      host_name               plone2
      service_description   SELinux-granted-log
      check_command       check_nrpe!check_selinux_granted
    }
リスト6 Nagiosサーバの設定を修正する

 出力結果は、図3、図4のようになります。

図3 マシンAの監視結果。Enforcingモードであることを検知している

図4 マシンAがPermissiveモードへ切り替わると、Nagiosで検出が行われWarningとなる

2/3

Index
NRPEプラグインを作って確認「SELinux、異常なし!」
  Page1
Nagios+NRPEによるSELinuxの監視
SELinuxの何を監視するか
Page2
SELinuxのステータスを返すプラグインの作成
nrpe.cfgファイルの修正
  Page3
NRPE用ドメインの作成
NRPEの動作を確認しよう


スイッチ・オン! SELinux 連載インデックス


Security&Trust フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Security & Trust 記事ランキング

本日 月間