限制 docker 客户端权限的核心是移出 docker 组并配置 sudo 白名单:先执行 sudo gpasswd -d $user docker 使 docker ps 报 permission denied,再在 sudoers 中精确授权如 /usr/bin/docker ps 等低风险子命令,禁用通配符与 shell 转义,并通过封装脚本控制高危操作,最后审计日志验证。
限制 docker 客户端对守护进程的操作权限,核心是切断普通用户直接访问 /var/run/docker.sock 的能力,并通过可控路径(如 sudo 白名单)提供最小必要功能。不能既让用户在 docker 组里,又想“限制”——那等于没限。
停用 docker 用户组访问
这是所有限制的前提。只要用户属于 docker 组,就能绕过一切命令级控制,等同于拥有 root 权限。
- 检查是否在组中:
id -nG | grep -w docker - 若存在,移出:
sudo gpasswd -d $USER docker - 验证套接字失效:
docker ps应报permission denied;ls -l /var/run/docker.sock应显示srw-rw---- 1 root docker,且当前用户不再属于docker组
用 sudoers 做子命令白名单
只允许特定、低风险的子命令,不开放 run、exec、build 等高危操作。规则必须精确到完整路径和固定参数。
- 编辑配置:
sudo visudo - 添加示例规则:
alice ALL=(root) /usr/bin/docker ps, /usr/bin/docker images, /usr/bin/docker logs --tail=100, /usr/bin/docker inspect - 禁止通配符、
sh -c、未引号变量——否则可被构造参数绕过 - 避免写成
/usr/bin/docker *或/usr/bin/docker run *,这等于放行全部
用封装脚本替代裸命令
当需要允许部分 run 行为(如固定镜像、端口、无挂载),靠 sudoers 参数校验不可靠,应写安全 wrapper 脚本。
- 新建脚本
/usr/local/bin/allow-nginx,内容开头校验:if [[ "$1" != "nginx:alpine" ]]; then exit 1; fi - 仅允许启动固定配置:
exec /usr/bin/docker run --rm -p 8080:80 "$@" - 设权限:
sudo chown root:root /usr/local/bin/allow-nginx && sudo chmod 755 /usr/local/bin/allow-nginx - sudoers 中只授权该脚本:
alice ALL=(root) /usr/local/bin/allow-nginx
启用日志审计与持续验证
权限策略不是配完就结束,必须确认它真起作用,并留下操作痕迹。
- 测试越权行为:
sudo docker exec -it somecontainer sh应拒绝;sudo docker run --privileged alpine应失败 - 查日志定位执行记录:
sudo grep 'docker' /var/log/auth.log(Debian/Ubuntu)或/var/log/secure(RHEL/CentOS) - 定期检查
/var/run/docker.sock权限是否仍为660,防止被意外改宽











