Quản lý Bí mật với SOPS & AGE
1. Mô hình bảo mật Zero-Trust
Phần tiêu đề “1. Mô hình bảo mật Zero-Trust”Trong dự án này, toàn bộ mã nguồn hạ tầng và ứng dụng được công khai trên GitHub. Để bảo vệ an toàn các thông tin đăng nhập, API token và chứng chỉ bảo mật, chúng tôi sử dụng công cụ SOPS kết hợp với thuật toán mã hoá phi đối xứng AGE.
Các Secret Kubernetes ở dạng văn bản thuần (plaintext) tuyệt đối không bao giờ được commit lên Git. Thay vào đó:
- Secret được mã hoá cục bộ trên máy dev bằng Public Key của AGE.
- File đã mã hoá (
*.sops.yaml) được đẩy an toàn lên kho Git public. - Trong cụm k3s, pod
argocd-repo-serversử dụng plugin KSOPS để giải mã trực tiếp trong bộ nhớ RAM trước khi đẩy vào Kubernetes API.
2. Vòng đời khoá AGE & Phân quyền bảo mật
Phần tiêu đề “2. Vòng đời khoá AGE & Phân quyền bảo mật”Cặp khoá AGE phân định ranh giới trách nhiệm rõ ràng:
flowchart LR Dev["Máy Dev Local"] -- "Mã hoá bằng Public Key" --> Git["Git Repo (.sops.yaml)"] Git -- "Lấy manifest mã hoá" --> RepoServer["argocd-repo-server"] VPSKey["/var/lib/sops-age/age.agekey (chmod 600, uid 999)"] -- "Gắn volume vào" --> RepoServer RepoServer -- "KSOPS giải mã trên RAM" --> K8sAPI["k3s API Server (Secret hoàn chỉnh)"]- Public Key: Được khai báo trong file cấu hình
.sops.yamltại trườngcreation_rules. Key này công khai và an toàn khi commit lên Git. - Private Key:
- Máy Local: Nằm tại
~/.config/sops/age/keys.txt. Dùng để mã hoá secret và giải mã kiểm tra khi dev. - Máy chủ VPS: Do role Ansible triển khai tới
/var/lib/sops-age/age.agekeyvới quyền truy cập nghiêm ngặt (0600, sở hữu bởi user UID999tương ứng với userargocdtrong container).
- Máy Local: Nằm tại
3. Tích hợp KSOPS v4.5.1 trong cụm
Phần tiêu đề “3. Tích hợp KSOPS v4.5.1 trong cụm”Plugin KSOPS được nhúng vào pod argocd-repo-server trong quá trình Ansible triển khai Helm chart argo-cd.
Cấu hình chính trên Repo-Server
Phần tiêu đề “Cấu hình chính trên Repo-Server”- Gắn Volume: Mount thư mục
/var/lib/sops-agetừ host vào container ở chế độ Read-Only. - Biến môi trường:
SOPS_AGE_KEY_FILE=/var/lib/sops-age/age.agekeyKUSTOMIZE_PLUGIN_HOME=/opt/ksops
4. Ba tầng Secret trong hệ thống
Phần tiêu đề “4. Ba tầng Secret trong hệ thống”Secret trong toàn bộ repo được chia thành 3 miền vận hành độc lập:
- Bootstrap Secrets (
ansible/inventory/group_vars/all.sops.yml): Chứa API key Hetzner, mật khẩu quản trị ban đầu của ArgoCD và Private Key AGE để nạp lên host. - Workload Secrets (
cluster/apps/<app>/secret.sops.yaml): Chứa thông tin đăng nhập database, khoá bí mật runtime của từng ứng dụng người dùng. - Infrastructure Secrets: Cloudflare API Token phục vụ xác thực DNS-01 cho cert-manager khi mở rộng cấp chứng chỉ wildcard.
5. Rào chắn bảo vệ tự động trên CI (GitHub Actions)
Phần tiêu đề “5. Rào chắn bảo vệ tự động trên CI (GitHub Actions)”Quy trình CI .github/workflows/validate.yml kiểm tra tính toàn vẹn của secret trên mỗi pull request:
- Quét toàn bộ file YAML để chặn đứng bất kỳ file nào có
kind: Secretmà chưa được mã hoá. - Chạy lệnh
sops filestatustrên tất cả các file*.sops.yamlđể xác minh chữ ký mã hoá hợp lệ.