一般ユーザーの名前空間(podmanの外部で作成されたもの)としてルートレスPodmanを使用できますか?

一般ユーザーの名前空間(podmanの外部で作成されたもの)としてルートレスPodmanを使用できますか?

以下を使用して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機能を実行できますが、この答えを期待しないことを願っています。podmanCAP_SYS_ADMINsudo

関連情報