mod_selinux
ApacheのBASIC認証と、SELinuxのsetexeccon()を組み合わせるモジュールを作成してみた。以下からダウンロードできる。
http://sepgsql.googlecode.com/files/mod_selinux-0.1-r906.i386.rpm
http://sepgsql.googlecode.com/files/mod_selinux-0.1-r906.src.rpm
まず、mod_selinux-0.1-r906.i386.rpmをインストール
次に、HTTP BASIC認証のセットアップ。/var/www/cgi-bin に CGIスクリプトを配置するとして、以下のように .htaccess を作成する。
AuthUserFile /var/www/cgi-bin/.htpasswd AuthName "Input Your Name And Password" AuthType Basic require valid-user selinuxUserRange kaigai s0:c0 selinuxUserRange tak s0:c1 selinuxUserRange ymj s0:c2
ここでは、ユーザkaigaiにMCSラベルs0:c0を、takにs0:c0を、以下略・・・。
続いて、CGIスクリプトの準備。手の込んだものを作っても仕方ないので、とりあえず、ユーザ固定でDBにログインして以下のクエリを実行し、その結果と自身のセキュリティコンテキストを表示するようにする。
SELECT security_context, * FROM drink;
ちなみに、生の drink テーブルは以下のような内容を含んでいる。
TABLE: drink security_context | id | name | price -----------------------------------------+----+-------+------- system_u:object_r:sepgsql_table_t:s0 | 1 | water | 110 system_u:object_r:sepgsql_table_t:s0 | 2 | coke | 120 system_u:object_r:sepgsql_table_t:s0:c0 | 3 | milk | 150 system_u:object_r:sepgsql_table_t:s0:c0 | 4 | juice | 130 system_u:object_r:sepgsql_table_t:s0:c1 | 5 | beer | 240 system_u:object_r:sepgsql_table_t:s0:c1 | 6 | wine | 380 system_u:object_r:sepgsql_table_t:s0:c2 | 7 | soda | 120 system_u:object_r:sepgsql_table_t:s0:c2 | 8 | sake | 420 system_u:object_r:sepgsql_table_t:s0:c3 | 9 | lemon | 160
で、以下が実行結果。
ユーザ kaigai (s0:c0) の場合 current = system_u:system_r:httpd_sys_script_t:s0:c0 prev = system_u:system_r:httpd_t:s0 security_context | id| name |price| ---------------------------------------+---+------+-----+ system_u:object_r:sepgsql_table_t:s0 | 1 |water | 110 | system_u:object_r:sepgsql_table_t:s0 | 2 |coke | 120 | system_u:object_r:sepgsql_table_t:s0:c0| 3 |milk | 150 | system_u:object_r:sepgsql_table_t:s0:c0| 4 |juice | 130 |
ユーザ tak (s0:c1) の場合current = system_u:system_r:httpd_sys_script_t:s0:c1 prev = system_u:system_r:httpd_t:s0 security_context | id| name |price| ---------------------------------------+---+------+-----+ system_u:object_r:sepgsql_table_t:s0 | 1 | water| 110 | system_u:object_r:sepgsql_table_t:s0 | 2 | coke | 120 | system_u:object_r:sepgsql_table_t:s0:c1| 5 | beer | 240 | system_u:object_r:sepgsql_table_t:s0:c1| 6 | wine | 380 |
ユーザ ymj (s0:c2) の場合 current = system_u:system_r:httpd_sys_script_t:s0:c2 prev = system_u:system_r:httpd_t:s0 security_context | id| name |price| ---------------------------------------+---+------+-----+ system_u:object_r:sepgsql_table_t:s0 | 1 | water| 110 | system_u:object_r:sepgsql_table_t:s0 | 2 | coke | 120 | system_u:object_r:sepgsql_table_t:s0:c2| 7 | soda | 120 | system_u:object_r:sepgsql_table_t:s0:c2| 8 | sake | 420 |
という感じである。
これの意味するところは、Webアプリのユーザに、OS/DBMS上での権限を完全に整合性を保った上で関連付けることができたということである。
今まで、SELinuxのデモをやっても、なかなか可視化が難しいというのが悩みどころだったが、これは使える。『SELinuxでSQLインジェクションにも効果アリ!』とかは、かなりインパクトがあると思いますぞ。