リンク先が同じiノードを指す場合の問題点

報告があった。
matchpathcon_filespec_add: conflicting specifications for
/usr/sbin/named and /usr/sbin/lwresd, using
system_u:object_r:usr_sbin_named_t.
のようなエラーが出るらしい。

これは、ハードリンクの問題。
以下の出力を見ると、
[ynakam@localhost ~]$ ls -i /usr/sbin/named
2406121 /usr/sbin/named
[ynakam@localhost ~]$ ls -i /usr/sbin/lwresd
2406121 /usr/sbin/lwresd

ファイル名は違うけど、iノード番号が同じ(=2406121)。
SELinuxは内部的には、iノード番号でファイルを管理している。

fcファイルには、
/usr/sbin/named system_u:object_r:usr_sbin_named_t
/usr/sbin/lwresd system_u:object_r:usr_lwred_t
のように記述されていて、
同じinode番号のものに、違うタイプ付けをしようとしている。
これはまずい。
つまり、inode番号 "2406121"が指すファイルへのタイプ付けが不定(usr_sbin_named_t,usr_lwred_tのどっちが付与されるのか分からない)
になってしまう。

直さなきゃなぁ。どうすりゃいいか。
以下案。
(1) fcファイルのファイル名のiノード番号を全部得る
/usr/sbin/named system_u:object_r:usr_sbin_named_t
/usr/sbin/lwresd system_u:object_r:usr_lwred_t
が同じiノードを指していることを発見。
(2) 片方のエントリを削除(どっちでもいい)する
/usr/sbin/lwresd system_u:object_r:usr_lwred_t
を削除。
/usr/sbin/lwresd system_u:object_r:usr_sbin_named_t
のように書きかえ
(3)
これだと、/usr/sbin/lwresdに
アクセスできるように設定されているドメインが、
usr_sbin_named_tにアクセスできないため、/usr/sbin/lwredに
アクセスできなくなってしまう。
解決するには、typealiasで、usr_sbin_named_tの別名をusr_lwred_tにしてやればよいはず。

いつ直そう…
そういえば、dir:searchパーミッションを暗黙的に許可する話も実装しないとなぁ。