user_namespaces(7)の例をいじっていると、奇妙な動作に遭遇しました。
アプリケーションの機能
アプリケーションuser-ns-ex
は CLONE_NEWUSER を指定して clone(2) を呼び出し、新しいユーザー名前空間に新しいプロセスを作成します。親プロセスはマップ ( 0 1000 1
) を /proc//uid_map ファイルに書き込み、(パイプを介して) 処理を続行できることを子プロセスに伝えます。次に、子プロセスが実行しますbash
。
ここにソースコードをコピーしました。
問題
機能を設定しないか、すべてを設定すると、アプリケーションは書き込み用に /proc//uid_map を開きます。
set_capuid、set_capgid、およびオプションで cap_sys_admin のみを設定すると、open(2) の呼び出しが失敗します。
上限を設定:
arksnote linux-namespaces # setcap 'cap_setuid,cap_setgid,cap_sys_admin=epi' ./user-ns-ex
arksnote linux-namespaces # getcap ./user-ns-ex
./user-ns-ex = cap_setgid,cap_setuid,cap_sys_admin+eip
実行してみてください:
kamyshev@arksnote ~/workspace/personal/linux-kernel/linux-namespaces $ ./user-ns-ex -v -U -M '0 1000 1' bash
./user-ns-ex: PID of child created by clone() is 19666
ERROR: open /proc/19666/uid_map: Permission denied
About to exec bash
そして今、成功したケース:
機能なし:
arksnote linux-namespaces # setcap '=' ./user-ns-ex
arksnote linux-namespaces # getcap ./user-ns-ex
./user-ns-ex =
正常に実行されます:
kamyshev@arksnote ~/workspace/personal/linux-kernel/linux-namespaces $ ./user-ns-ex -v -U -M '0 1000 1' bash
./user-ns-ex: PID of child created by clone() is 19557
About to exec bash
arksnote linux-namespaces # exit
私はマンページで理由を見つけようとしており、さまざまな機能で遊んでいますが、現時点ではうまくいきません。私を最も困惑させているのは、アプリケーションがより少ない機能で実行され、より多くの機能で実行されないことです。
誰かが私を助けて問題を明確にすることができますか?