Kubernetes (K8s) là một nền tảng mạnh mẽ để triển khai, quản lý và mở rộng các ứng dụng container hóa. Tuy nhiên, việc quản lý và bảo mật các thông tin nhạy cảm như API keys, mật khẩu, chứng chỉ và các thông tin bí mật khác trong một môi trường phân tán như Kubernetes là một thách thức lớn. Đây là lý do tại sao cần tích hợp HashiCorp Vault vào Kubernetes
Cách hoạt động
- Một JWT token (Service account token) từ pod được chuyển đến Vault server.
- Vault server yêu cầu Kubernetes API server để lấy thông tin tài khoản dịch vụ và namespace gắn liền với JWT token.
- Kubernetes API server trả về chi tiết namespace và tài khoản dịch vụ.
- Vault server xác thực xem tài khoản dịch vụ có được ủy quyền để đọc secrets bằng cách sử dụng các chính sách đính kèm.
- Sau khi xác thực, Vault server trả về một Vault token.
- Trong một cuộc gọi API khác, Vault token được truyền kèm với đường dẫn secret để truy xuất các secrets.
Login & Access Vault UI
Tạo PV/PVC
Dùng K8S PV/PVC để khởi tạo cho Vault 1 PV/PVC riêng để dùng cho steps cr-draf.yaml
Cài đặt Operator
helm upgrade --install --set service.type=NodePort --wait vault-operator oci://ghcr.io/bank-vaults/helm-charts/vault-operator kubectl kustomize https://github.com/bank-vaults/vault-operator/deploy/rbac | kubectl apply -f -
Apply cr-draf.yaml
kubectl apply -f https://raw.githubusercontent.com/bank-vaults/vault-operator/v1.21.0/deploy/examples/cr-raft.yaml
Output cho những steps trên
có thể setup reverse proxy https://vaulttest.com ⇒ 30993
Config để lấy root token
- Cài đặt nginx reverse proxy để trỏ về NodePort ở trên (nếu cần)
- Thêm giá trị.
export VAULT_ADDR=https://vaulttest.com
hoặcexport VAULT_ADDR=https://127.0.0.1:8200
(nếu không làm bước 1) - Nhập chứng chỉ CA của phiên bản Vault bằng cách chạy các lệnh sau (nếu không, bạn sẽ bị lỗi x509: certificate signed by unknown authority errors):
kubectl get secret vault-tls -o jsonpath="{.data.ca\.crt}" | base64 --decode > $PWD/vault-ca.crt
export VAULT_CACERT=$PWD/vault-ca.crt
Ngoài ra, bạn có thể chỉ định Vault client bỏ qua việc xác minh chứng chỉ của Vault bằng cách chạy:export VAULT_SKIP_VERIFY=true
- Nếu bạn đã cài Vault CLI installed, thì có thể kiểm tra cách status bằng lệnh:
vault status
Copy Expected output:
Key Value
--- -----
Seal Type shamir
Initialized true
Sealed false
Total Shares 5
Threshold 3
Version 1.5.4
Cluster Name vault-cluster-27ecd0e6
Cluster ID ed5492f3-7ef3-c600-aef3-bd77897fd1e7
HA Enabled false
Để xác thực với Vault, bạn có thể chạy:
Để xác thực với Vault, bạn có thể chạy:
export VAULT_TOKEN=$(kubectl get secrets vault-unseal-keys -o jsonpath={.data.vault-root} | base64 --decode)
Enable Vault Kubernetes Authentication Method
vault auth enable kubernetes
Hoặc
Tạo Vault Secrets/Policy/Role
Để cho POD vào Vault đọc lấy value. Nếu bạn đã cài Vault CLI installed, thì có thể tạo 1 scret theo cách sau hoặc tạo bằng UI ở step trên
vault kv put secret/demosecret/aws AWS_SECRET_ACCESS_KEY=s3cr3t
Tạo vault-role
vault write auth/kubernetes/role/vault-role \ bound_service_account_names=* \ bound_service_account_namespaces=default \ policies=vault-policy \ ttl=8760h
Tạo vault-policy
vault policy write vault-policy - <<EOH
path "secret/*" {
capabilities = ["read"]
}
EOH
Note: các bước này có thể làm qua Vault UI
FILE POD MẪU
Apply pod sau đây để thấy nó echo ra được AWS SECRET ACCESS KEY mà ta đã lưu
apiVersion: apps/v1 kind: Deployment metadata: name: vault-test namespace: default spec: replicas: 1 selector: matchLabels: app.kubernetes.io/name: vault template: metadata: labels: app.kubernetes.io/name: vault annotations: vault.security.banzaicloud.io/vault-addr: https://vault:8200 vault.security.banzaicloud.io/vault-role: vault-role vault.security.banzaicloud.io/vault-skip-verify: 'true' vault.security.banzaicloud.io/vault-path: kubernetes spec: serviceAccountName: default containers: - name: alpine image: alpine command: ["sh", "-c", "echo $AWS_SECRET_ACCESS_KEY && echo going to sleep... && sleep 10000"] env: - name: AWS_SECRET_ACCESS_KEY value: vault:secret/demosecret/aws#AWS_SECRET_ACCESS_KEY
Chúc các bạn thành công!!!