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

レッスン 13: Kubernetes、AWS、およびクラウドの認証方法

Kubernetes 認証方法 (サービス アカウント トークン レビュー、バインドされた名前空間、バインドされたサービス アカウント)、AWS 認証方法 (IAM 認証、EC2 認証、クロスアカウント)、Azure 認証方法、GCP 認証方法、SPIFFE 認証方法 (1.21 の新機能)、ワークロード ID のベスト プラクティス。

🔒 D​​evSecOps — レッスン 13 レッスン 13: Kubernetes、AWS、クラウド認証 Methods

HashiCorp Vault の基本から上級まで

パート 3: 認証方法 - 認証と認可

xdev.asia

1. Kubernetes Auth Method

Kubernetes 認証メソッド を使用すると、Kubernetes 上のポッドが Kubernetes サービス アカウント トークンを使用して Vault に対して認証できるようになります。これは、Kubernetes 上で実行されるワークロードにとって最も自然な認証方法であり、個別のシークレットを管理する必要はありません。

アーキテクチャ

┌───────────────────┐                    ┌──────────────┐
│   Pod             │  1. Login với SA   │    Vault     │
│   (ServiceAccount)│     JWT token      │  K8s Auth    │
│                   │ ─────────────────▶ │              │
│                   │                    │              │
│                   │  4. Vault Token    │              │
│                   │ ◀───────────────── │              │
└───────────────────┘                    └──────┬───────┘
                                                │
                                       2. TokenReview API
                                          (verify SA token)
                                                │
                                                ▼
                                         ┌──────────────┐
                                         │  Kubernetes  │
                                         │  API Server  │
                                         └──────────────┘

有効化および構成

# Enable Kubernetes auth
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

役割の作成

# Role cho namespace cụ thể
vault write auth/kubernetes/role/webapp \
  bound_service_account_names="webapp-sa" \
  bound_service_account_namespaces="production" \
  token_policies="webapp-policy,db-readonly" \
  token_ttl=1h \
  token_max_ttl=4h

# Role cho nhiều namespaces
vault write auth/kubernetes/role/monitoring \
  bound_service_account_names="prometheus-sa,grafana-sa" \
  bound_service_account_namespaces="monitoring,observability" \
  token_policies="monitoring-readonly" \
  token_ttl=30m

# Role với wildcard (tất cả service accounts trong namespace)
vault write auth/kubernetes/role/dev-all \
  bound_service_account_names="*" \
  bound_service_account_namespaces="development" \
  token_policies="dev-readonly" \
  token_ttl=30m

# Alias name source
vault write auth/kubernetes/role/webapp \
  bound_service_account_names="webapp-sa" \
  bound_service_account_namespaces="production" \
  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)

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

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

Kubernetes RBAC cho Vault

# Vault cần ClusterRole để verify SA tokens
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: vault-token-reviewer
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:auth-delegator
subjects:
  - kind: ServiceAccount
    name: vault
    namespace: vault

2. AWS Auth Method

AWS 認証メソッド を使用すると、EC2 インスタンスと Lambda 関数が AWS IAM または EC2 メタデータを使用して Vault に対して認証できるようになります。シークレットを手動で管理する必要はありません。

2 種類の AWS Auth

タイプ認証方法ユースケース
IAM AuthSign STS GetCallerIdentityEC2、Lambda、ECS、EKS、任意の AWS ワークロード
EC2 AuthEC2 インスタンス メタデータ (PKCS7 ドキュメント)EC2 インスタンスのみ

AWS IAM Auth

# Enable AWS auth
vault auth enable aws

# Cấu hình AWS credentials 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 role
vault write auth/aws/role/webapp \
  auth_type=iam \
  bound_iam_principal_arn="arn:aws:iam::123456789012:role/webapp-role" \
  token_policies="webapp-policy" \
  token_ttl=1h \
  token_max_ttl=4h

# Role cho nhiều IAM principals
vault write auth/aws/role/services \
  auth_type=iam \
  bound_iam_principal_arn='["arn:aws:iam::123456789012:role/service-a","arn:aws:iam::123456789012:role/service-b"]' \
  token_policies="services-policy"

# Cross-account (từ AWS account khác)
vault write auth/aws/config/sts/987654321098 \
  sts_role="arn:aws:iam::123456789012:role/vault-sts-assume"

vault write auth/aws/role/cross-account \
  auth_type=iam \
  bound_iam_principal_arn="arn:aws:iam::987654321098:role/external-app" \
  token_policies="cross-account-readonly"

AWS ワークロードからログイン

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

# API call
vault write auth/aws/login \
  role=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 Auth Method

# Enable Azure auth
vault auth enable azure

# Cấu hình
vault write auth/azure/config \
  tenant_id="<tenant-id>" \
  resource="https://management.azure.com/" \
  client_id="<vault-app-id>" \
  client_secret="<vault-app-secret>"

# Tạo role cho VM với Managed Identity
vault write auth/azure/role/webapp \
  bound_subscription_ids="<subscription-id>" \
  bound_resource_groups="production-rg" \
  bound_service_principal_ids="<managed-identity-principal-id>" \
  token_policies="webapp-policy" \
  token_ttl=1h

4. GCP Auth Method

# Enable GCP auth
vault auth enable gcp

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

# IAM auth (Service Account)
vault write auth/gcp/role/webapp \
  type="iam" \
  bound_service_accounts="[email protected]" \
  token_policies="webapp-policy" \
  token_ttl=1h

# GCE auth (Compute Engine instances)
vault write auth/gcp/role/gce-instances \
  type="gce" \
  bound_projects="my-project" \
  bound_zones="asia-southeast1-a,asia-southeast1-b" \
  bound_labels="env:production,team:platform" \
  token_policies="gce-policy"

5. SPIFFE Auth Method (Vault 1.21)

SPIFFE (Secure Production Identity Framework forEveryone) 認証方法は Vault 1.21 の新機能であり、SPIFFE SVID (SPIFFE Verifiable Identity Document) を使用してワークロードを認証できるようになります。

SPIFFE Concepts

)
用語説明
SPIFFE IDURI (形式: spiffe://trust-domain/workload-identifier
SVID身元を証明する文書 (X.509 証明書または JWT)
SPIRESPIFFE ランタイム環境 — 最も一般的な実装
信頼ドメイン信頼のドメイン (例: company.com)
# Enable SPIFFE auth (Vault 1.21+)
vault auth enable spiffe

# Cấu hình trust domain
vault write auth/spiffe/config \
  spiffe_trust_domain="company.com" \
  spiffe_trust_bundle=@/etc/vault/spire-root-ca.pem

# Tạo role
vault write auth/spiffe/role/webapp \
  bound_spiffe_ids="spiffe://company.com/ns/production/sa/webapp" \
  token_policies="webapp-policy" \
  token_ttl=1h

# Wildcard matching
vault write auth/spiffe/role/production-all \
  bound_spiffe_id_patterns="spiffe://company.com/ns/production/*" \
  token_policies="production-readonly"

6. Workload Identity Best Practices

適切な認証方法を選択してください

プラットフォーム認証方法注
KubernetesKubernetes AuthK8s ワークロードに最も自然
AWS EC2/Lambda/ECSAWS IAM AuthPreferred over EC2 auth
Azure VM/関数Azure 認証マネージド ID の使用
GCP GCE/GKE/関数GCP 認証IAM または GCE タイプ
Multi-platform/SPIRESPIFFE AuthPlatform-agnostic identity
CI/CD (GitHub/GitLab)JWT AuthCI プラットフォームからの OIDC トークン
Legacy/On-prem appsAppRoleFallback cho non-cloud workloads

Least Privilege

  • 各サービス/ワークロードには独自の役割があります。共有役割はありません

  • 厳密なバインディング: 特定のサービス アカウント、名前空間、プロジェクト

  • 可能な限り短いトークン TTL

  • 特定のパスに応じた詳細なポリシー

Multi-cluster 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 マネージド ID および GCP サービス アカウントについても同様

  • SPIFFE Auth (1.21) — プラットフォームに依存しない、マルチクラウド/ハイブリッド互換

次の記事では、Vault ポリシー、つまり ACL、Sentinel、RBAC を使用した詳細なアクセス制御メカニズムについて詳しく説明します。