第十六篇:《Docker 安全基础:容器隔离与权限控制》
容器虽然共享宿主机内核但 Docker 通过 Linux 命名空间Namespace实现资源隔离通过 Cgroups 进行资源限制从而提供了一定程度的安全性。然而默认配置并非绝对安全root 用户、特权容器、内核漏洞等风险依然存在。本文将讲解 Docker 的安全基石、常见攻击面以及如何通过 Capability 限制、Seccomp、AppArmor、只读文件系统等实践来加固容器。一、容器安全的基石Linux 内核特性二、默认安全机制分析2.1 默认的 Capability 集合Docker 启动容器时即使以 root 用户运行也只授予以下 Capabilities可通过 docker inspect 查看CHOWN, DAC_OVERRIDE, FOWNER, FSETID, KILL, SETGID, SETUID, SETPCAP, NET_BIND_SERVICE, NET_RAW, SYS_CHROOT, MKNOD, AUDIT_WRITE, SETFCAP被丢弃的危险 Capabilities不授予SYS_ADMIN挂载文件系统、加载内核模块等SYS_RAWIO直接访问硬件SYS_PTRACE调试其他进程NET_ADMIN配置网络MAC_OVERRIDE绕过 MAC 策略示例容器内无法执行 mount 命令因为缺少 SYS_ADMIN。2.2 默认 Seccomp 配置Seccomp 拦截危险系统调用如 clone未指定标志、reboot、swapon、acct 等。默认配置通常足够安全。2.3 默认 AppArmor / SELinuxUbuntu/Debian 默认启用 AppArmorDocker 会生成名为 docker-default 的策略。CentOS/RHEL 默认使用 SELinux容器进程被限制在特定域中。三、常见容器安全风险四、安全加固实践4.1 以非 root 用户运行dockerfile在 Dockerfile 中创建用户RUN useradd -m -u 1000 appuserUSER appuser运行时也可指定dockerrun--user1000:1000 ubuntuid4.2 删除不必要的 Capabilities# 删除 NET_RAW禁止 ping 等原始套接字dockerrun --cap-dropNET_RAW alpineping8.8.8.8# 失败# 只添加需要的 Cap最小权限原则dockerrun --cap-addNET_ADMIN --cap-dropALL alpine...4.3 禁止特权容器绝不在生产环境使用 --privileged。如需访问设备逐项添加相应 Capability。dockerrun--privileged...# 禁止4.4 使用只读根文件系统防止容器内安装恶意软件或修改系统文件。dockerrun --read-only-v/tmp:/tmp-v/var/run/... alpine需要写入的目录单独挂载可写卷。4.5 设置资源限制dockerrun--memory512m--cpus1--pids-limit100alpine–pids-limit 限制进程数防止 fork 炸弹。4.6 不要挂载 Docker Socket# 非常危险dockerrun-v/var/run/docker.sock:/var/run/docker.sock...若必须如监控工具应严格限制权限并使用只读挂载。4.7 使用安全扫描工具dockerscan nginx:latest# 需要登录 Docker Hub第三方工具Trivy、Clair、Grype。4.8 配置 Seccomp 自定义策略dockerrun --security-optseccompcustom.json...示例 custom.json 允许所有系统调用不推荐json{“defaultAction”: “SCMP_ACT_ALLOW”}生产环境应基于默认配置按需放行。4.9 启用 AppArmor 或 SELinuxDocker 默认使用 docker-default 策略无需额外操作。可自定义dockerrun --security-optapparmormy-profile...五、安全基准和工具CIS Docker Benchmark社区标准可用于评估配置合规性。Docker Bench Security开源脚本检查最佳实践。gitclone https://github.com/docker/docker-bench-security.gitcddocker-bench-security ./docker-bench-security.shgVisorGoogle为容器提供独立内核增强隔离。Kata Containers轻量虚拟机强隔离。六、实践加固一个 Nginx 容器dockerrun-d--nameweb\--cap-dropALL\--cap-addNET_BIND_SERVICE\--read-only\--tmpfs/tmp:rw,noexec,nosuid,size64m\--memory128m\--cpus0.5\--pids-limit100\--security-optno-new-privileges:true\nginx:alpine --cap-dropALL 删除所有 Capability再单独添加 NET_BIND_SERVICE允许绑定80/443 端口。 --security-optno-new-privileges 防止进程提升权限如 setuid。七、监控和审计使用 Falco 实时检测容器异常行为如 shell 执行、敏感文件读写。启用 Docker 审计日志auditctl -w /usr/bin/docker -k docker八、小结Docker 本身提供了多层次安全机制但默认配置仍有风险。通过非 root 用户、最小 Capability、只读文件系统、资源限制、定期扫描镜像等实践可以显著降低攻击面。记住容器不是虚拟机共享内核意味着内核漏洞可能影响所有容器。