Now mod_selinux ready...?

そろそろ Fodora Project への提案を考えている mod_selinux モジュールであるが、地味に改善を進めている。

設定ディレクティブの見直し

従来は、以下の2つの設定項目のみを用意していた。

selinuxMappingFile
ユーザ/IPアドレスとドメインの対応関係を記述した設定ファイルを指定する。
selinuxDefaultDomain
上記の設定にマッチしない場合のドメインを指定

これを以下のように変更した

selinuxDomainMap
ユーザ/ドメインの対応関係を記述した設定ファイルを指定する。selinuxMappingFileと似ているが、IPアドレスを使った対応関係の記述を省略する。
selinuxDomainEnv
指定した環境変数に格納されている値を、コンテンツハンドラのドメインとして利用する。
selinuxDomainSet
selinuxDefaultDomainと同じ。問答無用で

リモートのIPアドレスを利用したドメインの対応付けがselinuxDomainMapから消えているように見えるが、これはApache標準の SetEnvIf を使って記述する事ができる。
例えば、192.168.1.0/24からの接続に user_webapp_t:s0:c0 を割り当てるなら、以下のように設定すればよい。

SetEnvIf Remote_Addr "192\.168\.1\.[0-9]+$" SELINUX_DOMAIN user_webapp_t:s0:c0
selinuxDomainEnv SELINUX_DOMAIN
selinuxDomainSet anon_webapp_t:s0

ここでは、SetEnvIfがRemote_Addrと与えられた正規表現を比較して、SELINUX_DOMAIN環境変数に値をセットする。で、それはselinuxDomainEnvで指定されているので、もし値がセットされていれば、それをドメインとして設定する。
もしマッチしなければ、selinuxDomainSetで指定したanon_webapp_t:s0はフォールバックとして機能する。

Keep-Alive接続との共存

利用するフックの位置を変えることで、Keep-Alive接続のループの内側で使い捨てスレッドを生成するように変更。
頭の痛い問題が一つ消えた。

セキュリティポリシーモジュール

mod_selinuxセキュリティポリシーモジュールを真っ当なものにした。
従来は、TEのポリシーが足りてなかったので、MCSしかデモできなかったが、とりあえず user_webapp_t ドメインと anon_webapp_t ドメインの2つを用意した。
両方とも httpd_sys_content_t は読めるが、httpd_user_content_t は user_webapp_t しかアクセスできない。
認証済み/未認証とかで区別するのに使えるかな。

もう一つは、Apache/httpdをMCSカテゴリ付きで動作するようにしたこと。mod_selinux.ppがrange_transitionルールを追加したので、何もしないと s0-s0:c0.c1023 で動作するが、さすがにこれは権限を持ちすぎなので、接続を受け付ける前にカテゴリをドロップする。
この設定は selinuxServerDomain で行い、デフォルトでは s0 だが、MCSを使う場合は適宜修正する必要がある。

mod_authn_sepgsql モジュール

認証を SE-PostgreSQL と連携して行う。これの紹介は次回にて。

ちなみに、同じコンセプトで作られた mod_auth_pgsql というモジュールが存在するが、コイツの実装では、Apache/httpdからパスワードのフィールドを読み出し可能にしなければならない。
という事は、スクリプトがバグバグでSQLインジェクションを仕掛けられた場合、認証情報を攻撃者に読み出されてしまう可能性がある。


ダウンロードは下記URLより。
http://code.google.com/p/sepgsql/downloads/list

[root@masu ~]# rpm -ql mod_selinux
/etc/httpd/conf.d/mod_authn_sepgsql.conf
/etc/httpd/conf.d/mod_selinux.conf
/usr/lib/httpd/modules/mod_authn_sepgsql.so
/usr/lib/httpd/modules/mod_selinux.so
/usr/share/doc/mod_selinux-2.2.1884
/usr/share/doc/mod_selinux-2.2.1884/LICENSE
/usr/share/doc/mod_selinux-2.2.1884/README
/usr/share/selinux/mls/mod_selinux.pp
/usr/share/selinux/targeted/mod_selinux.pp
/var/www/mod_selinux.map