2013年2月5日火曜日

Postfix + Cacti + SELinux 環境でグラフ生成を何とかする #SELinux


最近、SELinux関連の記事を投稿中の @snicker_jp です。

きっかけ

Postfixの状態をCactiにてグラフ化する時に、SELinuxにハマったので、またSELinuxネタを投稿します。


まずは、

前提条件


(Postfixが入っているサーバー)

  • RedHat EL6 系 (CentOS 6、SL6とか)
  • net-snmp-5.5-41.el6.x86_64
  • postfix-2.6.6-2.2.el6_1.x86_64
以下のパッケージは、コマンド群のために必要です。
  • postfix-perl-scripts-2.6.6-2.2.el6_1.x86_64
  • policycoreutils-python-2.0.83-19.24.el6.x86_64
  • setroubleshoot-server-3.0.47-2.el6.x86_64


Postfix Queues 取得

Cacti • View topic - Postfix Queues
http://forums.cacti.net/viewtopic.php?f=12&t=16480

を使う。

情報源が古いのですが、mailgraph※ を入れるほどのことでもないので、
最低限のパッケージで情報が取れる」事を
重視しました。

findmailq.shの配置


  • findmailq.sh

#!/bin/bash
QUEUES="incoming active deferred hold"
for i in $QUEUES; do
COUNT=`find /var/spool/postfix/$i -maxdepth 5 -type f | wc -l`
printf "$i:$COUNT "
done


これを
 /usr/local/bin/findmailq.sh

上記に配置しました。

getmailq.shがフォーラムには書かれているのですが・・・先を読んでいくと
  • 「qshape」は遅いんだ!从o`・з´・)p
  • find」を使え!(o^―^o)
って書いてあるので、「findを使う方」を選択しました。
(それ以外に「du」を使う方法もある)

/etc/snmp/snmpd.conf編集

SNMPdの設定ファイルに以下を追記

extend findmailq /usr/local/bin/findmailq.sh

監視サーバーからの確認

以下のコマンドを実行
/usr/bin/snmpwalk -Ovn -v2c -c public [ターゲットのIP] NET-SNMP-EXTEND-MIB::nsExtendOutputFull

すると、
STRING: incoming:0 find: `/var/spool/postfix/active/14A83300364': Permission denied
active:0 find: `/var/spool/postfix/deferred/1/189143006A1': Permission denied
find: `/var/spool/postfix/deferred/A/AFC55300E82': Permission denied
find: `/var/spool/postfix/deferred/5/5DF28300A6B': Permission denied
find: `/var/spool/postfix/deferred/D/DF04C300685': Permission denied
find: `/var/spool/postfix/deferred/0/01796300693': Permission denied
deferred:0 hold:0


あああ、なんかおかしい・・・( ´Д⊂エーン

も、もしやSELinux??

SELinux が有効か?確認

# /usr/sbin/getenforce
Enforcing

はい、その通りのようで・・・

SELinuxとの戦い

SELinuxが有効でも、動作するように設定をします!( ー`дー´)キリッ

まずは、ログ確認!
/var/log/audit/audit.log
type=AVC msg=audit(1359969374.756:1474): avc:  denied  { getattr } for  pid=6198 comm="find" path="/var/spool/postfix/deferred/9/9C3BD3008AA" dev=sda2 ino=3147946 scontext=unconfined_u:system_r:snmpd_t:s0 tcontext=unconfined_u:object_r:postfix_spool_t:s0 tclass=file
type=SYSCALL msg=audit(1359969374.756:1474): arch=c000003e syscall=262 success=no exit=-13 a0=ffffffffffffff9c a1=1cab6f8 a2=7fffa9b934c0 a3=100 items=0 ppid=6197 pid=6198 auid=500 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=25 comm="find" exe=
"/bin/find" subj=unconfined_u:system_r:snmpd_t:s0 key=(null)
type=AVC msg=audit(1359969374.756:1475): avc:  denied  { getattr } for  pid=6198 comm="find" path="/var/spool/postfix/deferred/2/26B1A3009A4" dev=sda2 ino=3148196 scontext=unconfined_u:system_r:snmpd_t:s0 tcontext=unconfined_u:object_r:postfix_spool_t:s0 tclass=file
type=SYSCALL msg=audit(1359969374.756:1475): arch=c000003e syscall=262 success=no exit=-13 a0=ffffffffffffff9c a1=1cab6f8 a2=7fffa9b934c0 a3=100 items=0 ppid=6197 pid=6198 auid=500 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=25 comm="find" exe=
"/bin/find" subj=unconfined_u:system_r:snmpd_t:s0 key=(null)
type=AVC msg=audit(1359969374.757:1476): avc:  denied  { getattr } for  pid=6198 comm="find" path="/var/spool/postfix/deferred/7/7C3AF30052A" dev=sda2 ino=3147050 scontext=unconfined_u:system_r:snmpd_t:s0 tcontext=unconfined_u:object_r:postfix_spool_t:s0 tclass=file
type=SYSCALL msg=audit(1359969374.757:1476): arch=c000003e syscall=262 success=no exit=-13 a0=ffffffffffffff9c a1=1cab6f8 a2=7fffa9b934c0 a3=100 items=0 ppid=6197 pid=6198 auid=500 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=25 comm="find" exe=
"/bin/find" subj=unconfined_u:system_r:snmpd_t:s0 key=(null)
type=AVC msg=audit(1359969374.757:1477): avc:  denied  { getattr } for  pid=6198 comm="find" path="/var/spool/postfix/deferred/B/B91C43009E6" dev=sda2 ino=3148262 scontext=unconfined_u:system_r:snmpd_t:s0 tcontext=unconfined_u:object_r:postfix_spool_t:s0 tclass=file
type=SYSCALL msg=audit(1359969374.757:1477): arch=c000003e syscall=262 success=no exit=-13 a0=ffffffffffffff9c a1=1cab6f8 a2=7fffa9b934c0 a3=100 items=0 ppid=6197 pid=6198 auid=500 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=25 comm="find" exe=
"/bin/find" subj=unconfined_u:system_r:snmpd_t:s0 key=(null)
type=AVC msg=audit(1359969374.757:1478): avc:  denied  { getattr } for  pid=6198 comm="find" path="/var/spool/postfix/deferred/A/A3B083008D1" dev=sda2 ino=3147985 scontext=unconfined_u:system_r:snmpd_t:s0 tcontext=unconfined_u:object_r:postfix_spool_t:s0 tclass=file
type=SYSCALL msg=audit(1359969374.757:1478): arch=c000003e syscall=262 success=no exit=-13 a0=ffffffffffffff9c a1=1cab6f8 a2=7fffa9b934c0 a3=100 items=0 ppid=6197 pid=6198 auid=500 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=25 comm="find" exe=
"/bin/find" subj=unconfined_u:system_r:snmpd_t:s0 key=(null)
type=AVC msg=audit(1359969374.757:1479): avc:  denied  { getattr } for  pid=6198 comm="find" path="/var/spool/postfix/deferred/8/8B9963004FE" dev=sda2 ino=3147006 scontext=unconfined_u:system_r:snmpd_t:s0 tcontext=unconfined_u:object_r:postfix_spool_t:s0 tclass=file
type=SYSCALL msg=audit(1359969374.757:1479): arch=c000003e syscall=262 success=no exit=-13 a0=ffffffffffffff9c a1=1cab6f8 a2=7fffa9b934c0 a3=100 items=0 ppid=6197 pid=6198 auid=500 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=25 comm="find" exe=
"/bin/find" subj=unconfined_u:system_r:snmpd_t:s0 key=(null)
type=AVC msg=audit(1359969374.757:1480): avc:  denied  { getattr } for  pid=6198 comm="find" path="/var/spool/postfix/deferred/4/463E7300632" dev=sda2 ino=3147314 scontext=unconfined_u:system_r:snmpd_t:s0 tcontext=unconfined_u:object_r:postfix_spool_t:s0 tclass=file
type=SYSCALL msg=audit(1359969374.757:1480): arch=c000003e syscall=262 success=no exit=-13 a0=ffffffffffffff9c a1=1cab6f8 a2=7fffa9b934c0 a3=100 items=0 ppid=6197 pid=6198 auid=500 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=25 comm="find" exe=
"/bin/find" subj=unconfined_u:system_r:snmpd_t:s0 key=(null)

denied」って出ちゃってる・・・(´・ω・`)

では、これを修正する、ポリシーを作成します。

確認

まずは「audit.log」から、ヒントを確認
sudo sealert -a /var/log/audit/audit.log > ~snicker_jp/mylogfile.txt


mylogfile.txt

found 1 alerts in /var/log/audit/audit.log
--------------------------------------------------------------------------------

SELinux is preventing /bin/find from getattr access on the file /var/spool/postfix/deferred/7/7C3AF30052A.

*****  Plugin restorecon (99.5 confidence) suggests  *************************

If you want to fix the label.
/var/spool/postfix/deferred/7/7C3AF30052A default label should be postfix_spool_maildrop_t.
Then you can run restorecon.
Do
# /sbin/restorecon -v /var/spool/postfix/deferred/7/7C3AF30052A

*****  Plugin catchall (1.49 confidence) suggests  ***************************

If you believe that find should be allowed getattr access on the 7C3AF30052A file by default.
Then you should report this as a bug.
You can generate a local policy module to allow this access.
Do
allow this access for now by executing:
# grep find /var/log/audit/audit.log | audit2allow -M mypol
# semodule -i mypol.pp

今回は、書かれている通り実行します。

ポリシーファイルの作成

Rootで以下のコマンドを実行すると、
grep find /var/log/audit/audit.log | audit2allow -M mypol


ファイルが2つ生成されます。

  • mypol.te
  • mypol.pp

mypol.te


こちらはテキストファイル
module mypol 1.0;

require {
        type snmpd_t;
        type postfix_spool_t;
        class file getattr;
}

#============= snmpd_t ==============
allow snmpd_t postfix_spool_t:file getattr;


mypol.pp


こちらがポリシー適用用のファイル
適用はRootで以下を実行
semodule -i mypol.pp


監視サーバーから確認

そして、監視サーバーからコマンド再実行
/usr/bin/snmpwalk -Ovn -v2c -c public [ターゲットのIP] NET-SNMP-EXTEND-MIB::nsExtendOutputFull
すると、
STRING: incoming:0 active:0 deferred:7 hold:0
値が返ってきました。

細かい意味までは、現時点で理解し切れていないので、今後追記します。

postfixqueues.shの配置

Cactiにスクリプトを配置します。

<path_cacti>/scripts/postfixqueues.sh

  • postfixqueues.sh

#!/bin/bash
#/usr/share/cacti/site/scripts/postfixqueues.sh
# usage : /bin/bash <path_cacti>/scripts/postfixqueues.sh <management_ip> <snmp_community>

# snmp community
#$community = $2;

output=`/usr/bin/snmpwalk -Oav -v2c -c $2 $1 'NET-SNMP-EXTEND-MIB::nsExtendOutputFull."findmailq"' | cut -d '"' -f 2`
printf "$output"
echo


cacti_graph_template_postfix_queues.xmlのインポート


Cacti • View topic - Postfix Queueshttp://forums.cacti.net/viewtopic.php?f=12&t=16480

フォーラムから「cacti_graph_template_postfix_queues.xml」をダウンロードしてきます。

その後、CactiのWeb管理画面「Data Input Methods」から「Postfix Queues」を修正します。


テンプレート作ったのに・・・
うまくいかなかったので、いったん訂正
この下の訂正箇所は無視して、上記のだけで大丈夫です。

今回、「postfixqueues.sh」を少し修正したので、XMLを再作成しました。


Postfix Queues custom xml inspired from Cacti • View topic - Postfix Queues
https://gist.github.com/4706313

上記よりダウンロードください。


導入方法

CactiのWeb画面で、
Import Templates>Import Template from Local File>Import


Data Input Methodsから

「Postfix Queues」を選ぶ

「<snmp_community>」を引数として追加
 いったん「Save」する

「Input Fields」から「Add」を選択

この通り、入力したら「Save」

追加出来たら、「Save」します


これで、Devicesから追加したいサーバーを選んで
「Postfix Queue」を追加して、Graph作成すれば出来上がり。


結果

グラフ出来た!ワァ──ヽ(〃v〃)ノ──イ!!


まとめ


思っていたより、サラッと出来ると思っていただければ幸いです!

SELinuxとは、うまくお付き合いしていきましょう~(*^^)v

参考

mailgraph※

Cacti • View topic - Postfix monitoring with David Schweikert's Mailgraph?
http://forums.cacti.net/viewtopic.php?f=12&t=1571&start=90

Graphing Postfix with Cacti | Core Dump
http://coredump.id.au/graphing-postfix-with-cacti/

MIBの情報について以下より:
Net-SNMPで外部コマンドの結果を返すときに、そのMIBを固定したいの - (ひ)メモ
http://d.hatena.ne.jp/hirose31/20100820/1282301970

Zenback