mod_selinux

ApacheBASIC認証と、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のデモをやっても、なかなか可視化が難しいというのが悩みどころだったが、これは使える。『SELinuxSQLインジェクションにも効果アリ!』とかは、かなりインパクトがあると思いますぞ。