seeditのハードリンクの扱い見直し

上記考察を元に、seeditのハードリンクの扱いを見直すことに。
今のseeditはまずいことが分かった。
restoreconが設定の反映のたびに走るので、
ハードリンク経由で変なラベルがつく可能性がある。
備忘録。

seedit-restorecon

ってのを作った。
ハードリンクされた可能性があるファイルのラベルづけをスキップするもの。
既存のrestoreconのソースをちょろっと改造して作った。

seeditのラベル生成規則は、ファイル名の/を_に置き換えるという単純なもの。
この規則に反したラベルを持っているファイルは、
ハードリンクされているか、mvされたか、ファイルタイプ遷移で作られたかのどれか。
seeditは、こういったファイルに対しては、ラベル付けを保留する。

具体的には、以下の基準を満たすときのみ,restreconする。

  • a)親,先祖ディレクトリのラベルがついている時(default_t,rootdir_t含む)
  • b)unlabeled_tがついてる時
  • c)親、先祖ディレクトリのラベルがついてないが,ディレクトリラベルの時はラベル付け
    • ハードリンクされてても、ファイル単位でアクセス制御かけるようになってない

例:
ln /etc/shadow /var/chroot/etc/shadow
したとする。
すると、
/var/chroot/etc/shadow のタイプはetc_shadow_t。

named_tに対して、
allow /var/chroot/etc/* r,s
としたとする。
seedit-loadすると、
/var/chroot/etc/

var_chroot_etc_tラベルをつけるルールが生成され、
seedit-restorecon -R /var/chroot/etc
が走る。しかし、
/var/chroot/etc/shadow のタイプはetc_shadow_tであり、
/var/chroot/etc,/var/chroot, /var ,/いずれのラベルでもないので、
ラベル付けをスキップ。
そのほかの/var/chroot/etc以下には、ラベル付けが走る。
#普通にrestoreconすると/etc/shadowにvar_chroot_etc_tがついてしまう!

seeditでのハードリンクの扱いは?

ハードリンクを作った場合は、
「元からあるファイル名を記述しないとアクセスできない」
ことになる。
例えば、seeditインストール後に
/etc/shadow -> /var/chroot/etc/shadow
なるハードリンクを作った場合,
/var/chroot/etc/shadow
という名前のファイルにアクセスしたい人は、
allow /etc/shadow r;
と書かなければいけない。

「初期状態」について

問題は、「元からあるファイル名」の扱い。
もし、
/etc/shadow, /var/chroot/etc/shadowハードリンクが
seeditインストール時に同時に存在したとすると、
インストール時の
seedit-load -i(fixfiles relabel)の時
ラベル付けがコンフリクトして、不定になる。

どっちを「元からあるファイル名」にするかのルールを決めた。
以下、/etc/shadow, /var/shadowがハードリンクと仮定。

  • deny/allowが明示的に記述されたファイルについては、そのファイルのラベルが付与される。

allow /etc/shadowは書かれてるが、
allow /var/shadowはどこにも書かれてないと、
etc_shadow_tが付与される。-> /etc/shadowを「元からあるファイル名」

  • 両方記述されてる場合、名前が若いほうが優先。

allow /etc/shadow
allow /var/shadowが記述されていると、
etc_shadow_tが付与。-> /etc/shadowを「元からあるファイル名」
#chroot環境は/var/に置くことが多いので..

  • 両方記述されてない場合、ディレクトリの名前が後のほうが優先。

allow /etc/shadow,/var/shadow両方がどこにも書いてない時。
/etc/shadow,/var/shadowには、var_tが付与される。-> /var/shadowを「元からあるファイル名」
しかし、条件c)により、どちらかに対するallowが書かれ次第、ラベルが付与されなおされる。

  • これに伴う変更
    • seedit-converterのfile_label.c
      • file_contextsファイルのソート順番を変更
      • ディレクトリ全体ラベル(昇順), ファイル単体ラベル(降順), 動的生成ラベル、ディレクトリラベル の順番


「初期状態」を設定する人(私か。。)は,
ハードリンクに対しては、一つだけ設定したほうがいいな。
例えば、/etc/shadow, /var/chroot/etc/shadow
というハードリンクがある場合は、
「常に/etc/shadowだけを使う」ようにしよう。

うーんハードリンクは厄介だ。
が、デフォルトではハードリンクは使わないので、あまりユーザには関係ないかな。
この強化は、「何かあった場合に安全側にころぶため」のもの。
さらに、audit2spdlに頑張ってもらって、ユーザに見えないようにしないとな。。

結論

今日の変更でseeditから生成されるSELinuxポリシも情報フロー分析可能になった気がする。
(あいまいな結論だ)
設定反映時のrestoreconで、ラベル名が変わらなくなったので。