网络容器安全加固:别让你的服务“裸奔”

容器跑得快,安全不能忘

现在搞开发、运维的人,谁不跑几个容器?Docker 一敲,服务立马起来,省事是真省事。可很多人只顾着跑得快,忘了看看底裤还在不在——容器一开,端口全开,镜像来路不明,权限一把梭,这跟把家门钥匙贴外墙上有什么区别?

前阵子朋友公司就出过事,一个测试环境的容器被人挖了矿,查了半天才发现,用的是网上随便下的 Redis 镜像,自带后门脚本,启动就执行。你说冤不冤?

最小权限原则不是口号

很多 Dockerfile 里直接用 root 跑服务,图省事。但一旦被突破,攻击者直接拥有容器最高权限,顺手就能打内网。正确的做法是指定非 root 用户:

FROM nginx:alpine
CREATE USER appuser --uid=10001 --shell=/bin/false
USER appuser
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

这样即使容器被拿下,攻击者也没法轻易提权。

镜像来源必须靠谱

别看到 docker pull ubuntu 就觉得万事大吉。官方镜像也不代表绝对安全,得定期扫描漏洞。建议用可信镜像仓库,配合 CI 流程做自动扫描。比如用 Trivy 扫描镜像:

trivy image your-app:latest

发现问题镜像,直接拦截上线流程,别让带病服务进生产。

网络隔离要到位

默认 bridge 网络里,容器之间能互相访问,等于办公室里所有人共用一台打印机,谁都能看文档。应该用自定义网络隔离不同服务:

docker network create --driver bridge backend-net
docker run -d --network=backend-net --name redis-server redis
docker run -d --network=backend-net --name api-server myapp

前端 Nginx 只暴露 80,后端服务之间通过内部网络通信,外部扫不到,风险小一大截。

运行时也要盯紧

容器启动后就不管了?不行。得限制资源和能力。比如禁止挂载宿主机目录、禁用特权模式、关闭不必要的系统调用。

启动容器时加这些参数:

docker run \
--read-only \
--cap-drop=ALL \
--cap-add=NET_BIND_SERVICE \
--security-opt=no-new-privileges \
--memory=512m \
--cpus=1.0 \
-p 80:8080 \
myapp:latest

这样就算代码有漏洞,也很难执行恶意命令或耗尽资源。

日志和监控别偷懒

容器日志默认存在本地,重启就没了。应该集中收集,用 ELK 或 Loki 存起来。再配个 Prometheus + Alertmanager,发现异常 CPU、异常外连,立马告警。

比如某个容器突然连到国外 IP,大概率是被控了。早发现,早上报,早点止损。

安全不是一锤子买卖,容器也不是一次配置就高枕无忧。定期更新基础镜像、修补依赖漏洞、审计权限配置,才是长久之计。