文書の過去の版を表示しています。
名前空間の操作,その 6: ユーザ名前空間について更にもう少し
この記事では,ユーザ名前空間の先の議論を続ける.特に,ユーザ名前空間の相互作用とケーパビリティ,他の名前空間とユーザ名前空間を一緒に使う場合についてもう少し詳細に見ていく.当面は少なくとも,この記事は名前空間に関するこのシリーズのまとめとなるだろう.
ユーザ名前空間とケーパビリティ
それぞれのプロセスは特定のユーザ名前空間と結びついている.fork() もしくは CLONE_NEWUSER フラグのない clone() の呼び出しによって生成したプロセスは,親プロセスと同じユーザ名前空間内に存在する.もし,変更先の名前空間で CAP_SYS_ADMIN を持っている場合は,プロセスは setns() を使って存在するユーザ名前空間を変更することができる.この場合,プロセスはターゲットとなる名前空間上でフルセットのケーパビリティを得る.
一方で clone(CLONE_NEWUSER) の呼び出しは新しいユーザ名前空間を作成し,子プロセスをその名前空間に置く.この呼び出しは二つの名前空間の間に親子関係も確立する.つまり,ユーザ名前空間は (初期の名前空間以外は) (clone(CLONE_NEWUSER) を使って名前空間を作成したプロセスのユーザ名前空間である) 親を持つ.ユーザ名前空間の間の親子関係は,プロセスが unshare(CLONE_NEWUSER) を呼び出したときも確立される.clone と unshare の違いは,unshare() は呼び出し元を新しいユーザ名前空間に配置し,その名前空間の親は呼び出し元が元に属していた名前空間となることである.以下を見るとすぐわかるように,ユーザ名前空間の間の親子関係は,プロセスが子供の名前空間で持つであろうケーパビリティを定義するという意味で重要である.
それぞれのプロセスは 3 つの関連するケーパビリティセットも持つ: Permitted, Inheritable, Effective である.capabilities(7)に,これらの 3 つについて少し詳細に説明がある.この記事では,我々の興味の対象である effective ケーパビリティについて主に述べる.このセットはプロセスが特権オペレーションを実行する時の能力を決める.
ユーザ名前空間は (effective) ケーパビリティが解釈される方法を変える.最初に,特定のユーザ名前空間内でケーパビリティを持っていることは,プロセスがその名前空間が管理しているリソース上の操作を実行するときのみ有効となる.後ほど,ユーザ名前空間と他の名前空間の相互作用について話す時に,もう少しこの点について話をする.さらに,プロセスが特定のユーザ名前空間内でケーパビリティを持っているか否かは,その名前空間のメンバーであることと,ユーザ名前空間間の親子関係によって決まる.このルールはいかのようなものである.