易君召
易君召
发布于 2026-11-10 / 1 阅读
0

Docker 容器安全最佳实践

下面分镜像、宿主机、容器运行时、网络、权限、日志审计、编排(Docker Compose / K8s)、应急几个维度整理,偏向生产可落地,很多是日常容易踩坑的点。

核心原则:最小权限、最小攻击面、不信任镜像、容器≠沙箱,容器共享内核,逃逸风险一直存在。

一、镜像安全(最重要一环)

  1. 不要用 latest 标签 latest 是浮动标签,每次拉取版本不可控,漏洞修复后行为会变;固定具体版本号,例如 nginx:1.27.3。

  2. 使用轻量基础镜像 优先 alpine、distroless、scratch,减少包、shell、工具;越大的镜像漏洞越多。

    distroless 镜像里面甚至没有 shell,就算 Web 被拿下,攻击者很难在里面执行命令。

  3. 镜像扫描 CI/CD 流水线集成漏洞扫描:Trivy、Grype、Clair;推送到私有仓库前先扫,高危漏洞禁止上线。

    trivy image nginx:1.27.3
    
  4. 使用私有镜像仓库,不要直接拉公共镜像 自建 Harbor/Registry,镜像经过审核、缓存;配置仓库 HTTPS + 认证,禁止匿名拉取。

  5. 镜像内不要内置密钥、密码、token 禁止 Dockerfile 里写密码、COPY .env;密钥用运行时注入(secret/volume/ 环境变量管理工具)。

  6. 镜像构建不要在容器里编译后保留编译工具 多阶段构建(multi-stage build):编译阶段放编译器、git,最终镜像只放运行产物。

  7. 验证镜像签名 使用 cosign 对镜像签名,部署时校验签名,防止镜像被篡改投毒。

二、容器运行时配置(run /compose 参数)

✅ 必加的安全参数

  1. 不以 root 用户运行容器(最高优先级) Dockerfile 内创建普通用户,USER appuser;启动时避免默认 root。 如果必须 root,要做额外限制,尽量避免。

  2. 禁用特权模式 --privileged --privileged 几乎给了容器宿主机全部设备权限,极易逃逸,生产禁止随便加。

  3. 去掉不必要的 Linux Capabilities 默认容器已经裁剪了一部分能力,再显式删除:

    --cap-drop=ALL --cap-add=NET_BIND_SERVICE
    

    只按需添加能力,默认全部丢弃。

  4. 只读文件系统(如果业务允许)

    --read-only
    

    配合 --tmpfs /tmp 挂载临时目录;攻击者拿到 shell 也无法写文件持久化木马。

  5. 设置文件系统掩码(umask)、限制新文件权限

  6. 限制资源:CPU、内存、PIDS 防 DoS、fork 炸弹:

    --memory=512m --cpus=0.5 --pids-limit=100
    
  7. 禁止挂载宿主机敏感目录 严禁 -v /:/host、-v /etc:/etc、-v /var/run/docker.sock!

    挂载 docker.sock = 容器内拥有宿主机 docker 权限,等价接管机器,是高频入侵入口。 如果一定要用 Dind,单独 Dind 节点,严格隔离。

  8. 设置安全选项:no-new-privileges

    --security-opt=no-new-privileges:true
    

    阻止容器内通过 suid 程序提权。

  9. Seccomp 配置 使用 seccomp 过滤系统调用,禁用危险 syscall(比如内核模块加载);docker 默认 seccomp 配置已经不错,不要 --security-opt seccomp=unconfined。

  10. AppArmor / SELinux 开启宿主机的 AppArmor(Debian/Ubuntu)或 SELinux(RHEL/CentOS/openEuler),不要随意关闭;给容器绑定安全配置文件。

❌ 尽量不要用

  • --privileged

  • --security-opt seccomp=unconfined

  • --security-opt apparmor=unconfined

  • --userns=host(用户命名空间直通)

三、用户命名空间 User Namespace(重点防御逃逸)

开启 Docker userns-remap:宿主机把容器内 root 映射成宿主机一个普通 uid。 即使容器逃逸出来,这个 root 只是宿主机普通用户,破坏力大幅下降。

缺点:会影响文件权限,需要提前评估业务。

四、网络安全

  1. 默认不暴露端口,按需映射 不要 -p 0.0.0.0:8080:8080 对外全网监听,能绑定 127.0.0.1 就绑定本地。

  2. 使用独立自定义网桥,不要默认 bridge 默认 bridge 网络隔离弱;compose 默认会创建独立网络,这点比较好。

  3. 容器之间最小访问策略 不要让所有容器互通;高级场景可以用网络策略(K8s NetworkPolicy / 第三方插件如 Calico)。

  4. 容器内服务强制 TLS Web、API、数据库都上 TLS;禁止明文传输敏感数据。

  5. 不要在容器里跑端口扫描、抓包(需要 CAP_NET_RAW,按需严格评估)

五、宿主机层面安全

  1. Docker daemon 不要监听外网 TCP(2375 明文端口) 2375 无认证,非常危险;如果需要远程管理,走 2376 TLS 或者 ssh 转发,不要裸开 2375。

    很多被挖矿的机器就是暴露了 2375。

  2. 保护 docker.sock 文件权限 只有必要用户加入 docker 用户组;加入 docker 组等价于 root 权限,不要随便给开发账号加 docker 组。

  3. 宿主机内核保持更新 容器共享宿主机内核,内核漏洞(如容器逃逸 CVE)会直接影响所有容器。

  4. 宿主机最小化,关闭不必要服务

  5. 监控宿主机上容器进程、文件改动 可以用 Falco 做运行时行为检测(容器安全运行时引擎)

六、环境变量、Secret、配置

  1. 敏感信息不要用环境变量传递(docker inspect 可以看到环境变量) ✅ 推荐:Docker Secrets(Swarm)、外部密钥管理(Vault、KMS)、临时文件挂载(权限严格 0400)

  2. 不要把 --env PASSWORD=xxx 写在命令行(ps 能抓到)

七、日志与审计

  1. 容器日志不要存在本地磁盘,转发到 Loki/ELK/Syslog

  2. 开启 Docker daemon 审计日志,记录容器创建、删除、挂载、exec 进入容器等操作

  3. 禁止 docker run --log-driver=none 关闭日志(生产禁止)

  4. 监控异常行为:比如容器内突然执行 curl、wget、chmod +x、加载内核模块、访问 docker.sock

八、Docker Compose 专属安全建议

  • compose 文件不要硬编码密码

  • 用 user: 指定运行用户

  • 显式配置 cap_drop、security_opt、read_only、tmpfs、资源限制

  • 版本锁定,不要用 latest

  • 不要在 compose 里挂载 /var/run/docker.sock 除非明确知晓风险

示例一份偏安全的 compose 片段:

services:
  app:
    image: myapp:1.0.0
    user: "1001:1001"
    read_only: true
    tmpfs:
      - /tmp:size=50M
    cap_drop:
      - ALL
    cap_add:
      - NET_BIND_SERVICE
    security_opt:
      - no-new-privileges:true
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 512M
    ports:
      - "127.0.0.1:8080:8080"

九、运行时防护与检测

  • Falco:实时检测容器异常行为(反向 shell、逃逸、敏感文件访问)

  • Tracee:系统调用审计

  • 定期巡检:清理停止的容器、无用镜像、匿名卷

  • 不要长期运行同一个容器,变更走重建(容器是不可变基础设施,尽量无状态)

十、日常运维规范

  1. 禁止 docker exec -it 进容器改配置,改配置要重建镜像 / 启动新容器

  2. 容器退出策略:生产一般 restart: unless-stopped,避免故障自动拉起恶意容器

  3. 定期更新基础镜像、重新构建、重新部署,不要长年不更新镜像

  4. 权限分离:镜像构建、仓库推送、宿主机 docker 操作、编排权限分开

简短风险速查表(高频坑)

风险点

危害

挂载 /var/run/docker.sock

容器内接管宿主机 docker,最高危

--privileged

容器几乎不受限制,极易逃逸

暴露 2375 端口

全网无认证控制 docker,挖矿重灾区

容器以 root 运行

一旦 web 漏洞拿下,权限高

latest 镜像标签

版本不可控,漏洞突然上线

环境变量放密码

docker inspect 直接读取


本文原创作者:易君召,详见:https://www.yijunzhao.cn/authors/yijunzhao,转载请注明出处。

原文链接 https://www.yijunzhao.cn/archives/docker-container-security-best-practices

欢迎访问 小易撩挨踢

https://www.yijunzhao.cn/