カーネル読書会(85th)

YLUGカーネル読書会で、POSIX capabilityについて話してきた。

http://www.ylug.jp/modules/pukiwiki/index.php?plugin=attach&pcmd=open&file=YLUG080328_POSIX_Capabilities.pdf&refer=%5B%5BYLUG%5D%5D

capability自体は 2.4.x カーネルの頃から存在した機能だが、最近のカーネル(2.6.24〜)で、大幅な拡張が加えられている。
説明した内容は、以下の3つ。
■ FILE POSIX Capability (2.6.24 merged)

  • SetUIDを置き換える F(permitted)
  • RBACを実現する F(inheritable)

■ Per-Process Capability Bounding-Set (2.6.25 coming soon)

  • 特定セッションでは、rootの特権がマスクされる。

■ Per-Process SecureBits support (now in -mm tree)

  • 特定セッションでは、rootが特権をもてなくする。

この辺を組み合わせて利用すると、Linuxでもうまく『最小特権』を実現できる(ハズ)。

SELinux他との住み分けをどの様に説明するかというのが、一つの問題だが、基本的には次のように考えている。

■データ保護機能 ... SELinux, POSIX ACLなど

  • プロセス(Subject)とデータ(Object)の間の操作(Action)を規定する。
  • アクセス制御や情報フロー制御が目的で、S-V-Oの組み合わせに対して許可/禁止の判断を行う。

■特権制御 ... POSIX Capability

  • プロセス(Subject)の特権を細分化し、個々にon/offする。
  • "DAC無視"というのは、特権の一つであり、本質ではない。
  • プロセス(Subject)が、操作(Action)に紐付けられた特権を持っているかどうかが本質で、S-Vの組み合わせで許可/禁止が決まる。
  • アクセス制御の対象であるデータ(Object)は登場しない。

講演の終わった後でのレセプションでは、プレゼンが分かり易かったというコメントをもらう。伝わりやすいプレゼントいうのは、最近のテーマなだけに嬉しい。本当は準備不足だったんだけどね。

あと、質疑応答の中で、新しいパッチのアイデアが出された。
曰く、capabilityを縮退させる操作に CAP_SETPCAP が必要なのはおかしいとのこと。
例えば、SetUIDプログラムの/bin/pingは、RawSocketを作った後 setuid() によって一般ユーザに戻っているが、POSIX capabilityを適用する場合にはこのような手法は不可。しかし、そのために余計な特権を持たせるのも本末転倒。そもそも、特権を捨てるのに特権が必要というのはどうよ?という疑問が。

個人的にも同感なので、軽井沢から帰ってきたらパッチ書いてみる。