PostgreSQL 8.1.4 -> 8.2beta

ここしばらく、Security Enhanced PostgreSQLのコードベースを8.1.4から8.2betaに変更するための作業をしている。
外部仕様としては大きな変更はないものの、内部的には実装がけっこう変わっている面もあって一筋縄では行かない。あと、厄介なのが追加の構文。

前バージョンで既にSELinux対応のためのコードを入れていたところで言うと、COPY TO/COPY FROMコマンドがそれにあたる。
今まではテーブルのみが対象だったが、SELECT文の結果をCOPY TOできるようになっているので、SELinuxのフックを挿入する箇所や、フック関数の仕様が変わってしまったり。

コードベースを8.2betaに変更するにあたって、最大の変更はセキュリティコンテキストを保持する方法の変更。今までは文字列型で格納していたため、ストレージ容量を無駄に喰うほか、avc_has_perm()を呼び出すために毎回security_context_to_sid()をコールしなければならず、パフォーマンス的に劣る。
今回、新たにpsid(Persistent Security IDentifier)型を定義した。これは4byte長の整数値で、pg_selinuxシステムカタログのタプルOIDと一致する。pg_selinuxシステムカタログには、text型のセキュリティコンテキスト文字列表現が格納されているので、これに対する代理キーとして働くわけだ。
で、SE-PgSQLの内部表現としては4byte整数だが、クライアントからの入出力は全てセキュリティコンテキスト文字列になる。文字列が与えられるとpg_selinuxを参照してpsidに変換し、ユーザに見せる時にはpsidからセキュリティコンテキストの文字列を引っ張ってくる。
丁度、macアドレス型が'xx:xx:xx:xx:xx:xx'で与えられた文字列を、6byte固定長で保存するのに似ている。

もう一つ素晴らしいことに、psidをハッシュキーとするAVCをSE-PgSQL用に実装した。そもそものモチベーションは、malloc/pallocのメモリ管理方式の違いによる実装の面倒くささを裂けるためだが、これによって、普通の処理パスではsecurity context⇔SIDのような変換が発生しなくなった。これでコーディングが超楽になる。ハラショー!