如何对含二进制及源码的Docker镜像与容器做安全防护,避免内部文件被非法访问
Docker镜像与容器内部敏感文件防护方案
有可落地的多层技术方案可以大幅提升镜像、容器内部二进制文件和源代码的安全性,有效阻止普通用户的非法访问,大幅提高定向攻击的门槛,具体方案分为以下几个层面:
镜像层面防护
- 最小化镜像构建:仅保留运行必需的二进制文件和依赖,完全剔除源代码、调试工具、
bash/sh等交互Shell、cat/cp等文件读取工具,优先使用distroless、alpine-minirootfs这类极简基础镜像,尽可能缩小攻击面。 - 镜像层加密:遵循OCI镜像加密规范对镜像层进行加密,只有持有解密密钥的可信运行时环境才能拉取、解密并启动镜像,避免镜像在分发、存储环节被直接解包读取内部文件。
- 销毁中间构建层:使用多阶段构建完全剔除源代码和编译过程残留,仅将最终生成的二进制文件打入运行镜像,同时可配合
docker build --squash参数合并镜像层,避免攻击者从历史镜像层恢复被删除的源代码或敏感文件。多阶段构建示例如下:
# 构建阶段:仅用于编译源代码,不会进入最终镜像 FROM golang:1.21 AS builder COPY . /src RUN cd /src && go build -o myapp main.go # 最终运行阶段:仅包含运行所需的最小环境和编译好的二进制 FROM gcr.io/distroless/base-debian12 COPY --from=builder /src/myapp /usr/local/bin/myapp ENTRYPOINT ["myapp"]
- 管控镜像导出权限:严格限制容器运行环境的Docker daemon访问权限,禁止普通用户执行
docker save/docker export等可导出镜像内容的命令。
容器运行时防护
- 非root权限运行:容器启动时指定无额外权限的普通用户运行进程,同时将敏感二进制文件的权限设置为
0700,仅允许运行用户可读可执行,其他用户无任何访问权限。 - 禁用交互与提权能力:启动容器时添加
--cap-drop all参数禁用所有默认Linux capability,同时配置--security-opt no-new-privileges,禁止用户通过docker exec进入容器,也禁止容器内部进程提权。 - 只读根文件系统:启动容器时添加
--read-only参数将根文件系统设置为只读,仅给日志、临时数据等必需目录挂载临时存储,避免攻击者篡改二进制文件或者写入恶意脚本读取敏感内容。 - 系统调用限制:通过seccomp、AppArmor、SELinux配置自定义安全策略,禁止容器内部进程执行
open/read类系统调用访问敏感二进制文件的存储路径,仅允许主进程加载调用二进制。
二进制与代码本身加固
- 二进制加壳混淆:对编译生成的二进制文件做加壳、代码混淆、反调试处理,即使攻击者拿到二进制文件也无法直接反编译还原核心逻辑。
- 核心逻辑拆分:极度敏感的核心逻辑可以拆分到独立的可信服务中部署,业务容器仅保留调用接口,不存储核心代码和二进制文件。
注意:以上所有方案都是提升攻击门槛的防护手段,如果攻击者可以获得宿主机的root权限,所有容器层面的防护都可以被绕过,因此必须同步做好宿主机的权限管控和安全加固。
内容的提问来源于stack exchange,提问作者Gowtham
相关产品推荐
相关产品推荐

