読者です 読者をやめる 読者になる 読者になる

MCS設定のアイデア

OSS/Linux

Fedora Core 5に新たに入ったMCSだが、デフォルト状態ではカテゴリが設定されているファイルはなく、そのままでは利用することができない。
しかし、設定次第では非常に面白いことができそう。

まず、ファイルアクセスの権限に関しては以下の条件を満たす必要がある
"プロセスのカテゴリ" が完全に "ファイル/ディレクトリのカテゴリ" を包含していること。

次に、プロセスがカテゴリを変更するときの制約条件だが、以下のようになっている。

mlsconstrain process { transition dyntransition }
*1;

つまり、一旦設定されたカテゴリはより縮小する方向にしか遷移できない。
例外が mcssetcats 属性を付与されたドメインだが、一般にログインシェルで使用される unconfined_t ドメインはこの制約により、カテゴリは縮小方向にしか遷移しない。(これは root だろうが unconfined_t だろうが絶対の制約)

実はこの特性を使うと面白いことができる。
仮に、カテゴリ c0 をメール管理者、カテゴリ c1 をWeb管理者とすると
/etc/postfix/* に c0 カテゴリを付与、/etc/httpd/* と /var/www/* に c1 カテゴリを付与すると、これらメール/Web管理者以外は設定ファイルにアクセスできないという状態ができ上がる。

特定のユーザにc0、別のユーザにc1といったカテゴリを付与すれば、相互には遷移できないので、なんちゃってRBACのようなことができてしまうではないか。

しかし、問題が2つほど。

  1. 設定ファイルのDACパーミッションがあるために、どうしてもrootにならざるを得ない局面が出てくる。
  2. unconfined_tがinitrc_exec_tを実行すると、range_ransition制約によってカテゴリ無しの状態に遷移してしまう。
(2)に関しては、今のところポリシーの編集以外に方法はない気がする。

(1)に関しては、Linux Capabilityを一般ユーザに付与するプログラムを作成して、必要なroot特権だけを付与するということでなんとかできるかなと妄想中。
例えば、ユーザ kaigai がメール管理者でカテゴリ c0 に属しているとき、/etc/postfix/* を編集するためには DAC_OVERRIDE 特権が必要だが、プロセスケーパビリティを付与するためのプログラムで、ユーザ kaigai に対する認証を行うことで、カテゴリc0 かつ DAC_OVERRIDE 特権を持つ状態ができ上がる。
このプログラムには root のSet-UIDを立てておき、認証に成功すればユーザのカテゴリに応じたLinux-Capabilityを設定するようにすればよい。

ここでのポイントは、rootの認証を要求しないこと。
RBACっぽい設定が可能であっても、肝心なところでrootが必要なのはダサい。

*1: h1 dom h2 ) or ( t1 == mcssetcats