0Pricing
Security+ Academy · 课时

容器安全:镜像加固与运行时保护

通过删除不必要的软件包、以非 root 用户运行,并使用运行时安全工具(Falco、Sysdig)检测异常容器行为来加固 Docker 镜像。

容器安全:镜像加固与运行时保护 是 CoddyKit 上的免费 Security+ Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Security+ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Security+ Academy 课程共包含 4 节课。

容器安全基础

容器会将应用代码及其依赖打包成彼此隔离的单元,并共享主机 OS 内核;相比之下,虚拟机包含完整的客户机 OS。这种共享机制使容器轻量且快速,但也引入了不同的安全模型:容器逃逸漏洞可能允许攻击者突破容器,直接访问主机内核,从而影响其他所有容器。容器安全关注三个层面:镜像(其中预先包含的内容)、运行时(容器运行期间能够执行的操作),以及编排平台(容器的管理方式)。

最小化基础镜像:减少攻击面

容器镜像中安装的每个软件包都可能成为攻击面。最小化基础镜像原则要求从尽可能小的基础开始:Alpine Linux(5MB,仅包含最少的软件包)、无发行版镜像(Google 提供的镜像,仅包含运行时和应用,不含 shell 或软件包管理器),或 scratch(完全为空,适用于静态编译的二进制文件)。没有 shell 的容器意味着,即使攻击者成功执行代码,也无法轻易运行 wget、curl 或其他工具来扩大攻击,这种原则称为通过最小暴露进行防御。

# Bad: starts from a full OS image
FROM ubuntu:22.04

# Better: minimal Alpine base
FROM alpine:3.18

# Best: distroless for Java apps
FROM gcr.io/distroless/java17-debian11

以非 root 用户运行:首要规则

默认情况下,Docker 容器以 root(UID 0)身份运行。如果攻击者利用容器化应用中的漏洞,就会在容器内获得 root 权限。如果容器共享卷或挂载了主机目录,那么容器内的 root 可能等同于主机上的 root。解决方法很简单:在 Dockerfile 中创建专用用户,并在最终的 CMD/ENTRYPOINT 之前使用 USER 指令切换到该用户。许多容器安全扫描工具会将任何没有非 root 用户的镜像标记为安全问题。

FROM alpine:3.18
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
COPY --chown=appuser:appgroup app /app/app
USER appuser
CMD ["/app/app"]

不可变容器与只读文件系统

不可变容器是指其文件系统在运行时无法修改的容器。在 Docker 中启用 --read-only(或在 Kubernetes 中启用 readOnlyRootFilesystem: true)可以防止攻击者将恶意软件写入磁盘、修改配置文件,或在运行中的容器内安装工具。确实需要写入数据(日志、临时文件)的应用,可以挂载特定的tmpfs 卷来执行临时写入。不可变容器贯彻了这样的原则:运行时状态应仅来自镜像和配置,而不应来自容器内修改,以免绕过您的 CI/CD 安全流水线。

# Run container with read-only root filesystem
docker run --read-only \
  --tmpfs /tmp \
  --tmpfs /var/run \
  myapp:latest

镜像扫描:在部署前发现 CVE

容器镜像扫描工具会将 Docker 镜像中安装的软件包与漏洞数据库(NVD、CVE)进行比对,并报告已知的 CVE。常用的扫描器包括 Trivy(Aqua Security,速度快且免费)、Grype(Anchore)、Snyk Container 和 AWS ECR 镜像扫描。应将扫描集成到持续集成/持续交付流水线中,以便任何包含 CRITICAL 或 HIGH CVE 的镜像在推送到镜像仓库之前使流水线失败。扫描器还应检查是否有机密信息(API 密钥、密码)被意外嵌入镜像层。

# Scan a Docker image with Trivy
trivy image --severity HIGH,CRITICAL myapp:latest

# Fail CI pipeline if vulnerabilities found
trivy image --exit-code 1 --severity CRITICAL myapp:latest

机密信息管理:绝不能放在镜像层中

一种常见且危险的错误,是将机密信息(API 密钥、数据库密码、TLS 证书)嵌入 Docker 镜像中——例如写入构建到镜像中的环境变量,或通过 COPY 添加的文件。这些机密信息可被任何有权访问镜像的人通过 docker history 或提取镜像层来查看。即使后续镜像层删除了该文件,它仍会保留在镜像历史记录中。应在运行时通过机密管理器提供的环境变量、Docker secrets 或以卷形式挂载的 Kubernetes Secrets 注入机密信息。

# Never bake secrets into images
# Bad: ENV DATABASE_PASSWORD='supersecret'

# Good: inject at runtime via environment
docker run -e DATABASE_PASSWORD=$(vault read -field=password secret/db) myapp:latest

# Or use Docker secrets in Swarm/K8s

运行时保护:Falco 与系统调用监控

运行时安全工具会监控容器运行期间的行为,并对异常活动发出警报或将其阻止。Falco(CNCF 项目)使用 eBPF 或内核模块接入 Linux 内核,拦截系统调用并将其与规则进行比对。例如,某条规则可以在容器启动 Shell(execve('/bin/sh'))、在异常端口打开网络连接,或读取 /etc/shadow 时发出警报。即使没有利用任何已知的 CVE,这些行为指标也常常表明正在发生攻击。Sysdig Secure 和 Aqua Security 提供商业运行时保护平台。

# Example Falco rule: alert on shell execution in container
# - rule: Shell Spawned in Container
#   desc: A shell was spawned in a container
#   condition: container and proc.name in (bash, sh, zsh)
#   output: Shell spawned (user=%user.name container=%container.name)
#   priority: WARNING

Linux 功能与 Seccomp 配置文件

Docker 容器默认会删除许多 Linux 功能,但仍会保留大多数应用程序并不需要的权限。功能会将 root 权限划分为彼此独立的单元(例如 CAP_NET_ADMIN、CAP_SYS_ADMIN)。最佳实践是删除所有功能,然后仅使用 --cap-drop=ALL --cap-add=NET_BIND_SERVICE 添加必需的功能。Seccomp(安全计算模式)配置文件会列出容器允许执行的系统调用;Docker 包含一个默认的 seccomp 配置文件,可阻止约 44 个危险的系统调用。针对特定应用程序定制的 seccomp 配置文件还可以进一步限制权限,阻止应用程序从未合法使用的所有系统调用。

# Drop all capabilities, add only what's needed
docker run \
  --cap-drop=ALL \
  --cap-add=NET_BIND_SERVICE \
  --security-opt seccomp=/etc/docker/seccomp-custom.json \
  myapp:latest

容器镜像仓库与镜像签名

容器镜像仓库(Docker Hub、AWS ECR、Google Artifact Registry)负责存储和分发镜像。保护镜像仓库包括:启用推送时的漏洞扫描;仅允许持续集成/持续交付服务账户进行推送;使用 Sigstore/Cosign 或 Docker Content Trust (Notary) 启用镜像签名,确保运行时环境只从可信来源拉取经过加密签名的镜像;以及配置镜像不可变性,使标签无法被覆盖(从而消除标签篡改攻击,即攻击者用恶意镜像替换受信任的 :latest 标签)。

# Sign a container image with Cosign
cosign sign --key cosign.key myregistry.io/myapp:v1.2.3

# Verify signature before deployment
cosign verify --key cosign.pub myregistry.io/myapp:v1.2.3

容器逃逸技术与防御措施

在容器内取得代码执行能力的攻击者,可能会尝试容器逃逸以访问主机。常见技术包括:利用存在漏洞的特权容器(--privileged 几乎可以不受限制地访问主机);滥用暴露的 Docker 套接字(将 /var/run/docker.sock 挂载到容器中,会授予完整的 Docker API 访问权限,包括创建特权容器);以及利用未受保护的功能攻击内核漏洞。防御措施包括:除非绝对必要,否则不要使用特权模式;绝不要将 Docker 套接字挂载到应用程序容器中;及时修补主机内核;对于需要强隔离的工作负载,使用 gVisor 或 Kata Containers。

# DANGEROUS: never do this in production
# docker run --privileged -v /:/host myapp:latest

# Check if a container is running privileged
docker inspect mycontainer | grep -i privileged

CIS Docker 基准合规性

互联网安全中心(CIS)Docker 基准为 Docker 主机和容器提供详细的安全配置指南,涵盖守护进程配置、镜像卫生、容器运行时设置和网络控制。Docker Bench for Security 等工具可以根据 CIS 基准自动执行合规性检查,并生成包含通过/失败项目评分的报告。定期运行此基准并将其集成到持续集成/持续交付流程中,可以确保及时发现安全配置漂移。Security+ 考生应了解,在考试语境中,CIS 基准是操作系统和平台加固的主要参考资料。

# Run Docker Bench for Security
docker run -it --net host --pid host --userns host --cap-add audit_control \
  -v /var/lib:/var/lib -v /var/run/docker.sock:/var/run/docker.sock \
  -v /etc:/etc docker/docker-bench-security

快速检查

请检查您对本课 CompTIA Security+(SY0-701)概念的理解程度。

课程回顾

本课介绍了以下内容:精简基础镜像和非 root 用户可以缩小攻击面并降低容器化工作负载的权限级别;Falco 等运行时保护工具可以检测容器内表明正在遭受攻击的异常系统调用模式;绝不要使用特权容器,也不要将 Docker 套接字挂载到应用程序容器中,因为这些配置会导致容器逃逸。接下来,我们将学习 Kubernetes 安全,包括 RBAC、网络策略和 Pod 安全标准。

常见问题解答

「容器安全:镜像加固与运行时保护」课时是免费的吗?

是的 — 「容器安全:镜像加固与运行时保护」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Security+ Academy 课程的其余内容,请升级到 CoddyKit PRO。 Security+ Academy 课程共包含 4 节课。

「容器安全:镜像加固与运行时保护」这节课中我会学到什么?

通过删除不必要的软件包、以非 root 用户运行,并使用运行时安全工具(Falco、Sysdig)检测异常容器行为来加固 Docker 镜像。 你通过在浏览器中直接运行的动手代码来练习 Security+ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Security+ Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Security+ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「容器安全:镜像加固与运行时保护」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Security+ Academy 课中编写并运行代码吗?

能。每节 Security+ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 容器安全:镜像加固与运行时保护
  2. Kubernetes 安全:RBAC、网络策略与 Pod 安全
  3. 无服务器与函数安全
  4. 基础设施即代码安全扫描
← 返回 Security+ Academy