加入 docker 组等于拿到宿主 root
守护进程通过 /var/run/docker.sock 提供接口,这个套接字通常属于 root,组的权限给到 docker。能访问该套接字的人可以创建一个挂载宿主根目录的特权容器,进而在宿主上以 root 身份操作文件。也就是说,把账号加入 docker 组与直接授予宿主 root 权限没有实质差别。多用户、多人维护的机器上,这份名单需要定期核对。
基本信息
| 权限模型 | docker.sock 属主 root、属组 docker,权限 0660 |
|---|---|
| 审计命令 | getent group docker,并与实际需登录的账号清单比对 |
| 等效性 | 可创建特权容器并挂载宿主目录,等同宿主 root |
| 替代方案 | rootless 模式、受控的 sudo 规则、socket 代理 |
典型使用场景
- 权限评审:确认成员名单与运维授权记录一致
- 人员离职清理:把不再需要的账号从组里移除
- 多用户机器加固:按需授权,避免人人都能控制宿主
- 合规核查:把组成员清单纳入定期巡检项
- 替代方案评估:为开发人员提供受限通道而不是直接给组权限
审计与清理
审计与清理
# 查看当前组成员
getent group docker
# 逐个确认成员身份与必要性
for u in $(getent group docker | cut -d: -f4 | tr ',' ' '); do echo "$u: $(id -nG "$u" 2>/dev/null)"; done
# 移除不再需要的成员(需该用户重新登录后生效)
sudo gpasswd -d 用户名 docker
# 查看套接字权限,确认没有放宽
ls -l /var/run/docker.sock授权方式对照
| 方式 | 权限范围 | 主要风险 |
|---|---|---|
| 加入 docker 组 | 等效宿主 root | 成员失陷即整机失陷 |
| 受控 sudo 执行 docker | 按命令粒度审计 | sudoers 规则需要维护 |
| rootless 模式 | 用户命名空间内运行 | 隔离更强,部分功能受限 |
| socket 代理 | 只放行白名单接口 | 需要额外组件与配置 |
从组里移除成员后,该用户已登录的会话仍然保留原组身份,需要重新登录才彻底生效。
把开发环境与生产环境分机器部署,是降低这类权限风险最简单有效的做法。