execmemとかのgrantedが煩いので対処メモ

今時FC5なんていうシステムを使っている人がどれくらいいるか分からないけど、自分用メモ。
環境:FedoraCore5(Kernel 2.6.15-1.2054_FC5)
参照: (FC5のSELinuxについての日本語FAQ)
   Dan Walshによるexecmem, execstackについての記事
   Dan WalshによるSELinuxのboolean(スイッチ変数)の操作についての記事

問題:とあるphpのスクリプトをcronで実行したところ、execmem, execstackのgrantedのAVCログがやたらと出力されて、ログが肥大して困った。
原因:FC5のデフォルトのSELinuxの設定(targetedポリシー)では、execmem, execstackはスイッチ変数(setseboolコマンドで操作できる変数)で許可されているのだが、その代わりにかならず"granted"というログが残る。
なお、許可されているかどうかは getsebool というコマンドで分かる(全部表示したければ、-aオプションを使う)

# getsebool allow_execmem
allow_execmem --> on
# getsebool allow_execstack
allow_execstack --> on

対処:まず、スイッチ変数を操作して、わざとexecmem, execstackを実行できないようにする。このとき、enforceのモードだと、プログラムが動かなくなるので、permissiveのモードにしておくこと。

# setenforce 0
# setsebool allow_execmem=0 allow_execstack=0

こうすると、dmesgコマンドで実行が拒否されたログが出力されるようになる。

# dmesg | tail -2
audit(1210392001.815:33499293): avc:  denied  { execstack } for  pid=4160 comm="php" scontext=root:system_r:unconfined_t tcontext=root:system_r:unconfined_t tclass=process
audit(1210392001.815:33499294): avc:  denied  { execmem } for  pid=4160 comm="php" scontext=root:system_r:unconfined_t tcontext=root:system_r:unconfined_t tclass=process

この、拒否された部分だけを使って、新しいポリシーを手作りする。

# dmesg | awk '$3 == /denied/' > xxx.avcs
# audit2allow -M localxxx < xxx.avcs
# checkmodule -M -m -o localxxx.mod localxxx.te
checkmodule:  loading policy configuration from localxxx.te
checkmodule:  policy configuration loaded
checkmodule:  writing binary representation (version 5) to localxxx.mod
# semodule_package -o localxxx.pp -m localxxx.mod
# semodule -i localxxx.pp

ちなみに、execmem, execstackを許可するポリシーはこんな感じになるようだ。

module localxxx 1.0;

require {
        role system_r;

        class process { execmem execstack };

        type unconfined_t;
 };

allow unconfined_t self:process { execmem execstack };

あとは、ログファイルを監視してみる。

# tail -f /var/log/audit.log
 :
 :
(以下が、新しいポリシーがロードされたときのログ)
May xx xx:xx:xx foo kernel: audit(1210392392.248:33499296): avc:  granted  { load_policy } for  pid=12345 comm="load_policy" scontext=user_u:system_r:unconfined_t tcontext=system_u:object_r:security_t tclass=security
May xx xx:xx:xx foo kernel: security:  3 users, 6 roles, 1161 types, 135 bools, 1 sens, 256 cats
May xx xx:xx:xx foo kernel: security:  55 classes, 38708 rules
  :
  :
(もう、grantedのログは出力されない)

ところで、本来ならば、execmemやexecstackというのは悪意あるソフトウェアが使う常套手段なわけで、それを見逃す危険が高くなるわけだから、実際には、問題となっているスクリプトに適切なコンテキストを設定して、なんでもかんでもexecmem等を許可するようなポリシーは書いちゃいけない。Dan Walshなんかは、そのためのヒントを彼のブログに一杯書いてくれている。(でも実行はなかなかできない俺)