あなたの天然記念物
ホーム更新雑談Perl鉄ゲタランドナーコースガイド自転車Linuxリンク経歴連絡先

CGIスクリプトにSELinuxからIPC使用許可を出す方法 (2012.11.14)

背景

ページ毎にカウンタを用意して、集計ファイルに記録する方法を使っていますけれど、 工夫なしに集計ファイルへ記録してしまうと 複数のクライアント(ホームページを見に来る人)が同時に見に来た場合、集計ファイルが破損、不正確になります。
それを防止するためにIPCのセマフォを使っていました。

しかしながら、何年か前にLinuxを入換えるとSELinux(セキュリティ強化Linux)になっていて CGIからセマフォを使えなく(正しくは、許可方法がわからなく)なっていました。

SELinux、CGI、セマフォの条件が重なる人が少なくて、そのままセマフォなしで使い続け、たまにファイル破損で全ページのカウンタが0になる有様です。 年月も経過して、ホームページで対処方法を説明してくれる人もいましたので、再挑戦して、無事にCGIでセマフォを使えるようになりました。 本当、このテの調整したのを書いてるページが少ないんだよね(実感)。

手順

2012.11.14 最近はログ自体を秘匿しているようです。 ログにはこんな感じで出力されていて、具体的なメッセージはありません。 Nov 13 20:22:50 localhost setroubleshoot: SELinux is preventing postlist.cgi (httpd_sys_script_t) "node_bind" to <不明> (inaddr_any_node_t). For complete SELinux messages. run sealert -l ????????-????-????-????-???????????? コンソールで次のコマンドを実行して初めて具体的なエラーと解説が表示されます。 sealert -l ????????-????-????-????-???????????? これまでログに出力されていたメッセージも表示されるので、それを使ってセキュリティポリシーを作成できました。 初めに、/var/log/messagesをviで開き、問題のメッセージを1行だけ新規ファイルへ書き出します(ファイル名は例えばcgisem1.txtで)。 次に、セキュリティボリシーのテキストとモジュールを作成します。
audit2allow -M cgisem1 --input cgisem1.txt
この時にファイルcgisem1.te(テキスト)、cgisem1.pp(モジュール)が作成されます。 続いて、モジュールをインストールします(かなり時間がかかります with P3/1GHz/Slot A)。
semodule --install cgisem1.pp

更に、インストールが終ってから、ページカウント(自分でページを見る)させて/var/log/messagesを確認します。

エラーを解消する必要最小限の許可しか出ていないので、別のエラーが発生しますから、エラーが止まるまで最初から繰り返します。 この時、新規ファイルの名前はcgisem2.txtというように番号付けて別ファイルにしたほうが許可の順番を理解できます。 私のケースでassociate、unix_write、read writeの3回をクリアして、ようやくエラーなしで実行できるようになりました。 こんな簡単な作業ですけれど、数年前にはどこを検索しても(注・日本語に限る)見つけられませんでした。 今では、少なくとも「操作のヒントになる」ページが見つかります。 こういった具体例をご覧いただくことで、SELinuxのエラーを解消できれば幸いです。

発生したログの内容

《1回目 - associate》

Apr 13 18:23:46 paula kernel: audit(1271150626.068:191647): avc:  denied  { associate } for  pid=4853 comm="accesslog.cgi" key=1234

scontext=unconfined_u:system_r:httpd_sys_script_t:s0 tcontext=system_u:system_r:initrc_t:s0 tclass=sem


《2回目 - unix_write》

Apr 13 18:35:49 paula kernel: audit(1271151349.053:191652): avc:  denied  { unix_write } for  pid=4914 comm="accesslog.cgi" key=1234 

scontext=unconfined_u:system_r:httpd_sys_script_t:s0 tcontext=system_u:system_r:initrc_t:s0 tclass=sem


《3回目 - read write》


Apr 13 18:56:37 paula kernel: audit(1271152597.817:191689): avc:  denied  { read write } for  pid=5034 comm="accesslog.cgi" key=1234 

scontext=unconfined_u:system_r:httpd_sys_script_t:s0 tcontext=system_u:system_r:initrc_t:s0 tclass=sem