Labeled Network Fallback Context

Paul Moore氏の投稿した一連のパッチを試してみた。
http://marc.info/?l=selinux&m=119464373613977&w=2

SELinuxはネットワーク経由で接続してきた相手方プロセスのセキュリティコンテキストを取得するAPIを持っていて、これはlibselinuxのgetpeercon()関数で提供されている。
SE-PostgreSQLでもクライアントの権限を決定するのに、このAPIを利用しているというくらい重要な機能。

ただ、ローカルの通信なら何も設定は不要だが、ネットワーク越しの通信となると若干設定が面倒になる。Labeled IPsecという(あるいはCIPSOというTrusted Solaris/Trusted HP-UXの機能)セキュリティコンテキスト透過な通信を行うための設定を行う必要がある。これらを総称してLabeled Networkと呼んでいる。

彼のパッチを適用すると、こういったLabeled Networkが設定されていない場合にgetpeercon()を呼び出した際のセキュリティコンテキストを設定することができる。
設定にはnetlabelctlというツールを利用する。例えば

# netlabelctl unlbl add interface:eth0 \
                   address:192.168.1.0/24 \
                   label:staff_u:staff_r:staff_t:s0

といった具合である。こうすると192.168.1.0/24からの接続は、Labeled Networkが設定されていない場合でもstaff_u:staff_r:staff_t:s0というフォールバックを持つことになる。

SE-PostgreSQLで試してみた。

[kaigai@fedora8 ~]$ psql -q -h 192.168.1.10 postgres
Password:
postgres=# SELECT sepgsql_getcon();
     sepgsql_getcon
-------------------------
 staff_u:staff_r:staff_t
(1 row)

postgres=#

こんな感じで、(Labeled Networkを利用しない場合は)設定されたセキュリティコンテキストが適用される。

では。これの何が嬉しいのか?

まず、Windowsをクライアントにすることができる。Labeled Networkは、通信相手もSELinuxが前提となるので、いかんせん適用条件が厳しい。これが入ることで、SE-PostgreSQLの利用しやすさが格段に上がる。

次に、接続元ネットワーク毎にMCSのカテゴリをアサインして強制アクセス制御を適用することが可能になる。
例えば、営業部 = 192.168.1.0/24 技術部 = 192.168.2.0/24 計画部 = 192.168.3.0/24 というネットワークを使っているとする。
これらのネットワークに各々MCSのカテゴリを関連付け、自部門のカテゴリに属するレコードしか参照できないようにすれば、セキュリティ的にも十分要件を満たしつつ、部門間のデータベースを統合する事が可能になる。

↓イメージとしてはこんな感じ
http://kaigai.sblo.jp/article/4247935.html

俺的には、ウルトラ待ち焦がれていた新機能という感じ。
ただ、何回か試しているうちに panic したりという事もあったので、再現条件を確認して Paul にフィードバックを返さないと。