Menggunakan workload identity dengan Google Cloud

Panduan ini menjelaskan cara mengonfigurasi workload identity di GKE di AWS untuk mengontrol akses workload ke resource GCP. Bagian ini mencakup contoh cara mengakses resource dari cluster Anda menggunakan identitas. Google Cloud

Untuk mengetahui informasi tentang penggunaan identitas workload dengan akun IAM AWS untuk mengontrol akses ke resource AWS, lihat Menggunakan identitas workload dengan AWS.

Ringkasan

Workload Identity menggunakan izin IAM untuk mengontrol akses ke resource. Google Cloud Google Cloud Dengan identitas workload, Anda dapat menetapkan peran IAM yang berbeda ke setiap workload. Kontrol izin yang mendetail ini memungkinkan Anda mengikuti prinsip hak istimewa terendah. Tanpa workload identity, Anda harus menetapkan Google Cloud peran IAM ke node GKE di AWS, sehingga semua beban kerja di node tersebut memiliki izin yang sama dengan node itu sendiri.

Prasyarat

  • Buat cluster pengguna dengan Kubernetes versi v1.20 atau yang lebih baru.

  • Jika VPC AWS Anda menggunakan proxy atau firewall, tambahkan URL berikut ke daftar yang diizinkan:

    • securetoken.googleapis.com
    • iamcredentials.googleapis.com
    • sts.googleapis.com
  • Dari direktori anthos-aws, gunakan anthos-gke untuk beralih konteks ke cluster pengguna Anda.

    cd anthos-aws
    env HTTPS_PROXY=http://localhost:8118 \
      anthos-gke aws clusters get-credentials CLUSTER_NAME
    Ganti CLUSTER_NAME dengan nama cluster pengguna Anda.

  • Aktifkan empat layanan baru yang diperlukan untuk fitur ini dengan perintah berikut:

    gcloud services enable securetoken.googleapis.com
    gcloud services enable iam.googleapis.com
    gcloud services enable iamcredentials.googleapis.com
    gcloud services enable sts.googleapis.com
    

Menyusun nama kumpulan dan penyedia WI

Setiap project Google Cloud secara otomatis membuat kumpulan identitas workload terkelola dengan nama dalam bentuk PROJECT_ID.svc.id.goog. Demikian pula, Google Cloud membuat penyedia identitas yang namanya mengikuti pola https://gkehub.googleapis.com/projects/PROJECT_ID/locations/global/memberships/MEMBERSHIP_ID. Untuk mengetahui informasi selengkapnya tentang workload identity pool, lihat Komponen yang kompatibel dengan Fleet. Buat nama ini dari project ID dan ID keanggotaan Anda seperti yang ditunjukkan di sini:

export PROJECT_ID=USER_PROJECT_NAME
export CLUSTER_MEMBERSHIP_ID=PROJECT_MEMBERSHIP_NAME
export IDP="https://gkehub.googleapis.com/projects/${PROJECT_ID}/locations/global/memberships/${CLUSTER_MEMBERSHIP_ID}"
export WI_POOL="${PROJECT_ID}.svc.id.goog"

Ganti kode berikut:

  • USER_PROJECT_NAME dengan nama project pengguna yang dipilih pengguna
  • PROJECT_MEMBERSHIP_NAME dengan nama keanggotaan cluster

Membuat binding kebijakan IAM

Buat binding kebijakan untuk mengizinkan akun layanan Kubernetes (KSA) meniru identitas akun layanan (GSA). Google Cloud

export K8S_NAMESPACE=KUBERNETES_NAMESPACE
export KSA_NAME=KUBERNETES_SA_NAME
export GCP_SA_EMAIL="WORKLOAD_IDENTITY_TEST@${PROJECT_ID}.iam.gserviceaccount.com"
gcloud iam service-accounts add-iam-policy-binding \
  --role roles/iam.workloadIdentityUser \
  --member "serviceAccount:$WI_POOL[$K8S_NAMESPACE/$KSA_NAME]" $GCP_SA_EMAIL

Ganti kode berikut:

  • KUBERNETES_NAMESPACE dengan namespace Kubernetes tempat akun layanan Kubernetes ditentukan
  • WORKLOAD_IDENTITY_TEST dengan nama beban kerja pilihan Anda
  • KUBERNETES_SA_NAME dengan nama akun layanan Kubernetes yang terlampir pada aplikasi

Membuat peta konfigurasi SDK

Jalankan skrip shell di bawah untuk menyimpan detail identitas beban kerja di ConfigMap. Saat Pod memasang ConfigMap, Google Cloud CLI dapat membaca detail workload identity.

cat << EOF > cfmap.yaml
kind: ConfigMap
apiVersion: v1
metadata:
  namespace: ${K8S_NAMESPACE}
  name: my-cloudsdk-config
data:
  config: |
    {
      "type": "external_account",
      "audience": "identitynamespace:${WI_POOL}:${IDP}",
      "service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/${GCP_SA_EMAIL}:generateAccessToken",
      "subject_token_type": "urn:ietf:params:oauth:token-type:jwt",
      "token_url": "https://sts.googleapis.com/v1/token",
      "credential_source": {
        "file": "/var/run/secrets/tokens/gcp-ksa/token"
      }
    }
EOF

env HTTPS_PROXY=http://localhost:8118 \
  kubectl apply -f cfmap.yaml

Membuat akun layanan Kubernetes

Buat KSA di cluster pengguna Anda dengan nama dan namespace yang sama seperti yang digunakan dalam binding IAM.

cat << EOF > k8s-service-account.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: ${KSA_NAME}
  namespace: ${K8S_NAMESPACE}
EOF

env HTTPS_PROXY=http://localhost:8118 \
  kubectl apply -f k8s-service-account.yaml

Membuat Pod

Selanjutnya, buat Pod dengan proyeksi token akun layanan dan ConfigMap yang dibuat di atas.

  1. Buat file yaml Pod contoh.

    cat << EOF > sample-pod.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: sample-pod
      namespace: ${K8S_NAMESPACE}
    spec:
      serviceAccountName: ${KSA_NAME}
      containers:
      - command:
        - /bin/bash
        - -c
        - while :; do echo '.'; sleep 500 ; done
        image: google/cloud-sdk
        name: cloud-sdk
        env:
          - name: GOOGLE_APPLICATION_CREDENTIALS
            value: /var/run/secrets/tokens/gcp-ksa/google-application-credentials.json
        volumeMounts:
        - name: gcp-ksa
          mountPath: /var/run/secrets/tokens/gcp-ksa
          readOnly: true
      volumes:
      - name: gcp-ksa
        projected:
          defaultMode: 420
          sources:
          - serviceAccountToken:
              path: token
              audience: ${WI_POOL}
              expirationSeconds: 172800
          - configMap:
              name: my-cloudsdk-config
              optional: false
              items:
               - key: "config"
                 path: "google-application-credentials.json"
    EOF
    
  2. Terapkan YAML Pod ke cluster Anda.

    env HTTPS_PROXY=http://localhost:8118 \
     kubectl apply -f sample-pod.yaml
    

Menggunakan Google Cloud workload identity

Versi SDK yang didukung

Untuk menggunakan fitur workload identity, Anda harus membuat kode dengan SDK yang mendukungnya. Google Cloud Untuk mengetahui daftar versi SDK yang mendukung Google Cloud workload identity, lihat Fleet Workload Identity.

Contoh kode menggunakan workload identity

Bagian ini mencakup contoh kode Python yang menggunakan identitas beban kerja Google Cloud . Akun layanan dalam contoh ini menggunakan identitas dengan hak istimewa "Admin Cloud Storage" untuk mencantumkan semua bucket Cloud Storage project Google Cloud .

  1. Jalankan shell di dalam Pod.

    env HTTPS_PROXY=http://localhost:8118 \
    kubectl exec -it sample-pod -- bash
    
  2. Jalankan skrip untuk mencantumkan bucket penyimpanan project.

    # execute these commands inside the Pod
    pip install --upgrade google-cloud-storage
    
    cat << EOF > sample-list-bucket.py
    from google.cloud import storage
    storage_client = storage.Client()
    buckets = storage_client.list_buckets()
    
    for bucket in buckets:
      print(bucket.name)
    EOF
    
    env GOOGLE_CLOUD_PROJECT=USER_PROJECT_NAME \
     python3 sample-list-bucket.py
    

    Ganti USER_PROJECT_NAME dengan Google Cloud project Anda.

Untuk informasi lebih lanjut