Part 11 · Docker · 11.1.08

Least privilege và image supply chain

Secure container không chỉ là dùng image nhỏ. Phải bảo vệ đồng thời build inputs, artifact identity, registry/CI và runtime privileges; mỗi control giảm một nhóm rủi ro khác nhau và không control nào tự chứng minh image “an toàn tuyệt đối”.

Mental model: source/dependency → build → image digest + attestations → registry → deploy → runtime. Ở mỗi bước cần biết ai có quyền thay đổi, bằng chứng nào được tạo, điều gì được verify và cách quay lại known-good artifact khi có sự cố.

1. Security boundary và least privilege

Container dùng chung kernel với host, nên namespace/cgroup giúp giảm phạm vi nhưng không biến root trong container thành “vô hại”. Quyền điều khiển Docker daemon hoặc Docker socket có sức mạnh rất lớn vì có thể tạo container với host mounts và nhiều quyền khác. Chỉ cấp quyền daemon cho principal tin cậy; không mount Docker socket vào workload thông thường.

Ưu tiên chạy workload bằng fixed non-root UID/GID, root filesystem read-only, writable path được khai báo rõ, drop Linux capabilities, bật no-new-privileges, giữ seccomp/LSM policy, và đặt PID/memory/CPU limits. Tránh --privileged, host namespace và writable host mounts trừ khi threat model thật sự yêu cầu và đã có compensating controls.

2. Runtime hardening

ControlMục tiêuTrade-off / lưu ý
Non-root UID/GIDGiảm impact khi process bị compromise.App phải có permission đúng trên mount/path cần ghi; fixed UID giúp dự đoán ownership.
--read-only + explicit writable mountsGiảm persistence/tampering trong rootfs.Cần tmpfs hoặc volume cho /tmp, cache, uploads, PID/socket files nếu app cần.
--cap-drop=ALLGiảm quyền kernel không cần thiết.Chỉ add lại capability thật sự cần; test behavior thay vì add rộng.
no-new-privilegesNgăn process đạt thêm privilege qua exec/setuid.Có thể làm một số binary/helper cũ không chạy.
Default seccomp + LSMGiảm syscall/action có thể sử dụng khi bị exploit.Custom profile quá chặt có thể gây lỗi khó chẩn đoán; không tắt default profile chỉ để “cho chạy”.
PID/memory/CPU limitsGiới hạn blast radius của fork bomb, memory leak hoặc runaway CPU.Limit quá thấp tạo self-inflicted outage; phải đo peak và có headroom.
# Ví dụ baseline; điều chỉnh port/mount/limit theo workload thật.
docker run --rm \
  --read-only \
  --tmpfs /tmp:rw,noexec,nosuid,size=64m \
  --cap-drop=ALL \
  --security-opt no-new-privileges=true \
  --pids-limit 200 \
  --memory 512m \
  --cpus 1 \
  registry.example.com/payments@sha256:<digest>
Secrets: inject ở runtime bằng secret mechanism phù hợp platform. Tránh bake secret vào image, command history, log hoặc environment khi sensitivity cao. Environment variable tiện nhưng có thể bị lộ qua diagnostics/process inspection tùy platform và quyền truy cập.

3. Image hygiene

Dùng minimal, trusted base image; loại bỏ compiler/package manager/debug tool không cần ở runtime; dùng multi-stage build; scan cả OS packages lẫn application dependencies. Pin digest khi cần reproducibility/assurance cao vì tag là mutable pointer, không phải bằng chứng content identity.

Pin digest cũng có trade-off: image không tự nhận security update mới. Vì vậy cần bot/process phát hiện base digest mới, rebuild định kỳ hoặc theo CVE, test rồi promote digest mới. “Image nhỏ” giảm attack surface tiềm năng nhưng không thay thế provenance, vulnerability management hay runtime hardening.

Scanner result không phải binary truth. Có false positive, package không reachable, CVE chưa có fixed version và risk phụ thuộc exposure. Policy nên kết hợp severity, exploitability/reachability, internet exposure, data sensitivity, exception owner và expiry date.

Build secret đúng cách

Không dùng ARG hoặc ENV để đưa credential vào build vì chúng có thể tồn tại trong image metadata/layers. Docker BuildKit secret mount chỉ expose secret trong build step thay vì bake secret vào image.

# CLI
docker build --secret id=npm_token,src=.npm-token -t app:build .

# Dockerfile
RUN --mount=type=secret,id=npm_token \
    NPM_TOKEN="$(cat /run/secrets/npm_token)" npm ci

4. Supply chain: identity, provenance và promotion

Lock dependencies, protect source control/CI builder/registry, tạo SBOM và provenance, ký/verify artifact theo trust policy, và promote cùng một digest giữa environments. Rebuild riêng cho staging và production tạo hai artifact khác nhau dù source giống nhau.

# Build + push với SBOM và provenance attestations
docker buildx build \
  --sbom=true \
  --provenance=true \
  -t registry.example.com/app:2026-09-12 \
  --push .

# Deploy bằng immutable digest thay vì tin vào tag
registry.example.com/app@sha256:<verified-digest>

SBOM trả lời “artifact chứa component nào”; provenance trả lời “artifact được build như thế nào/từ inputs nào” theo mức metadata được tạo. Signature/attestation giúp bind identity và statement với artifact, nhưng verifier vẫn phải có trust policy: signer/issuer nào được chấp nhận, source repo/ref nào hợp lệ, builder nào được tin, và policy nào phải pass trước deploy.

SLSA là framework tăng dần assurance cho software supply chain. Với SLSA v1.2 hiện hành, hãy chọn track/level phù hợp thay vì nói chung chung “SLSA compliant”; scope guarantee phải gắn với control thực tế của source/build platform và verification policy.

5. Threats, failure windows và operational signals

Threat / failureFailure windowSignal nên theo dõiContainment đầu tiên
Malicious/outdated base hoặc dependencyTừ lúc dependency bị compromise/CVE xuất hiện đến khi image mới được rebuild và deploy.New critical/high CVE, base digest drift, unexpected package/SBOM delta.Block promotion theo policy; rebuild từ approved base/dependency; expire exception có owner.
Registry credential theft / tag overwriteTừ credential compromise đến revoke; tag mutable có thể trỏ sang digest khác.Push từ principal/IP bất thường, tag digest changed, failed signature/provenance verification.Revoke/rotate credential, quarantine digest, deploy only verified digest.
CI/builder poisoningCó thể kéo dài qua nhiều release cho tới khi provenance/build behavior được điều tra.Unexpected builder identity, changed workflow, provenance mismatch, anomalous outbound access.Disable compromised runner/identity, rotate secrets, rebuild trên trusted builder.
Exposed Docker API/socketAttack có thể thành host-level impact rất nhanh.Unexpected containers, privileged flags, host mounts, daemon API access.Isolate host, revoke access, stop unauthorized workloads, preserve audit evidence.
Container escape / excessive privilegeTừ exploit đến detection; blast radius tăng mạnh nếu privileged/host mounts.Unexpected syscalls/process tree, writes outside declared paths, host namespace access, EDR/runtime alerts.Quarantine node/workload, rotate reachable secrets, patch runtime/kernel, reduce privileges.
Secret in image/layer/logPersist tới khi secret bị rotated; xóa tag không đảm bảo copies/cache biến mất.Secret scanning alert, suspicious auth use, credential found in history/SBOM/log.Rotate/revoke ngay, remove exposure, rebuild clean artifact, purge caches/registry per retention capability.

6. Verification gate trước deploy

7. Rollback, recovery và incident response

Giữ previous known-good digest và deployment metadata để rollback nhanh. Khi phát hiện artifact đáng ngờ, ưu tiên quarantine digest + revoke credentials + stop promotion; đừng chỉ retag vì tag không thay đổi content đã tồn tại. Rebuild sạch từ trusted source/builder sau khi root cause được xử lý, rồi verify lại attestations và runtime policy trước rollout.

Sau containment, kiểm tra nơi digest đã được deploy, secrets nào workload có thể đọc, node/registry/cache nào giữ artifact và log nào cần preserve. Recovery hoàn tất khi known-good digest được phục hồi, credentials đã rotate, policy gate ngăn tái diễn và monitoring không còn signal bất thường.

Không có single control đủ mạnh. Non-root không cứu được writable Docker socket; signature không chứng minh artifact không có CVE; scan sạch không chứng minh build inputs không bị poison; digest pinning không tự cập nhật bản vá. Defense-in-depth cần nối build identity, artifact verification và runtime least privilege.
Tài liệu: Docker Engine security · Docker Rootless mode · Docker seccomp · Docker Build secrets · Docker Scout policy · Docker Scout SBOMs · SLSA v1.2 · Sigstore Cosign verification