零基础也能学会的容器安全加固指南
容器化部署越来越普及,但很多新手搭建完容器后就放着不管,给攻击者留下了可乘之径。容器安全加固并不是复杂的事,只需要调整几个关键参数就能大幅提升安全性。
本文适合完全没接触过安全配置的新手,你只需有一台装好 Docker 的 Linux 服务器(建议 CentOS 7+ 或 Ubuntu 18.04+),跟着下面的步骤敲命令就行。
先检查当前容器的风险点
在动手加固前,先用一条命令看看你的容器是否存在常见安全问题。
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Command}}\t{{.Ports}}"
这条命令会列出所有运行中的容器 ID、镜像、启动命令和端口映射。
重点关注两点:
- 是否有很多端口直接暴露到 0.0.0.0 ?
- 启动时有没有加
--privileged或--cap-add=ALL?
如果发现 --privileged 参数,说明该容器拥有宿主机内核的全部权限,这是最危险的情况之一。
第一步:避免容器以 root 用户运行
默认情况下,容器内的进程也是 root。
但 Docker 允许用 --user 参数指定一个普通用户运行。
如果镜像本身已经创建了普通用户(比如 nginx 镜像有 nginx 用户),你可以在启动时加上:
docker run -d --user nginx nginx:latest
如果镜像里没有额外用户,建议用宿主机的 UID 1000(假设你有一个普通用户)启动:
docker run -d --user 1000:1000 your-image
避坑提醒:如果容器进程需要写日志文件,确保挂载的目录权限对应用户可写。可以先在宿主机上执行 chown 1000:1000 /path/to/log。
第二步:挂载只读文件系统并限制资源
即使容器被攻破,只读文件系统能阻止攻击者写文件。
启动时加 --read-only 参数:
docker run -d --read-only --tmpfs /tmp --tmpfs /var/run your-image
--tmpfs 允许某些临时目录可写(比如 /tmp、/var/run),不影响只读的主文件系统。
同时限制 CPU 和内存使用,防止容器耗尽宿主机资源:
docker run -d --read-only --cpus="0.5" --memory="512m" --memory-swap="0" your-image
--cpus="0.5":容器最多用 0.5 核--memory="512m":最多 512MB 内存--memory-swap="0":禁止使用 swap(防止内存泄漏时撑爆磁盘)
如果已经在运行的容器,可以用 docker update 动态调整:
docker update --cpus="0.5" --memory="512m" your-container
第三步:使用安全框架检测镜像漏洞
加固不只是运行时,镜像本身也可能藏有高危漏洞。
推荐用开源的 Trivy 扫描镜像。
安装 Trivy(一行命令):
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock aquasec/trivy image your-image:tag
扫描结果会列出 CVE 漏洞编号、严重等级和修复建议。
对于高危漏洞,优先换无漏洞的基础镜像(比如 alpine 系列镜像体积小、漏洞少)。
第四步:验证加固效果
加固完成后,务必用压力测试和权限检测确认效果。
1. 验证资源限制
进入容器安装 stress 工具(如果镜像含包管理),然后跑压力测试:
docker exec -it your-container sh
# 在容器内安装 stress(以 Ubuntu 为例)
apt update && apt install -y stress
stress --cpu 4 --timeout 20
用宿主机 htop 观察是否被限制在 0.5 核内。
2. 验证只读文件系统
在容器内尝试创建一个文件:
docker exec your-container touch /test.txt
如果报错 Read-only file system,说明只读生效。
3. 检查用户权限
docker exec your-container whoami
应该显示 nginx 或 1000,而不是 root。
常见问题与避坑说明
Q:加了 --read-only 后容器日志不写了怎么办?
A:把日志目录挂载为 tmpfs:--tmpfs /var/log/myapp;或者挂载宿主机目录并给写入权限。
Q:Trivy 扫描发现很多漏洞,升级镜像很麻烦?
A:至少修复 Critical 级别的漏洞,其他可以后续迭代。也可以改用 docker-slim 精简镜像减少攻击面。
Q:我的容器必须用 --privileged 才能运行,怎么办?
A:尽量不要。如果必须,用 --cap-add 只添加真正需要的 capabilities(比如 --cap-add=NET_ADMIN 用于网络管理),绝不加 ALL。
Q:已经启动的容器怎么添加 --user?
A:只能删掉旧容器,用新参数重新创建。建议先从 Dockerfile 里固定 USER 指令,一劳永逸。
写在最后
容器安全加固其实就几步:改掉默认 root 用户、限制资源、挂载只读文件系统、扫描镜像漏洞。
做一遍后,你的容器安全度会提升一个档次。
遇到异常时,先看看是不是挂载目录权限问题或 --read-only 挡住了写操作。
如果你正在搭建生产环境的容器,建议把这套流程写进部署脚本,每次启动都自动应用。
坚持这个习惯,就能一直保持较高的安全水位。