linux:kernel:namespace:user_namespace

文書の過去の版を表示しています。


名前空間の操作,その 6: ユーザ名前空間

進行中の名前空間のシリーズを続けよう.この記事ではユーザ名前空間について細かく見ていく.この機能は大枠は Linux 3.8 で実装が完了した機能である (XFS他の多数のファイルシステムに対する残作業は続いている.後者は 3.9 でマージされた).ユーザ名前空間はユーザとグループ ID の名前空間ごとのマッピングが可能になる.これはユーザ名前空間内と名前空間外で異なるプロセスとグループの ID を持つ事が可能になるということである.中でも注目すべきは,プロセスは名前空間外では 0 でない ID を持ち,同時に名前空間内では 0 のユーザ ID を持つ事ができることである.言い換えると,プロセスはユーザ名前空間外では特権を持たない操作だが,名前空間内では root 特権を持っているという事である.

ユーザ名前空間は clone() や unshare() を呼ぶ時に CLONE_NEWUSER フラグを指定することで作成する.(他のタイプの名前空間を作る時に使うフラグと違って) Linux 3.8 から使え,ユーザ名前空間を作成するのに特権は不要である.以下で挙げる例では,ユーザ名前空間の全ては ID 1000 の非特権ユーザを使って作られている.

ユーザ名前空間の調査を始めるために,小さなプログラム demo_userns.cを使う.これは新しいユーザ名前空間内で子プロセスを作成する.子プロセスは単純に実効ユーザとグループ ID をケーパビリティと同時に表示するだけのものである.非特権ユーザでこのプログラムを実効すると以下のような結果が得られる.

    $ id -u          # Display effective user ID of shell process
    1000
    $ id -g          # Effective group ID of shell
    1000
    $ ./demo_userns 
    eUID = 65534;  eGID = 65534;  capabilities: =ep

このプログラムからの出力には面白いことがいくつかある.その一つは,子プロセスに割り当てられるケーパビリティである.“=ep” という文字列 (cap_to_text() 関数がケーパビリティをテキスト表示で表示) は,子プロセスで有効で許可されたフルセットのケーパビリティを持つことを示している.このプログラムが非特権アカウントで実効したにも関わらずである.ユーザ名前空間が作られると,名前空間の最初のプロセスは名前空間内でのフルセットのケーパビリティを与えられる.これによりプロセスは,名前空間内で他のプロセスが作成される前に,名前空間内での必要な初期化が可能になる.

  • linux/kernel/namespace/user_namespace.1377776600.txt.gz
  • 最終更新: 2013/08/29 11:43
  • by tenforward