第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 連載インデックス |
- Windows起動前後にデバイスを守る工夫、ルートキットを防ぐ (2017/7/24)
Windows 10が備える多彩なセキュリティ対策機能を丸ごと理解するには、5つのスタックに分けて順に押さえていくことが早道だ。連載第1回は、Windows起動前の「デバイスの保護」とHyper-Vを用いたセキュリティ構成について紹介する。 - WannaCryがホンダやマクドにも。中学3年生が作ったランサムウェアの正体も話題に (2017/7/11)
2017年6月のセキュリティクラスタでは、「WannaCry」の残り火にやられたホンダや亜種に感染したマクドナルドに注目が集まった他、ランサムウェアを作成して配布した中学3年生、ランサムウェアに降伏してしまった韓国のホスティング企業など、5月に引き続きランサムウェアの話題が席巻していました。 - Recruit-CSIRTがマルウェアの「培養」用に内製した動的解析環境、その目的と工夫とは (2017/7/10)
代表的なマルウェア解析方法を紹介し、自社のみに影響があるマルウェアを「培養」するために構築した動的解析環境について解説する - 侵入されることを前提に考える――内部対策はログ管理から (2017/7/5)
人員リソースや予算の限られた中堅・中小企業にとって、大企業で導入されがちな、過剰に高機能で管理負荷の高いセキュリティ対策を施すのは現実的ではない。本連載では、中堅・中小企業が目指すべきセキュリティ対策の“現実解“を、特に標的型攻撃(APT:Advanced Persistent Threat)対策の観点から考える。
|
|