
unshare -pf bash
失敗し、操作が許可されていません。効果的な根。 procをマウントしない限り、nsをマウントする必要はありません。 pid nsの生成を許可しない特別な理由はありますか?
答え1
これは特権アクションなので、実際には許可されません。unshare(2)
言う:
CLONE_NEWPID
(Linux 3.8から始まる)[...]
使用するには能力が
CLONE_NEWPID
必要ですCAP_SYS_ADMIN
。詳細については、次を参照してください。pid_ネームスペース(7)。
まず共有をキャンセルするだけです。ユーザーネームスペース(これは特権タスクではありません。)コメントに記載されている、そして記録されたユーザーネームスペース(7)、ユーザーの名前空間を共有解除すると、少なくともCAP_SYS_ADMIN
execve()の前にその内容を取得するのに十分なので、ここでrootユーザーのマッピングを実行する必要さえありません。この新しいユーザーネームスペースでは、プロセスは新しいpidネームスペースを共有解除できます。
pid_namespaces(7)で指定されているように、「このフラグでunshare(2)を呼び出した後、プロセスによって生成された最初の子プロセス」のみがCLONE_NEWPID
実際に新しいpid名前空間にあり、「pid 1があります」。したがって、フォークオプションは技術的に必要ではありませんが、これがなければそれほど便利ではありません。これは、最初の子プロセスだけが実際に新しいpid名前空間を入力/開始するためです(そして、未bash
使用のプロセスと同様にbash --norc
フォークされ、次のいずれかを実行する機会が失われます)。後で自分で選ぶ)
$ unshare -U --map-user=$(id -u) --map-group=$(id -g) -f -p
$ echo $$
1
unshare
これには、関連するオプションを備えた十分に新しいバージョンが必要です。これらのオプションがない古いバージョンを使用している場合は、最後のunshare
注意事項を参照してください。
/proc
親名前空間のpidの代わりに、新しいpidを実際に表示するために新しいpid名前空間を反映する新しいインスタンスをマウントすることも行う必要があります。
$ ls -l /proc/$$/exe
ls: cannot read symbolic link '/proc/1/exe': Permission denied
lrwxrwxrwx 1 nobody nogroup 0 Sep 16 16:13 /proc/1/exe
これには、新しい名前空間にマウント権限が必要なため、ユーザーの名前空間もこの新しい名前空間で新しいマウントを実行する権限を取得できるように、マウント名前空間も最初に共有解除する必要があります。 (最終フォークと実行の前に)共有されていないプロセスがまだCAP_SYS_ADMIN
最終的に有用なタスクを実行できるため、まだルートである必要はありません。
$ unshare -U --map-user=$(id -u) --map-group=$(id -g) -m --mount-proc -f -p
$ echo $$
1
$ ls -l /proc/$$/exe
lrwxrwxrwx 1 user user 0 Oct 8 21:49 /proc/1/exe -> /usr/bin/bash
追加の注:共有解除は、ルートではなく同じユーザーにマップされます。unshare
コマンドが欠落している以前のバージョンを使用している場合は、--map-user
次のように実行できます。
user@host$ echo $$; id -u; id -g; exec unshare -U -f -p
670034
1000
1000
nobody@host$ echo $$; id -u; id -g
1
65534
65534
その後、新しいユーザー名前空間用のユーザーマップを作成するには、他のプロセスの一般的なヘルプが必要です(または最新バージョンのコマンドがunshare
最初にこれを実行することもできます)。このプロセスには親ネームスペース(コマンドnewuidmap
とnewgidmap
setuidルートに対する権限がないため、必要に応じてこのユーザーに予約されているすべてのマッピングを設定できます)にはほとんどオプションがありません。効果があるマッピング(通常はrootまたはユーザー自体)。
その他のシェル(まだ親ネームスペースにあります):
user@host$ pstree -p 670034
unshare(670034)───bash(670638)
user@host$ echo '1000 1000 1' > /proc/670034/uid_map
user@host$ echo deny > /proc/670034/setgroups
user@host$ echo '1000 1000 1' > /proc/670034/gid_map
もう一度最初のシェル:
nobody@host$ exec bash #for cosmetic effect
user@host$ echo $$; id -u; id -g
1
1000
1000