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インジェクションにも効果アリ!』とかは、かなりインパクトがあると思いますぞ。