名称

podmansh - 在 Podman podmansh 容器内执行登录 shell

简介

podmansh

描述

当用户登录系统时,在容器内执行用户 shell。用户被添加到的容器可以通过 Podman Quadlet 文件来定义。该用户只能访问 Quadlet 文件中配置的卷和能力。

管理员可以在 /etc/containers/systemd/users 目录中创建一个 Quadlet,systemd 会在所有用户登录时为他们启动这个 Quadlet。管理员可以创建一个名为 podmansh 的特定 Quadlet 容器,然后允许用户使用登录 shell /usr/bin/podmansh。这些用户的登录 shell 会通过 Podman 自动在 podmansh 容器内执行。

或者,管理员可以将 Quadlet 文件放置在用户的 /etc/containers/systemd/users/${UID} 目录中。这样,只有该 UID 的用户在登录时才会执行这些 Quadlet 服务。

用户被限制在容器环境中,受到所有安全机制(包括 SELinux)的约束。唯一能从系统中获得的信息来自泄漏到容器中的卷。

当用户会话启动时,Systemd 会自动创建容器。当所有到该用户会话的连接被移除时,Systemd 会关闭该容器。这意味着用户可以多次登录系统,每个会话都连接到同一个容器。

管理员可以使用卷将主机系统中的特定数据暴露给用户,而不会让用户接触到系统的其他部分。

podmansh 的超时时间可以通过 containers.conf 中的 podmansh_timeout 选项进行设置。

设置

以 root 身份运行,使用 useradd 创建用户登录会话。

# useradd -s /usr/bin/podmansh lockedu
# grep lockedu /etc/passwd
lockedu:x:4008:4008::/home/lockedu:/usr/bin/podmansh

创建一个类似于以下示例之一的 Podman Quadlet 文件。

完全锁定的容器,无法访问主机操作系统。

# USERID=$(id -u lockedu)
# mkdir -p /etc/containers/systemd/users/${USERID}
# cat > /etc/containers/systemd/users/${USERID}/podmansh.container << _EOF
[Unit]
Description=The podmansh container
After=local-fs.target

[Container]
Image=registry.fedoraproject.org/fedora
ContainerName=podmansh
UserNS=keep-id
RunInit=yes
DropCapability=all
NoNewPrivileges=true

Exec=sleep infinity

[Install]
RequiredBy=default.target
_EOF

或者,以 root 身份运行,创建一个 Quadlet,其中用户被允许在用户命名空间内成为 root。他们也可以永久读/写其家目录中的内容,该目录是从实际主机的用户账户通过卷挂载的,而不是存在于容器内部。

# useradd -s /usr/bin/podmansh confinedu
# grep confinedu /etc/passwd
confinedu:x:4009:4009::/home/confinedu:/usr/bin/podmansh
# USERID=$(id -u confinedu)
# mkdir -p /etc/containers/systemd/users/${USERID}
# cat > /etc/containers/systemd/users/${USERID}/podmansh.container << _EOF
[Unit]
Description=The podmansh container
After=local-fs.target

[Container]
Image=registry.fedoraproject.org/fedora
ContainerName=podmansh
UserNS=keep-id
RunInit=yes

Volume=%h/data:%h:Z
Exec=sleep infinity

[Service]
ExecStartPre=/usr/bin/mkdir -p %h/data

[Install]
RequiredBy=default.target
_EOF

另一个例子,以 root 身份运行,创建一个 Quadlet,其中此容器内的用户被允许执行具有 SELinux 分隔的容器,并且能够在 $HOME/data 目录中读写内容。

# useradd -s /usr/bin/podmansh fullu
# grep fullu /etc/passwd
fullu:x:4010:4010::/home/fullu:/usr/bin/podmansh
# USERID=$(id -u fullu)
# mkdir -p /etc/containers/systemd/users/${USERID}
# cat > /etc/containers/systemd/users/${USERID}/podmansh.container << _EOF
[Unit]
Description=The podmansh container
After=local-fs.target

[Container]
Image=registry.fedoraproject.org/fedora
ContainerName=podmansh
UserNS=keep-id
RunInit=yes
PodmanArgs=--security-opt=unmask=/sys/fs/selinux \
	--security-opt=label=nested \
	--security-opt=label=user:container_user_u \
	--security-opt=label=type:container_user_t \
	--security-opt=label=role:container_user_r \
	--security-opt=label=level:s0-s0:c0.c1023

Volume=%h/data:%h:Z
WorkingDir=%h
Volume=/sys/fs/selinux:/sys/fs/selinux
Exec=sleep infinity

[Service]
ExecStartPre=/usr/bin/mkdir -p %h/data

[Install]
RequiredBy=default.target
_EOF

另请参阅

containers.conf(5)podman(1)podman-exec(1)podman-systemd.unit(5)

历史

2023 年 5 月,由 Dan Walsh dwalsh@redhat.com 首次编写