最近、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がフォーラムには書かれているのですが・・・先を読んでいくと
って書いてあるので、「findを使う方」を選択しました。
- 「qshape」は遅いんだ!从o`・з´・)p
- 「find」を使え!(o^―^o)
(それ以外に「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」を修正します。
テンプレート作ったのに・・・
うまくいかなかったので、いったん訂正
この下の訂正箇所は無視して、上記のだけで大丈夫です。
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>」を引数として追加 |
「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