第6天 — 审计
Source: Dev.to
Gord 在村庄边缘停下,点了点头指向 Rothütle 的背包。
“你的包挺重的,”她说。“而且很吵。让我检查一下。”
Rothütle 犹豫道:“那只是我的东西。”
“在深林里,”她跪在一块长满苔藓的石头旁回答,“重量会拖慢你——噪音会吸引不该来的注意。”
他不情愿地把背包递过去。Gord 以冷静而精准的方式检查里面的物品:一本笔记本、备用衬衫、墨水瓶、三支笔,以及一个精心包好的糕点。
她抬起糕点。
“提振士气,”他递上。
“喂动物,”她把它放到一旁说,“还有可能更糟。”
她逐一取出任何可能晃动、碎裂、泄漏或留下痕迹的东西。
“森林中被腐化的部分会利用你携带的东西对付你,”她补充道。“而 Jack 知道如何通过痕迹追踪。”
Rothütle 看着自己的背包变得异常轻盈。
“我感觉暴露了。”
“很好,”Gord 回答,重新打包只留下必要的东西。“沉默的负担能让你活下来。”
每日小贴士:去除不必要的组件可以让你的镜像更安全。
安全提示 #6 — 镜像硬化
Gord 的审计就是镜像硬化的故事版:减轻重量,降低噪音,降低风险。
容器内部的每一个不必要的包都会变成:
- 需要打补丁的额外依赖,
- 隐藏漏洞的额外空间,
- 攻击者可以利用的额外线索,帮助他们了解你的系统。
正如 Gord 减轻了 Rothütle 的负担,镜像硬化也在削减你的容器攻击面。
如何硬化你的镜像
- 从最小化基础镜像开始(distroless、slim、Alpine、Docker Hardened Images)。
- 使用多阶段构建,让只有编译产物进入最终镜像。
- 删除“以防万一”工具——除非绝对需要,否则不要留 shell、
curl、ping、nano。 - 更倾向于使用重新构建的干净镜像而不是打补丁的镜像。
- 定期扫描镜像。
示例 1:Docker Hardened Images
FROM gord/dhi-python:3.13
# Copy only necessary application files
COPY app/ /app/
WORKDIR /app/
CMD ["python", "main.py"]
DHI 是 Docker 维护的一套近零 CVE 基础镜像,专为生产工作负载设计。
示例 2:Alpine 最小化基础镜像
FROM alpine:3.19
# Install only the package needed to run the app, then remove build cache
RUN apk --no-cache add python3
# Copy the application
COPY app/ /app/
WORKDIR /app/
CMD ["python3", "main.py"]
Alpine Linux 是一个体积小、注重安全的发行版,常用于最小化容器镜像。
示例 3:多阶段构建
# Stage 1: The Build Stage (contains heavy build tools)
FROM golang:1.21-alpine AS builder
WORKDIR /src
COPY . .
RUN go build -o /usr/local/bin/myapp ./cmd/
# Stage 2: The Final Runtime Stage (minimal, hardened)
FROM alpine:3.19
# Copy only the compiled binary from the builder stage
COPY --from=builder /usr/local/bin/myapp /usr/local/bin/myapp
# No shell or Go dependencies are carried over, only the single binary.
CMD ["/usr/local/bin/myapp"]
安静的镜像就像安静的旅行者:更难被发现,更难被利用,也更具韧性。
第 7 天预告 — 深入黑暗
明天,Gord 和 Rothütle 将离开 Oberried,踏入真正的森林——光线变薄,阴影加深,Gord 正在为她的刀进行一次 Rothütle 从未见过的仪式。
而有东西正从松林之间注视着他们。