seeditのRBAC改善:ホームディレクトリの設定

いままで、ホームディレクトリは
~/public_html
のような指定しかできない。
/home/ynakam/public_html
のようなことはできなかった。
これだと、RBACを有効にした場合とても困る。
全てのロールに
全ユーザのホームディレクトリの書き込み権限を与えることになり、
RBACの意味がなくなる。

これを改善。

以下修正点メモ。

  • converter.confに

homedir_list /home
を追加。

  • add_file_user_listで、

アクセス制御ルールに現れる
/home/username/
のusernameを収集。

  • void append_homedir_rule()

~/<パス>から始まるルールがあったら、
/<全てのホームルート>/<収集したユーザ名>/<パス>
に置換したルールを追加する。

  • ファイルコンテキスト出力部:file_label.c

コードを整理。
genhomedirconを使わず、自分でホームディレクトリの設定も書くようにした。
homedir_templateがいらなくなった

  • seedit-restorecon.c

ホームディレクトリのラベル -> ユーザホームディレクトリラベル
への変更時には、ラベルを付け変える。
この場合はハードリンクは守られないかも?

「ユーザホームディレクトリラベル」
は、「/home」にあるやつしかサポートしてない、、直さなきゃ。。

  • 制限事項

allow ~/public_html/** r,s;
deny /home/ynakam/public_html/**;
の場合denyは動かない。
あるユーザのファイルだけ隠す、ってのができない
警告がでるようにした。

seeditでのRBAC設定の例

さて、これでRBACもちゃんと設定できるようになったはず。
# seedit-rbac on
として、リブートするだけでRBACが有効になる。
webmaster用ロールを作ってみる。
ユーザynakamが、webmaster_rロールでログインできるように設定。
ynakamをUIDゼロで作って、
/etc/seedit/policy/webmaster_r.sp
を以下のように作成する。

{
role webmaster_r;
user ynakam;
include user_common.sp;
include common-relaxed.sp;
allow /home/ynakam/** r,w,s;
allow /var/www/** r,w,s;
}

ynakamのUIDはゼロにしなくてはいけないので、
Linuxのアクセス制御は働かなくなるが、
他のユーザのホームディレクトリには触れない。

デフォルトのSELinuxにたいする優位点にもなる。
なぜなら、デフォルトのSELinuxでRBACを設定するのは至難。
なにせstrictポリシを使わなきゃいけないし、
default_contextsやらもややこしい。

メモ:

今の実装でも問題がある。。。
user_rロールは一般ユーザ用のロール。
allow /home/ユーザ名/** r,w,s;
をユーザの数だけ書かなければならない。。いいのかなぁ。

allow ~/** r,w,s;としちゃうと、
他のロールでログインするユーザのホームディレクトリをアクセスされる恐れがある。
駄目だし。。

allow ~/** r,w,sと間違って設定されたとき、
dac_override, dac_read_search, setuid, setgid capabilityが意味ある気がしてきた。。
これらのcapabilityは復活させたほうがいいかもしれない。。

もしくは次の解決を思いついた。
roleの中で
allow ~/**
と記述されても、
「他のロールで使われているユーザのホームディレクトリにはアクセスできない」
ようにする。
例:
role webmaster_r;
user web;

role logmaster_r;
user loguser;

role user_r;
user user_u;
allow ~/** r,w,s;

としても、
user_rは、/home/web, /home/logmasterにはアクセスできない。

void append_homedir_rule()
で、/home/web, /home/logmasterを追加しないようにすれば済みそう。
あとは、
user文が現れたら、そのユーザのホームディレクトリを強制ラベル付けするようにする(root以外)。


を実装。これで、~/** を使っても問題ない。user_rロールを設定できるように。

DAC関連のcapability

さて、次は、capability
dac_override, dac_read_search, setuid, setgid
の復活だな。。
これらは、
SELinuxのポリシがDACより荒い場合に意味がでてくるもの。
原理的には、SELinuxのポリシはDACを完全にカバーできるはずなのだが、
現実的には,そうはいかなかった。
例。
user_rロールの時に意味がでてくる。
user_rは、一般ユーザ全てのためのロール。
なので、
一般ユーザの全ホームディレクトリの読み書きが可能に設定されている。
何が起こるか。

  • 1) ynakam, himainuというユーザがいるとする。
  • 2) ynakamがなんらかのexploitでuid=0になる。
  • 3) himainuのホームディレクトリを破壊可能

しかし、dac_override capabilityを制限できれば、
3)で、dac_overrideのチェックが発生して拒否できるはず。
その他, setuid, setgidもそう。
攻撃の可能性を減らす意味がある気がしてきた。