トップ «前の日記(08/31/2011) 最新 次の日記(10/27/2011)» 編集

本 日 の h o g e

hogeとはワイルドカードのようなものです。日々起こった、さまざまなこと −すなわちワイルドカード− を取り上げて日記を書く、という意味で名付けたのかというとそうでもありません。適当に決めたらこんな理由が浮かんできました。

更新情報の取得には rdflirs を使ってもらえると嬉しいです.


10/26/2011 ふむ [長年日記]

tDiary 3289日目

[Linux] capabilities

いつまでも最新がうんこの話ではみっともないのでまともな話で埋めるべく立ち上がった 1 人の戦士 atzm がちょっくら調べてみたことをとりとめもなく特に何のまとめもせずつらつらと書いてみる.

さて Linux には root という奴がいてこの人は何でもできちゃうスーパーマンなのだということは語るに及ばずなのだけれど,実はこのスーパーな特権を root から剥奪したり,別のプロセス (スレッド) に付与したりできる capability (ケーパビリティ) というものがある.

capability はいくつかの種類に分かれていて,例えば「任意のファイルを chown できる」とか「mount できる」とか,普通 root でしかできないような操作をその種類毎にプロセス (スレッド) に設定できる.

ただしこの機能が off のような扱いになっているシステムも多い (2.6.24 より前のカーネルなら殆ど).capability の種類の中に「許可する capability を変更できる」というものがあるのだけれど,そのようなシステムではこれが全てのプロセスに与えられていないからだ. なおこのようなシステムで capability を実質的に使えるようにする手段はぐぐれば大量に出てくる.

...のだけれど,日本語で得られる情報の多くが 2.6.24 より前のやり方なので注意. 2.6.24 で file capability がサポートされ,2.6.25 以降から /proc/sys/kernel/cap-bound はなくなった. 2.6.24 以降では file capability がサポートされているので,あるファイルに対する execve 時にセットする capability を設定できる. 2.6.25 以降では capability bounding set はスレッド単位の概念になり,システム全体で共通のものは消え去った.

例えば cat /proc/self/status とかしたときに出てくる Cap*** の値が,その cat プロセスの持っている capability の集合を示す (スレッドなら 更に下の task/TID を見る). より分かりやすい表示を求めるなら libcap や libcap-ng といったツールの getpcaps や pscap 等を使う. セットしたい場合は,2.6.25 以降なら,呼び出し元プロセスの capability bounding set が full であれば,setcap 等で実行ファイルに許可したい capability を permitted/effective にセットしてやれば良さそうだ.試してないけど.

追記

2.6.39 で file capability を試してみた.ファイルシステム依存なのではまって,カーネルのコードを流し読むはめに... 拡張属性サポートを入れてない reiserfs 上で試してて「あれー使えない」とはまっていただけだったくさい.

で拡張属性サポートの入った ext3 上の実行ファイルに capset コマンドで設定しておき,capability bounding set が full の一般ユーザ (のスレッド) が実行したら,通常は EPERM る処理を実行することができた.