文書の過去の版を表示しています。
名前空間の操作,その 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