ルート以外のユーザーがpid名前空間の共有を解除できないのはなぜですか?

ルート以外のユーザーがpid名前空間の共有を解除できないのはなぜですか?

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_ADMINexecve()の前にその内容を取得するのに十分なので、ここで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最初にこれを実行することもできます)。このプロセスには親ネームスペース(コマンドnewuidmapnewgidmapsetuidルートに対する権限がないため、必要に応じてこのユーザーに予約されているすべてのマッピングを設定できます)にはほとんどオプションがありません。効果があるマッピング(通常は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

おすすめ記事