以下を使用してuts名前空間を作成すると、unshare
ホスト名をに設定しますfoo
。
$ unshare --map-root-user --uts /bin/sh
# echo $$
31882
# readlink /proc/31882/ns/uts
uts:[4026532825]
# hostname foo
それでは、これをpodman
実行せずにrootless内でそのユーザーの名前空間をどのように使用しますか?動作せずに返されます。sudo
"エラー:指定されたUTS名前空間パスが見つかりません。stat [proc-ns-link]:権限が拒否されました。"
$ podman run -ti --uts=ns:/proc/31882/ns/uts alpine:3 /bin/hostname
Error: cannot find specified UTS namespace path: stat /proc/31882/ns/uts: permission denied
しかし、効果があります。
$ sudo podman run -ti --uts=ns:/proc/31882/ns/uts alpine:3 /bin/hostname
foo
答え1
私はそれに慣れていませんが、podman
誰かが別の名前空間へのアクセスを使用する必要がある場合は、システムコールを使用する必要が/proc/31882/ns/uts
あります。setns
新しいネットワーク、IPC、時刻、またはUTS名前空間に再接続するには、発信者は自分のユーザー名前空間と宛先名前空間を所有するユーザー名前空間の両方にCAP_SYS_ADMIN機能が必要です。引用:https://man7.org/linux/man-pages/man2/setns.2.html
したがって、(sudo)機能がないと、CAP_SYS_ADMIN
呼び出し側は他の名前空間に入ることができません。これが可能な場合はセキュリティの問題です。
追加の注意:suidビットをバイナリに設定すると、これに言及せずにpodman
機能を実行できますが、この答えを期待しないことを願っています。podman
CAP_SYS_ADMIN
sudo