第十六篇:《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 / SELinux

Ubuntu/Debian 默认启用 AppArmor,Docker 会生成名为 docker-default 的策略。

CentOS/RHEL 默认使用 SELinux,容器进程被限制在特定域中。

三、常见容器安全风险

四、安全加固实践

4.1 以非 root 用户运行

dockerfile

在 Dockerfile 中创建用户

RUN useradd -m -u 1000 appuser

USER appuser

运行时也可指定:

bash 复制代码
docker run --user 1000:1000 ubuntu id

4.2 删除不必要的 Capabilities

bash 复制代码
# 删除 NET_RAW(禁止 ping 等原始套接字)
docker run --cap-drop=NET_RAW alpine ping 8.8.8.8  # 失败

# 只添加需要的 Cap(最小权限原则)
docker run --cap-add=NET_ADMIN --cap-drop=ALL alpine ...

4.3 禁止特权容器

绝不在生产环境使用 --privileged。如需访问设备,逐项添加相应 Capability。

bash 复制代码
docker run --privileged ...  # 禁止

4.4 使用只读根文件系统

防止容器内安装恶意软件或修改系统文件。

bash 复制代码
docker run --read-only -v /tmp:/tmp -v /var/run/... alpine

需要写入的目录单独挂载可写卷。

4.5 设置资源限制

bash 复制代码
docker run --memory=512m --cpus=1 --pids-limit=100 alpine

--pids-limit 限制进程数,防止 fork 炸弹。

4.6 不要挂载 Docker Socket

bash 复制代码
# 非常危险
docker run -v /var/run/docker.sock:/var/run/docker.sock ...

若必须(如监控工具),应严格限制权限并使用只读挂载。

4.7 使用安全扫描工具

bash 复制代码
docker scan nginx:latest   # 需要登录 Docker Hub

第三方工具:Trivy、Clair、Grype。

4.8 配置 Seccomp 自定义策略

bash 复制代码
docker run --security-opt seccomp=custom.json ...

示例 custom.json 允许所有系统调用(不推荐):

json

{"defaultAction": "SCMP_ACT_ALLOW"}

生产环境应基于默认配置,按需放行。

4.9 启用 AppArmor 或 SELinux

Docker 默认使用 docker-default 策略,无需额外操作。可自定义:

bash 复制代码
docker run --security-opt apparmor=my-profile ...

五、安全基准和工具

CIS Docker Benchmark:社区标准,可用于评估配置合规性。

Docker Bench Security:开源脚本检查最佳实践。

bash 复制代码
git clone https://github.com/docker/docker-bench-security.git
cd docker-bench-security
./docker-bench-security.sh

gVisor(Google):为容器提供独立内核,增强隔离。

Kata Containers:轻量虚拟机,强隔离。

六、实践:加固一个 Nginx 容器

bash 复制代码
docker run -d --name web \
  --cap-drop=ALL \
  --cap-add=NET_BIND_SERVICE \
  --read-only \
  --tmpfs /tmp:rw,noexec,nosuid,size=64m \
  --memory=128m \
  --cpus=0.5 \
  --pids-limit=100 \
  --security-opt=no-new-privileges:true \
  nginx:alpine
--cap-drop=ALL 删除所有 Capability,再单独添加 NET_BIND_SERVICE(允许绑定 80/443 端口)。

--security-opt=no-new-privileges 防止进程提升权限(如 setuid)。

七、监控和审计

使用 Falco 实时检测容器异常行为(如 shell 执行、敏感文件读写)。

启用 Docker 审计日志:auditctl -w /usr/bin/docker -k docker

八、小结

Docker 本身提供了多层次安全机制,但默认配置仍有风险。通过非 root 用户、最小 Capability、只读文件系统、资源限制、定期扫描镜像等实践,可以显著降低攻击面。记住:容器不是虚拟机,共享内核意味着内核漏洞可能影响所有容器。

相关推荐
Plastic garden2 小时前
Docker Compose 的 RuoYi nginx exporter Prometheus + Alertmanager + 钉钉告警
nginx·docker·prometheus
黎阳之光2 小时前
数字孪生赋能智慧油站建设|黎阳之光全场景可视化安防管控平台落地应用
大数据·物联网·算法·安全·数字孪生
在水一缸2 小时前
警惕供应链陷阱:从 Red Hat npm 恶意包事件看依赖安全防护
前端·安全·npm·供应链安全·red hat·恶意包·依赖安全
少司府2 小时前
C++进阶:map和set的使用
开发语言·数据结构·c++·容器·stl·set·map
安当加密2 小时前
汽车OTA升级怎么保证安全?从固件签名到密钥全生命周期管理
网络·安全·汽车
@insist1232 小时前
系统架构设计师-信息安全架构综合设计:从数字签名到安全系统
安全·架构·系统架构·软考·系统架构设计师·软件水平考试
InHand云飞小白2 小时前
连锁门店IT运维实战:如何用“云+端“架构解决分布式网络管理难题
运维·网络·5g·安全·智能路由器·5g路由器
2601_951735412 小时前
江苏高职单招线上长期班 志愿规划评测报告
安全·江苏高职单招·线上长期班·志愿规划·评测报告
黎阳之光2 小时前
流域面源污染防控+生态屏障数字化落地:黎阳之光以视频孪生守护南水北调水源安全
人工智能·物联网·算法·安全·数字孪生