如何在Fedora基础镜像的Dockerfile中限制用户仅执行指定命令?
实现Fedora容器中普通用户仅执行指定命令的方案
可以实现,下面是几种可靠的解决方法,同时先帮你修复之前误操作导致的命令失效问题:
先修复权限问题
你之前执行chmod 700 /bin导致所有命令失效,是因为Fedora中/bin是指向/usr/bin的软链接,修改软链接权限会影响整个目录的访问权限。执行以下命令恢复:
RUN chmod 777 /bin
方案一:sudo白名单配置(最易用)
通过sudo给用户配置仅能执行指定命令的权限,无需密码验证:
- 创建用户后,在Dockerfile中添加sudo规则文件:
# 创建普通用户 RUN useradd -m restricteduser # 添加sudo白名单规则 RUN echo "restricteduser ALL=(ALL) NOPASSWD: /usr/bin/touch, /usr/bin/echo, /usr/bin/git" >> /etc/sudoers.d/restricteduser # 设置规则文件权限为只读,避免被篡改 RUN chmod 0440 /etc/sudoers.d/restricteduser
- 用户执行命令时需前缀
sudo,比如sudo touch test.txt,其他未在白名单中的命令无法通过sudo执行,直接执行也会因权限不足失败。
方案二:创建受限命令目录(无需sudo)
构建一个仅包含允许命令的目录,修改用户PATH仅指向该目录,同时限制系统命令目录的访问权限:
# 创建普通用户 RUN useradd -m restricteduser # 创建专属命令目录 RUN mkdir -p /home/restricteduser/bin # 软链接允许的命令到该目录 RUN ln -s /usr/bin/touch /home/restricteduser/bin/touch RUN ln -s /usr/bin/echo /home/restricteduser/bin/echo RUN ln -s /usr/bin/git /home/restricteduser/bin/git # 修改用户PATH,仅使用专属目录 RUN echo 'export PATH="/home/restricteduser/bin"' >> /home/restricteduser/.bashrc # 限制系统命令目录权限,普通用户无法直接访问/usr/bin下的其他命令 RUN chmod 750 /usr/bin
注意:如果git依赖其他系统命令(如git clone需要curl或ssh),需将这些依赖也软链接到专属目录,或改用方案一的sudo方式(sudo会继承root的完整PATH)。
方案三:容器级系统调用限制(高安全性)
使用Docker的seccomp配置文件,仅允许指定命令所需的系统调用,彻底禁止其他命令的执行可能。这种方式适合严格的安全场景,但配置较复杂,需针对每个命令梳理依赖的系统调用。
内容的提问来源于stack exchange,提问作者Sebastian Rueda
相关产品推荐
相关产品推荐

