Quick start: Mã hóa secret đầu tiên trong 5 phút
Thực hành luôn cho nóng. Bạn có thể tự tay mã hóa và đẩy một secret lên cluster ngay bây giờ qua 4 bước gọn nhẹ.
Bước 1: Cài đặt Sealed Secrets Controller
Controller chạy ngầm trong cluster để làm nhiệm vụ giải mã. Triển khai bản v0.24.5 bằng hai lệnh sau:
kubectl apply -f https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.24.5/controller.yaml
kubectl rollout status deployment sealed-secrets-controller -n kube-system
Đợi khoảng 10 đến 20 giây. Khi Pod chuyển sang trạng thái Running, controller sẽ tự động sinh cặp khóa RSA 4096-bit đầu tiên.
Bước 2: Cài CLI kubeseal trên máy local
kubeseal là công cụ phía client. Nhiệm vụ duy nhất của nó là mã hóa secret trước khi bạn commit code.
Với Linux:
wget https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.24.5/kubeseal-0.24.5-linux-amd64.tar.gz
tar -xvzf kubeseal-0.24.5-linux-amd64.tar.gz
sudo install -m 755 kubeseal /usr/local/bin/kubeseal
Với macOS, chỉ cần gõ brew install kubeseal.
Bước 3: Tạo secret và mã hóa (Seal)
Giả sử bạn cần tạo thông tin đăng nhập PostgreSQL gồm user và password 16 ký tự:
# 1. Tạo manifest secret thô ở chế độ dry-run
kubectl create secret generic db-credentials \
--from-literal=username=postgres \
--from-literal=password='kX9#mP2$vL8@qR5!' \
--dry-run=client -o yaml > secret-raw.yaml
# 2. Mã hóa thành SealedSecret qua kubeseal
kubeseal -f secret-raw.yaml -o yaml > sealedsecret.yaml
# 3. Xóa ngay file raw để tránh commit nhầm
rm -f secret-raw.yaml
Bước 4: Apply lên cluster và kiểm chứng
Đẩy file đã mã hóa vào cluster:
kubectl apply -f sealedsecret.yaml
# Kiểm tra secret thường do controller sinh ra
kubectl get secret db-credentials -o jsonpath='{.data.password}' | base64 -d
Mật khẩu giải mã ra khớp hoàn toàn với giá trị gốc. File sealedsecret.yaml giờ đây an toàn tuyệt đối để đẩy lên GitHub hoặc GitLab.
Bản chất vấn đề: Kubernetes Secret mặc định hớ hênh thế nào?
Rất nhiều người mới dùng Kubernetes lầm tưởng Secret là an toàn. Thực tế không phải vậy.
Dữ liệu trong Kubernetes Secret chỉ được encode bằng Base64. Base64 là phương thức chuyển đổi định dạng nhị phân sang ký tự đọc được. Nó không có tính năng mã hóa hay bảo mật. Bất kỳ ai mở manifest ra cũng có thể dịch ngược chuỗi Base64 về bản rõ trong vòng 1 giây.
Bài toán hóc búa của GitOps
Triển khai GitOps buộc toàn bộ manifest phải nằm trên Git repository. Git là nguồn chân lý duy nhất (Single Source of Truth) cho trạng thái của cả hệ thống.
Ở đây nảy sinh mâu thuẫn lớn. Commit secret dạng bản rõ lên Git thì mất an toàn. Ngược lại, nếu cấu hình secret thủ công ngoài cluster, tính nhất quán của GitOps coi như phá sản. Nhiều team chọn giải pháp dựng HashiCorp Vault. Vault rất mạnh, nhưng chi phí tài nguyên và độ phức tạp vận hành thường quá tải với các hệ thống vừa và nhỏ.
Cơ chế giải quyết của Sealed Secrets
Bitnami Sealed Secrets áp dụng mô hình mã hóa bất đối xứng (Asymmetric Cryptography) với cơ chế phân quyền rõ ràng:
- Public Key (Khóa công khai): Controller tự sinh ra và công khai cho mọi developer. Bạn tải khóa này về máy để đóng gói secret thành custom resource
SealedSecret. Chiếc khóa này chỉ có chiều đóng, không thể dùng để giải mã ngược lại. - Private Key (Khóa riêng): Lưu an toàn bên trong namespace
kube-system. Chỉ controller mới có quyền truy cập. Khi bạn push fileSealedSecretlên Git, controller sẽ phát hiện, tự giải mã và tạo ra K8s Secret nguyên bản cho Pod sử dụng.
Kẻ tấn công dù sao chép được toàn bộ Git repo của bạn cũng chỉ thấy những chuỗi ciphertext vô nghĩa.
Vận hành nâng cao: Kiểm soát Scope và quản lý Private Key
1. Phân quyền mã hóa bằng Scope
Mặc định, kubeseal sử dụng scope strict. Nghĩa là secret bị khóa chặt vào đúng tên resource và namespace ban đầu. Ai đó cố tình đổi namespace trong file YAML thì controller sẽ từ chối giải mã ngay lập tức.
Tùy kiến trúc triển khai, bạn có thể chọn 1 trong 3 scope:
- Strict (Mặc định): Bắt buộc trùng cả tên secret lẫn namespace. Phù hợp nhất cho production.
- Namespace-wide: Cho phép đổi tên secret, miễn là deploy cùng namespace:
kubeseal --scope namespace-wide -f secret-raw.yaml -o yaml > sealedsecret.yaml - Cluster-wide: Cho phép giải mã ở mọi namespace trong cụm. Phù hợp cho secret chung như Docker Registry credentials:
kubeseal --scope cluster-wide -f secret-raw.yaml -o yaml > sealedsecret.yaml
2. Kế hoạch Disaster Recovery: Đừng để mất Private Key
Mất Private Key đồng nghĩa với việc mất toàn bộ secrets. Nếu cả cụm gặp sự cố và phải dựng lại từ đầu, bạn sẽ không thể mở khóa hàng trăm file SealedSecret trên Git nữa.
Hãy backup key của controller ngay sau khi cài đặt:
kubectl get secret -n kube-system \
-l sealedsecrets.bitnami.com/sealed-secrets-key \
-o yaml > master-sealed-secrets-key.yaml
Lưu file backup này vào trình quản lý mật khẩu của team (như 1Password hoặc Bitwarden Vault). Khi dựng cụm khẩn cấp, bạn chỉ cần nạp lại secret này trước:
kubectl apply -f master-sealed-secrets-key.yaml
kubectl apply -f https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.24.5/controller.yaml
Controller nhận diện key cũ và giải mã toàn bộ dữ liệu trên Git bình thường. Không cần mã hóa lại bất kỳ file nào.
3 lưu ý thực tế khi chạy Production
- Kiểm soát xoay khóa (Key Rotation): Mặc định sau mỗi 30 ngày, controller sẽ tự động sinh cặp khóa mới. Các secret cũ vẫn được giải mã bình thường nhờ danh sách khóa lưu trữ trước đó. Tuy nhiên, mỗi lần xoay khóa, bạn nên chạy lại script backup để gom đủ mọi Private Key còn hiệu lực.
- Chặn leak secret bằng Gitleaks: Cài đặt
gitleakshoặctrufflehogvào pre-commit hook. Công cụ này sẽ chặn đứng nguy cơ developer vô tình commit filesecret-raw.yamllên remote repo. - Tích hợp với ArgoCD hoặc FluxCD:
SealedSecretlà một Kubernetes CRD chuẩn. ArgoCD tự động nhận diện và đồng bộ mà không cần plugin bổ sung. Bạn chỉ cần cấu hình ArgoCD bỏ qua (ignore) các Secret thông thường để tránh xung đột quyền sở hữu tài nguyên với Sealed Secrets controller.

