名称¶
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 首次编写