שימוש בזהויות של עומסי עבודה עם Google Cloud

במדריך הזה מוסבר איך להגדיר את אימות הזהויות של עומסי עבודה ב-GKE ב-AWS כדי לשלוט בגישה של עומסי עבודה למשאבי GCP. הוא כולל דוגמה לאופן הגישה למשאבי Google Cloud האשכול באמצעות הזהות.

למידע על שימוש בזהויות של עומסי עבודה עם חשבונות AWS IAM כדי לשלוט בגישה למשאבי AWS, אפשר לעיין במאמר שימוש בזהויות של עומסי עבודה עם AWS.

סקירה כללית

Workload Identity משתמש בהרשאות IAM כדי לשלוט בגישה למשאבים ב-Google Cloud . Google Cloud באמצעות זהויות של עומסי עבודה, אפשר להקצות תפקידי IAM שונים לכל עומס עבודה. השליטה המפורטת הזו בהרשאות מאפשרת לכם לפעול בהתאם לעיקרון של הרשאות מינימליות. בלי Workload Identity, צריך להקצות תפקידי IAM לצמתים של GKE ב-AWS, וכך לתת לכל עומסי העבודה בצמתים האלה את אותן הרשאות כמו לצומת עצמו. Google Cloud

דרישות מוקדמות

  • יוצרים אשכול משתמשים עם Kubernetes בגרסה v1.20 ואילך.

  • אם ה-VPC שלכם ב-AWS משתמש ב-proxy או בחומת אש, צריך להוסיף את כתובות ה-URL הבאות לרשימת ההיתרים:

    • securetoken.googleapis.com
    • iamcredentials.googleapis.com
    • sts.googleapis.com
  • בספריית anthos-aws, משתמשים ב-anthos-gke כדי להחליף הקשר לאשכול המשתמשים.

    cd anthos-aws
    env HTTPS_PROXY=http://localhost:8118 \
      anthos-gke aws clusters get-credentials CLUSTER_NAME
    מחליפים את CLUSTER_NAME בשם אשכול המשתמש.

  • מפעילים את ארבעת השירותים החדשים שנדרשים לתכונה הזו באמצעות הפקודות הבאות:

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

הרכבת השמות של מאגר הזהויות של עומסי העבודה והספק

בכל פרויקט נוצר באופן אוטומטי מאגר מנוהל של זהויות של עומסי עבודה, עם שם בתבנית PROJECT_ID.svc.id.goog. Google Cloud באופן דומה, ‫Google Cloud יוצר ספק זהויות שהשם שלו פועל לפי התבנית ‫https://gkehub.googleapis.com/projects/PROJECT_ID/locations/global/memberships/MEMBERSHIP_ID. מידע נוסף על מאגרי זהויות של עומסי עבודה זמין במאמר רכיבים עם תמיכה ב-Fleet. צריך ליצור את השמות האלה ממזהה הפרויקט וממזהה החברות, כמו שמוצג כאן:

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"

מחליפים את מה שכתוב בשדות הבאים:

  • USER_PROJECT_NAME עם שם הפרויקט שהמשתמש בחר
  • PROJECT_MEMBERSHIP_NAME עם שם החברות באשכול

יצירת קשירת מדיניות IAM

יוצרים קישור למדיניות כדי לאפשר לחשבון שירות של Kubernetes ‏ (KSA) להתחזות לחשבון שירות של Google Cloud (GSA).

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

מחליפים את מה שכתוב בשדות הבאים:

  • KUBERNETES_NAMESPACE עם מרחב השמות של Kubernetes שבו מוגדר חשבון השירות של Kubernetes
  • WORKLOAD_IDENTITY_TEST בשם של עומס העבודה לבחירתכם
  • KUBERNETES_SA_NAME בשם של חשבון השירות של Kubernetes שמצורף לאפליקציה

יצירת מפת תצורה של SDK

מריצים את סקריפט המעטפת שבהמשך כדי לאחסן את פרטי הזהויות של עומסי העבודה ב-ConfigMap. כש-Pod מבצע mount של ConfigMap, ‏ Google Cloud CLI יכול לקרוא את פרטי הזהות של עומס העבודה.

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

יצירת חשבון שירות ב-Kubernetes

יוצרים KSA באשכול המשתמש עם אותו שם ומרחב שמות שבהם השתמשתם בכריכת 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

יצירת Pod

בשלב הבא, יוצרים Pod עם הקרנת אסימון של חשבון השירות ועם ConfigMap שנוצר בשלב הקודם.

  1. יוצרים את קובץ ה-YAML של ה-Pod לדוגמה.

    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. מחילים את קובץ ה-YAML של ה-Pod על האשכול.

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

שימוש ב-Workload Identity Google Cloud

גרסאות SDK נתמכות

כדי להשתמש בתכונה Google Cloud workload identity, צריך ליצור את הקוד באמצעות SDK שתומך בה. רשימה של גרסאות SDK שתומכות ב-Google Cloud Workload Identity זמינה במאמר Fleet Workload Identity.

קוד לדוגמה לשימוש ב-Workload Identity

בקטע הזה מופיעה דוגמה לקוד Python שמשתמש ב Google Cloud זהויות של עומסי עבודה. חשבון השירות בדוגמה הזו משתמש בזהות עם הרשאות 'אדמין של Cloud Storage' כדי להציג רשימה של כל הקטגוריות של Cloud Storage בפרויקט Google Cloud .

  1. מריצים מעטפת בתוך ה-Pod.

    env HTTPS_PROXY=http://localhost:8118 \
    kubectl exec -it sample-pod -- bash
    
  2. מריצים סקריפט כדי לראות את קטגוריות האחסון של הפרויקט.

    # 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
    

    מחליפים את USER_PROJECT_NAME בפרויקט שלכם ב- Google Cloud .

לקבלת מידע נוסף