启用selinux后,需确保宿主机enforcing模式、docker开启selinux-enabled、挂载目录正确标记container_file_t上下文,并在容器启动时指定label=type:container_t,最后通过ps -ez和ls -z验证标签生效。

直接在运行容器时指定 SELinux 类型标签,就能让挂载卷受强制策略约束,避免容器越权读写宿主机文件。关键不是加不加标签,而是标签是否匹配策略、挂载路径是否被正确标记。
启用 Docker 的 SELinux 支持
确保宿主机已开启 SELinux 并配置 Docker 使用它:
- 运行 getenforce,输出应为 Enforcing;若为 Permissive 或 Disabled,需先启用(如修改 /etc/selinux/config)
- 编辑 /etc/docker/daemon.json,添加:
"selinux-enabled": true - 重启服务:sudo systemctl restart docker
为挂载卷设置正确的 SELinux 上下文
仅指定容器标签不够,宿主机上的挂载目录必须带对应安全上下文,否则策略不生效:
- 用 chcon 手动打标(临时):
sudo chcon -Rt container_file_t /host/data - 更推荐用 semanage fcontext 永久设置(重启或 relabel 后仍保留):
sudo semanage fcontext -a -t container_file_t "/host/data(/.*)?"
sudo restorecon -Rv /host/data - 避免使用 :Z 或 :z 挂载选项——它们会自动重标上下文,可能覆盖你设定的策略,甚至扩大访问范围
运行容器时绑定安全类型
启动时显式声明容器进程的安全角色和类型,使挂载卷策略真正起作用:
- Docker CLI 示例:
docker run --security-opt label=type:container_t -v /host/data:/app/data:rw myimage - Docker Compose 示例:
security_opt:
- label=type:container_t
volumes:
- "/host/data:/app/data:rw" - 类型名(如 container_t)必须与系统中已加载的 SELinux 策略一致;可查当前可用类型:seinfo -t | grep container
验证与调试策略是否生效
跑完容器后,别跳过验证步骤,很多越权问题其实卡在上下文没对上:
- 进容器检查进程标签:ps -eZ | grep container_t
- 检查挂载点标签:ls -Z /app/data,确认显示类似 system_u:object_r:container_file_t:s0
- 若操作失败且报 Permission denied,查审计日志:sudo ausearch -m avc -ts recent | audit2why,它会告诉你哪条规则被拒绝、是否该放开布尔值(如 setsebool -P container_manage_cgroup 1)











