Bảo mật Docker: Chặn đứng Image ‘lậu’ với Docker Content Trust (DCT)

Docker tutorial - IT technology blog
Docker tutorial - IT technology blog

Bạn có thực sự biết thứ mình vừa tải về là gì không?

Hàng ngày, chúng ta gõ docker pull như một bản năng. Nhưng liệu Image nginx:latest hay ubuntu:22.04 bạn vừa tải về có thực sự “sạch”? Hay nó đã bị hacker tiêm backdoor rồi đẩy lên Docker Hub với cái tên gần giống để đánh lừa người dùng?

Hai năm trước, khi mình quản lý cụm 50 node cho một dự án Fintech, một bạn thực tập sinh đã kéo nhầm Image từ repository cá nhân về test. Chỉ 15 phút sau, hệ thống giám sát báo động đỏ liên tục. Server bắt đầu chiếm 100% CPU để đào coin ngầm. Sai lầm đó khiến cả team thức trắng 2 đêm để rà soát toàn bộ hạ tầng.

Để ngăn chặn thảm họa này, Docker Content Trust (DCT) là giải pháp bắt buộc. Nó đảm bảo hệ thống chỉ chạy những Image đã được ký xác thực bởi người mà bạn tin tưởng.

Kích hoạt DCT trong 30 giây

Mặc định, Docker “thả cửa” cho mọi Image. Để siết chặt an ninh, bạn chỉ cần thiết lập một biến môi trường duy nhất trên máy Linux.

Bước 1: Bật DCT tạm thời

export DOCKER_CONTENT_TRUST=1

Bước 2: Kiểm chứng hiệu quả

Hãy thử kéo một Image chưa được ký (ví dụ các image cá nhân ít tên tuổi):

docker pull bitnami/not-signed-image:latest

Docker sẽ chặn đứng lệnh này ngay lập tức với thông báo: “Error: remote trust data does not exist”. Lúc này, bạn chỉ có thể tải các Image chính chủ như library/nginx vì chúng đã có chữ ký xác thực.

DCT hoạt động như thế nào?

Hãy coi DCT như một “công chứng viên kỹ thuật số”. Nó sử dụng hệ thống Notary để quản lý các cặp khóa (Public/Private Key). Khi bạn đẩy Image lên, Docker dùng khóa riêng để ký tên. Khi người khác kéo về, Docker dùng khóa công khai để đối chiếu chữ ký.

Nếu Image bị chỉnh sửa dù chỉ 1 bit, chữ ký sẽ không khớp và lệnh pull thất bại. Có hai loại khóa bạn cần đặc biệt lưu tâm:

  • Root Key: Khóa tối cao để quản lý mọi quyền hạn. Mất khóa này đồng nghĩa với việc mất toàn bộ quyền kiểm soát dữ liệu tin cậy.
  • Tagging Key: Khóa dùng để ký trực tiếp lên từng phiên bản (tag) của Image.

Tự ký xác thực Image của riêng bạn

Trong môi trường doanh nghiệp, việc chỉ dùng Image từ Docker Hub là chưa đủ. Bạn cần tự ký cho các Image do team mình build ra để đảm bảo an toàn nội bộ.

1. Tạo khóa ký (Signing Key)

Đầu tiên, hãy khởi tạo cặp khóa trên máy cá nhân:

docker trust key generate my-signer-key

Docker sẽ yêu cầu nhập passphrase. Hãy lưu giữ nó thật kỹ vì file khóa sẽ nằm tại ~/.docker/trust/.

2. Khai báo người ký cho Repository

Giả sử bạn dùng Repo myregistry.com/my-app. Hãy cấp quyền ký cho user:

docker trust signer add --key my-signer-key.pub my-signer-name myregistry.com/my-app

3. Đẩy Image đã ký lên hệ thống

Khi biến DOCKER_CONTENT_TRUST=1 đang bật, lệnh push sẽ tự động kèm theo chữ ký:

docker push myregistry.com/my-app:v1.0

Từ giờ, bất kỳ server nào bật DCT đều sẽ tin tưởng hoàn toàn vào bản v1.0 này.

Triển khai DCT cho môi trường Production

Gõ lệnh export thủ công rất dễ quên. Để chuyên nghiệp hóa, mình thường áp dụng hai cách sau:

Cấu hình vĩnh viễn cho User: Thêm export DOCKER_CONTENT_TRUST=1 vào file .bashrc. Cách này giúp mọi thao tác Docker của user đó luôn được bảo vệ.

Áp dụng vào CI/CD Pipeline: Trong script deploy (như GitHub Actions hay GitLab CI), hãy set biến môi trường này trước khi build/push. Nếu server CI/CD bị xâm nhập và kẻ địch cố thay đổi Image, quá trình deploy sẽ thất bại ngay lập tức.

Kinh nghiệm thực tế: Đừng để mất bò mới lo làm chuồng

Sau nhiều lần “vấp ngã”, mình rút ra 3 lưu ý sống còn khi dùng Docker Trust:

  • Sao lưu Root Key ngay lập tức: Mình từng mất Root Key khi cài lại máy, dẫn đến việc không thể cập nhật chữ ký cho Image cũ. Hãy cất thư mục ~/.docker/trust vào USB offline hoặc Vault bảo mật.
  • Kiểm tra Registry hỗ trợ: Không phải mọi Registry đều tương thích với Notary. Docker Hub, Harbor và Azure Container Registry (ACR) hiện hỗ trợ rất tốt.
  • Quản lý Base Image: Luôn dùng FROM từ các Image đã được ký. Nếu lớp nền không an toàn, toàn bộ Image của bạn vẫn tiềm ẩn rủi ro.

Tóm lại

Việc bật Docker Content Trust có thể khiến quy trình làm việc chậm đi vài giây để nhập mật khẩu. Tuy nhiên, cái giá đó quá rẻ so với việc hệ thống bị dính ransomware hay rò rỉ dữ liệu khách hàng. Nếu bạn đang quản lý các hệ thống quan trọng, hãy kích hoạt DCT ngay hôm nay.

Share: