ハードリンクの扱い、再考(2)

日本はLinux Worldか。私はこちらで黙々と開発。。
sourceforge.netのshellサーバが昨日からずっと落ちてて、seedit.sourceforge.netの更新ができないorz

さて、またも、ハードリンクの扱いが気になる。
http://d.hatena.ne.jp/himainu/20060519#1148069594
より

  • seedit-restoreconのふるまい
    • a)親,先祖ディレクトリのラベルがついている時(default_t,rootdir_t含む)
    • b)unlabeled_tがついてる時
    • c)親、先祖ディレクトリのラベルがついてないが,ディレクトリラベルの時はラベル付け

c)はまずい気がしてきた。
ディレクトリ単位のアクセス制御してるとき、ハードリンクのラベルが保存されない。
例えば、
/foo/secret/
以下に、機密情報が格納されるとする。
foo_secret_tタイプが付与される。
/foo/secret/foo.txtのハードリンクが、
/bar/foo.txtに作成されたとする。
/bar/foo.txtのラベルも、foo_secret_t。
が、
seedit-restorecon /bar
が走ると、/foo/secret/foo.txtのラベルがbar_tになってしまう!
これはまずい。

条件「c」ははずすべきだ。

そうなると、影響を受けるのは、
「元からあるファイル」の条件、

両方記述されてない場合、ディレクトリの名前が後のほうが優先。
allow /etc/shadow,/var/shadow両方がどこにも書いてない時。
/etc/shadow,/var/shadowには、var_tが付与される。-> /var/shadowを「元からあるファイル名」
★しかし、条件c)により、どちらかに対するallowが書かれ次第、ラベルが付与されなおされる。★

の★★部分が無くなることに。しかし、★★が無くなったほうが自然。
「元からあるファイル」に設定をしなければいけない、という条件が徹底されるので。

「元からあるファイル」がどれだか分かるよう、
「ハードリンク警告」を出すようにしたほうがいいのかもしれない。

  • 同じディレクトリに存在するハードリンクをテスト。。

/etc/shadow /etc/z_shadow
という名前で作られてしまうと?
テスト結果OK。
allow /etc/z_shadow r;を加えて、/etc/z_shadowへのラベルを生成しても。/etc/z_shadowは、etc_shadow_tのまま保存された。

まとめ ハードリンクの扱い(改訂版)

  • ルール: ハードリンクへのアクセス制御「元からあるファイル名を記述する必要がある」
  • 「元からあるファイル」の基準

以下、/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を「元からあるファイル名」

  • 今の実装だと、ホームディレクトリ間のハードリンクは保存されない。
  • カギとなるのはseedit-restoreconプログラム。
    • seedit-restoreconは、以下のラベルがついているファイルに対してラベルを張り替える
      • a)親,先祖ディレクトリのラベルがついている時(default_t,rootdir_t含む)
      • b)unlabeled_tがついてる時