読者です 読者をやめる 読者になる 読者になる

Table/Columnのセキュリティコンテキスト

OSS/Linux

夏休み計画のうち、PostgreSQLのTable/Columnに対するセキュリティコンテキストを付与する機能に関してはひとまず実装できた。
テーブルのセキュリティコンテキストはpg_classのreltblseconに、カラムのはpg_attributeのattcolseconに格納し、共にNameData型として定義した。
実際にやったことは単なるシステムカタログの拡張なので、実作業的にはそんなに大した事をやっているわけではないが、いくつか引っかかる点があった。

その1. include/catalog/pg_XXXX.h ファイル
PostgreSQLの初期DBを作成する initdb コマンドは、テンプレートファイルに記述された独自形式の簡易SQLを使って初期DBを作成する。この初期DBというのが、pg_attribute等の名前で参照できるシステムカタログである。
テンプレートファイルは make 時に生成されるが、これは include/catalog/pg_XXXX.h ファイルを元に生成される。
これらのヘッダファイルには以下のような謎構文が並んでおり、

DATA(insert ( 1249 attrelid 26 -1 4 1 0 -1 -1 t p i t f f t 0));

スクリプトがこれらを整形して回るという具合である。
ヘッダファイルなので #ifdef ... #endif 等が効くと嬉しいのだが、テンプレートを作成に用いられるパーサはcpp(プリプロセッサ)ではなく、awkである。そのため、--enable-selinuxでシステムカタログのデータ構造が多少変化する場合にはちょっと頑張らないといけない。
結局、awkを使って単純な(ネスト不可、pg_config.hしか参照しない)#ifdef〜#endifのパーサをスクリプトに追加した。
ただ、これはコンフィグによって頻繁にシステムカタログの構造が変更されるのを避けたいという設計意図のような気もする。

その2.セキュリティコンテキストの長さ
この箇所の修正は後日のTODOリストへ。
ハンドリングのし易さからNameData型を使用したが、これは固定長64byteの文字列のエイリアスである。通常、PostgreSQLのテーブル名などの識別子を格納するために利用される。
SELinuxのTargetedポリシで使われているセキュリティコンテキストでもっとも長いものは、45byteの長さがある。これにカテゴリの部分がくっつくので、MCSなぞをガンガン使うようなやり方だとすぐに長さが不足してしまう。
ここは本質的には text のような可変長データ型にすべきであるが、まだシステムカタログのメンバとして text 型を使った時のハンドリング方法を追いきれていないので暫定的な実装ということになる。
一応、共に文字列型なのでより上位の実装レイヤには影響しない…はず。