尻尾の _raw

busybox用 matchpathcon() を作成していて気が付いたのだが、libselinuxのセキュリティコンテキストを取得する関数に _raw 付きのバージョンが用意されている。
例えば、getcon()関数に対応するgetcon_raw()関数。
こやつを使うと、mcstransデーモンの状態に関わらず、生の状態の(変換されない)MLS/MCSラベルを取得することができる。

何が嬉しいかって、SE-PostgreSQLでセキュリティコンテキストを管理する時に、今まではMLS/MCSラベルのTranslation設定が変更になるたび、保存されていたセキュリティコンテキストがInvalidになってしまうという問題があった。
なので、SE-PostgreSQLのQuick Documentationには mcstrans を止めるように記載してある。

それが、_raw 付きの関数を使うことで一貫したラベル名で管理することができる。そして、ユーザ側に表示する時だけMLS/MCSラベルを変換すればよい。
そのためには以下の関数が利用できる。

int selinux_trans_to_raw_context(security_context_t trans,
security_context_t * rawp);
int selinux_raw_to_trans_context(security_context_t raw,
security_context_t * transp);

たぶん、XACE/SELinuxの人がユーザ空間でセキュリティコンテキストを管理するのに困ったからだと邪推。やることが似てる分、問題意識も共通というわけか。