Chuyển đến nội dung chính

第 13 課:Kubernetes、AWS 和雲端驗證方法

Kubernetes 驗證方法(服務帳戶令牌審核、綁定命名空間、綁定服務帳戶)、AWS 身份驗證方法(IAM 驗證、EC2 驗證、跨帳戶)、Azure 驗證方法、GCP 驗證方法、SPIFFE 驗證方法(1.21 中新增)、工作負載驗證方法、GCP 驗證方法、SPIFFE 身份驗證方法(1.21 中新增)、工作負載身份負載。

<定義> <線性漸變 id="bg-95" x1="0%" y1="0%" x2="100%" y2="100%">

<矩形寬度=“1200”高度=“340”rx=“12”填滿=“url(#bg-95)”/>

<圓cx =“750”cy =“80”r =“1.5”填入=“#f87171”不透明度=“0.15”/> <圓cx =“750”cy =“108”r =“1.5”填入=“#f87171”不透明度=“0.15”/> <圓cx =“750”cy =“136”r =“1.5”填入=“#f87171”不透明度=“0.15”/> <圓cx =“750”cy =“164”r =“1.5”填入=“#f87171”不透明度=“0.15”/> <圓cx =“778”cy =“108”r =“1.5”填入=“#f87171”不透明度=“0.15”/> <圓cx =“806”cy =“80”r =“1.5”填入=“#f87171”不透明度=“0.15”/> <圓cx =“806”cy =“108”r =“1.5”填入=“#f87171”不透明度=“0.15”/> <圓cx =“806”cy =“136”r =“1.5”填入=“#f87171”不透明度=“0.15”/> <圓cx =“806”cy =“164”r =“1.5”填入=“#f87171”不透明度=“0.15”/> <圓cx =“834”cy =“80”r =“1.5”填入=“#f87171”不透明度=“0.15”/> <圓cx =“834”cy =“108”r =“1.5”填入=“#f87171”不透明度=“0.15”/> <圓cx =“834”cy =“164”r =“1.5”填入=“#f87171”不透明度=“0.15”/> <圓cx =“862”cy =“108”r =“1.5”填入=“#f87171”不透明度=“0.15”/> <圓cx =“862”cy =“164”r =“1.5”填入=“#f87171”不透明度=“0.15”/> <圓cx =“890”cy =“80”r =“1.5”填入=“#f87171”不透明度=“0.15”/> <圓cx =“890”cy =“108”r =“1.5”填入=“#f87171”不透明度=“0.15”/> <圓cx =“890”cy =“136”r =“1.5”填入=“#f87171”不透明度=“0.15”/> <圓cx =“890”cy =“164”r =“1.5”填入=“#f87171”不透明度=“0.15”/> <多邊形點=「991.507041555162,135.5 991.507041555162,176.5 956,197 920.492958444838,176.5 920.492958,583958,583958,1395. 956,115”填滿=“無”描邊=“#f87171”描邊寬度=“1”不透明度=“0.12”/>

<矩形x =“60”y =“50”寬度=“4”高度=“60”rx =“2”填滿=“#f87171”/> <矩形x =“80”y =“50”寬度=“121”高度=“28”rx =“14”填滿=“#f87171”不透明度=“0.15”/> 🔒 DevSecOps — 第 13 堂課

第 13 課:Kubernetes、AWS 與雲端驗證 方法

HashiCorp Vault 從基礎到進階

第 3 部分:驗證方法 - 驗證與授權

xdev.asia

1. Kubernetes 認證方法

Kubernetes 驗證方法允許 Kubernetes 上的 Pod 使用 Kubernetes 服務帳戶令牌向 Vault 進行驗證。對於在 Kubernetes 上運行的工作負載來說,這是最自然的身份驗證方法 - 無需管理單獨的機密。

架構

<前><代碼>┌────────────────┐ ┌──────────────┐ │ Pod │ 1. 登入 với SA │ Vault │ │ (ServiceAccount)│ JWT 令牌 │ K8s Auth │ │ │ ────────────────▶ │ │ │ │ │ │ │ │ 4. Vault 代幣 │ │ │ │ ◀──────────────── │ │ └────────────────────┘ └──────┬────────┘ │ 2. TokenReview API (驗證 SA 令牌) │ ▼ ┌────────────┐ │ 庫伯內特斯 │ │ API伺服器 │ └────────────┘

啟用並設定

# 啟用 Kubernetes 驗證
vault auth enable kubernetes

# Cấu hình — Vault chạy trong Kubernetes
vault write auth/kubernetes/config \
  kubernetes_host =“https://kubernetes.default.svc:443"

# Cấu hình — Vault chạy ngoài Kubernetes
vault write auth/kubernetes/config \
  kubernetes_host="https://k8s-api.company.com:6443" \
  kubernetes_ca_cert=@/etc/vault/k8s-ca.pem \
  token_reviewer_jwt=@/etc/vault/k8s-reviewer-token

創造角色

# 角色 cho 命名空間 cụ thể
vault write auth/kubernetes/role/webapp \
  bound_service_account_names="webapp-sa" \
  bound_service_account_namespaces =「生產」\
  token_policies =“webapp-policy,db-readonly”\
  token_ttl=1h \
  token_max_ttl=4小時

角色 cho nhiều 命名空間

vault write auth/kubernetes/role/monitoring
bound_service_account_names =「普羅米修斯-sa,grafana-sa」
bound_service_account_namespaces="監控、可觀察性"
token_policies =「監控唯讀」
token_ttl=30m

角色 với 通配符(tất cả 命名空間中的服務帳戶)

vault write auth/kubernetes/role/dev-all
bound_service_account_names =“*”
bound_service_account_namespaces =「開發」
token_policies="dev-readonly"
token_ttl=30m

別名來源

vault write auth/kubernetes/role/webapp
bound_service_account_names="webapp-sa"
bound_service_account_namespaces =「生產」
token_policies="webapp-policy"
alias_name_source="serviceaccount_name"

從 Pod 登入

# Service Account token tự động mount tại Pod
SA_TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)

# 登入
curl -s --request POST \
  --data "{\"jwt\": \"${SA_TOKEN}\", \"角色\": \"webapp\"}" \
  ${VAULT_ADDR}/v1/auth/kubernetes/login | ${VAULT_ADDR}/v1/auth/kubernetes/login | jq .

# Hoặc dùng Vault CLI
vault write auth/kubernetes/login \
  角色=webapp \
  jwt=@/var/run/secrets/kubernetes.io/serviceaccount/token

Kubernetes RBAC cho Vault

# Vault cần ClusterRole để 驗證 SA 令牌
api版本:rbac.authorization.k8s.io/v1
種類:ClusterRoleBinding
元數據:
  名稱:vault-token-reviewer
角色參考:
  apiGroup:rbac.authorization.k8s.io
  種類:集群角色
  名稱:系統:授權委託者
科目:
  - 類型:服務帳戶
    名稱:金庫
    命名空間:保險庫

2. AWS 驗證方法

AWS Auth 方法允許 EC2 執行個體和 Lambda 函數使用 AWS IAM 或 EC2 元資料向 Vault 進行驗證 — 無需手動管理機密。

兩種類型的 AWS 驗證

<表> <標題>

類型身份驗證方法用例 <正文> IAM 驗證簽署 STS GetCallerIdentityEC2、Lambda、ECS、EKS、任何 AWS 工作負載 EC2 驗證EC2 實例元資料(PKCS7 文件)僅限 EC2 執行個體

AWS IAM 驗證

# 啟用 AWS 驗證
vault auth enable aws

# Cấu hình AWS 憑證 cho Vault
vault write auth/aws/config/client \
  access_key="AKIAIOSFODNN7EXAMPLE" \
  Secret_key="wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" \
  iam_server_id_header_value="vault.company.com"

# Tạo IAM 角色
vault write auth/aws/role/webapp \
  auth_type=iam \
  bound_iam_principal_arn="arn:aws:iam::123456789012:角色/webapp-角色" \
  token_policies="webapp-policy" \
  token_ttl=1h \
  token_max_ttl=4小時# 角色 cho nhiều IAM 主體
vault write auth/aws/role/services \
  auth_type=iam \
  bound_iam_principal_arn='["arn:aws:iam::123456789012:角色/服務-a","arn:aws:iam::123456789012:角色/服務-b"]' \
  token_policies =“服務策略”

# 跨帳戶(即 AWS 帳戶)
vault write auth/aws/config/sts/987654321098 \
  sts_role="arn:aws:iam::123456789012:角色/vault-sts-assume"

vault write auth/aws/role/cross-account \
  auth_type=iam \
  bound_iam_principal_arn="arn:aws:iam::987654321098:角色/外部應用程式" \
  token_policies="跨帳戶只讀"

從 AWS 工作負載登入

# Từ EC2/Lambda/ECS — CLI
vault login -method=aws role=webapp

# API調用
vault write auth/aws/login \
  角色=webapp \
  iam_http_request_method="POST" \
  iam_request_url="$(echo -n 'https://sts.amazonaws.com/' | base64)" \
  iam_request_body="$(echo -n 'Action=GetCallerIdentity&Version=2011-06-15' | base64)" \
  iam_request_headers =“...”

3. Azure 驗證方法

# 啟用 Azure 驗證
vault auth enable azure

#Cấu hình
vault write auth/azure/config \
  tenant_id =“<租戶id>”\
  资源=“https://management.azure.com/" \
  client_id="" \
  client_secret=""

# Tạo 角色 cho VM với Managed Identity
vault write auth/azure/role/webapp \
  bound_subscription_ids="<訂閱 ID>" \
  bound_resource_groups=“生產-rg”\
  bound_service_principal_ids="<託管身分主體 ID>" \
  token_policies="webapp-policy" \
  token_ttl=1h

4. GCP驗證方法

# 啟用 GCP 驗證
vault auth enable gcp

#Cấu hình
vault write auth/gcp/config \
  憑證=@/etc/vault/gcp-credentials.json

# IAM 身份驗證(服務帳戶)
vault write auth/gcp/role/webapp \
  類型=“iam”\
  bound_service_accounts =“[email protected]”\
  token_policies="webapp-policy" \
  token_ttl=1h

# GCE 身份驗證(計算引擎實例)
vault write auth/gcp/role/gce-instances \
  類型=“gce”\
  bound_projects =「我的專案」\
  bound_zones="asia-southeast1-a,asia-southeast1-b" \
  bound_labels =「環境:生產,團隊:平台」\
  token_policies="gce-policy"

5. SPIFFE 驗證方法(Vault 1.21)

SPIFFE(適用於所有人的安全生產身分框架)驗證方法是 Vault 1.21 中的一項新功能,允許工作負載使用 SPIFFE SVID(SPIFFE 可驗證身分識別文件)進行驗證。

SPIFFE 概念

<表> <標題>

術語描述 <正文> SPIFFE IDspiffe://trust-domain/workload-identifier 形式的 URI SVID證明身分的文件(X.509 憑證或 JWT) SPIRESPIFFE 運行時環境 - 最流行的實現 信任網域信任網域(例如:company.com)
# 啟用 SPIFFE 驗證(Vault 1.21+)
vault auth enable spiffe# Cấu hình 信任域
vault write auth/spiffe/config \
  spiffe_trust_domain =“company.com”\
  spiffe_trust_bundle=@/etc/vault/spire-root-ca.pem

#陶角色
vault write auth/spiffe/role/webapp \
  bound_spiffe_ids=“spiffe://company.com/ns/product/sa/webapp”\
  token_policies="webapp-policy" \
  token_ttl=1h

# 通配符匹配
vault write auth/spiffe/role/production-all \
  bound_spiffe_id_patterns="spiffe://company.com/ns/product/*" \
  token_policies =“生產唯讀”

6.工作負載身分最佳實務

選擇適當的驗證方法

<表> <標題>

平台認證方式備註 <正文> KubernetesKubernetes Auth最適合 K8s 工作負載 AWS EC2/Lambda/ECSAWS IAM 身份驗證優先於 EC2 身份驗證 Azure VM/功能Azure Auth使用託管身分 GCP GCE/GKE/函數GCP AuthIAM 或 GCE 類型 多平台/SPIRESPIFFE Auth與平台無關的身份 CI/CD (GitHub/GitLab)JWT Auth來自 CI 平台的 OIDC 令牌 舊版/本地應用AppRole後備 cho 非雲端工作負載

最小權限

  • 每個服務/工作負載都有自己的角色 - 沒有共用角色

  • 緊密綁定:特定服務帳戶、命名空間、項目

  • 最短的令牌 TTL

  • 根據特定路徑制定細化策略

多集群 Kubernetes

# Mount riêng cho mỗi cluster
vault auth enable -path=k8s-prod kubernetes
vault auth enable -path=k8s-staging kubernetes

# Cấu hình riêng biệt
vault write auth/k8s-prod/config \
  kubernetes_host="https://prod-k8s-api:6443" \
  kubernetes_ca_cert=@/etc/vault/prod-ca.pem

vault write auth/k8s-staging/config \
  kubernetes_host="https://staging-k8s-api:6443" \
  kubernetes_ca_cert=@/etc/vault/staging-ca.pem

7.摘要

  • Kubernetes Auth - K8s 工作負載的標準,使用服務帳號令牌

  • AWS IAM Auth - 所有 AWS 工作負載的首選,無需靜態憑證

  • Azure/GCP Auth - Azure 託管身分和 GCP 服務帳戶相同

  • SPIFFE Auth (1.21) — 平台無關、多雲/混合相容

下一篇文章將深入探討 Vault 策略 - 使用 ACL、Sentinel 和 RBAC 的詳細存取控制機制。