在 Docker 容器中删除 FSETID 功能的影响

问题描述 投票:0回答:1

我正在探索 Docker 容器的功能和权限,我很好奇删除 FSETID 功能的影响。当我使用 --cap-drop FSETID 选项运行 Docker 容器时,我知道与文件和目录所有权权限相关的 SUID 和 GUID。

任何人都可以清楚地解释默认情况下 Docker 容器中的 FSETID 功能允许执行哪些操作吗?删除 FSETID 功能后,容器内的哪些特定操作可能会受到限制或影响?我注意到,即使使用非 root 用户和 --cap-drop FSETID 选项运行 Docker 容器,我仍然可以更改文件和文件夹权限,甚至运行 passwd 等命令。尽管该功能已被放弃,但为什么这仍然是可能的?如果您告诉我一个场景,即在删除 FSETID 功能后,与该功能的存在相比,它会发生变化,我将非常感激。

我使用下面的 docker 文件创建了一个新映像

FROM ubuntu:latest

RUN useradd -m -s /bin/bash myuser
RUN echo 'myuser:mypassword' | chpasswd
RUN apt update && apt install sudo
RUN usermod -aG sudo myuser
USER myuser

CMD ["bash"]

我还使用以下命令创建了一个容器,但我没有注意到新容器有任何限制。

docker run -it --cap-drop FSETID new_image bash
linux docker permissions containers
1个回答
0
投票

此副本功能(7)表明

CAP_FSETID

  • 修改文件时不要清除 set-user-ID 和 set-group-ID 模式位;
  • 为其 GID 与文件系统或调用进程的任何补充 GID 不匹配的文件设置 set-group-ID 位。

通常,如果文件设置了 setuid 或 setgid 位,则修改该文件会导致这些权限位被重置。这适用于修改文件,例如

/usr/bin/passwd
,而不仅仅是运行它们。

你可以通过运行看到这个

host# docker run --rm -it ubuntu bash
root@0123456789ab:/# ls -l /usr/bin/passwd
root@0123456789ab:/# echo '' >> /usr/bin/passwd
root@0123456789ab:/# ls -l /usr/bin/passwd

如果您使用

--cap-drop FSETID
运行此命令,那么您将在最后一行看到修改后的
passwd
二进制文件丢失了 setuid 位。

在您显示的示例中,您没有修改 setuid 二进制文件,因此您根本没有遇到这种情况。您正在运行 setuid 二进制文件,但它们根本不会触发该行为。此外,您运行

passwd
usermod
的位置位于映像构建中,这发生在考虑任何
docker run
选项之前,因此您仍然拥有默认功能集。

我认为容器在运行时修改其二进制文件是极其不寻常的,并且放弃此功能几乎总是安全的。 (您也不应该需要在 Dockerfile 中调用

passwd
或安装
sudo
,并且使用默认 shell 或根本不使用 shell 来配置用户是安全的。)

© www.soinside.com 2019 - 2024. All rights reserved.