セキュリティコンテキストの持ち方

PostgreSQLSELinux対応にあたって、databaseやtableなどのDBオブジェクトにセキュリティコンテキストを持たせる必要がある。
まず、ここから手を加えることにする。

PostgreSQLにはシステムカタログと言うものがあり、システムがメタ情報を保存するためのテーブルを用意しているので、ここを拡張すればDBオブジェクトとセキュリティコンテキストを関連付けることができる。

問題はその方法。
案1.文字列でセキュリティコンテキストを持たせる
拡張が必要なシステムカタログには、文字列によってセキュリティコンテキストを保持させる。単純でかつ、select, updateなどのDDLでも素直に扱いやすい。
一方、問題としてはパフォーマンスが致命的に遅くなることと、可変長文字列方を用いた場合にシステム初期化に必要なシステムカタログの実装が複雑になることが挙げられる。固定長文字列を用いる場合には、DBサイズの不要な増加を引き起こすことになる。

案2.セキュリティコンテキスト保持用のシステムカタログを用意する
pg_selinuxシステムカタログを定義し、一意なIDであるoidとtext(可変長文字列)型のセキュリティコンテキストを持たせる。
拡張が必要なシステムカタログには、pg_selinuxのoidを参照するOID型のカラム(PSID)を追加する。テキスト形式のセキュリティコンテキストを取り出す場合にはjoin操作で行うことができる。セキュリティコンテキストの長さの制約や、DBサイズの無意味な増加も抑えられる。
一方、問題としてはupdate, insert時の煩雑さ。現時点で考えている方法は、システム列「security_context」を準備して、selectやwhere句で参照された場合にはpg_selinuxを参照して文字列を返し、updateやinsertの対象となった場合には対応するpg_selinuxのoidをPSID列に挿入するような問合せに書き換えること。

今回、試してみたのは案2。システム列の追加はまだ行っていないが、セキュリティコンテキストの長さ制約から解放されるのは意味が大きい。
ひとまず、この実装ですすむことにする。