אימות של אשכולות Workload Identity

במאמר הזה מוסבר איך להגדיר ולהשתמש ב-Workload Identity Cluster Authentication ב-Google Distributed Cloud במודל מחובר. במקום להשתמש במפתחות של חשבונות שירות, אימות אשכולות של Workload Identity משתמש באסימונים לזמן קצר ובאיחוד שירותי אימות הזהות של עומסי עבודה כדי לאפשר לעומסי העבודה שלכם לגשת למשאבי Google Cloud בצורה מאובטחת. פרטי הכניסה לטווח קצר הם אסימוני גישה מסוג OAuth 2.0. כברירת מחדל, התוקף של אסימוני הגישה פג אחרי שעה אחת.

באמצעות אימות אשכולות של Workload Identity, עומסי העבודה יכולים להשתמש בזהות Kubernetes שלהם כדי לגשת ישירות למשאבים או להתחזות לחשבון שירות של Google. Google Cloud

אימות אשכולות באמצעות Workload Identity מספק שני יתרונות עיקריים בהשוואה לשימוש במפתחות של חשבון שירות:

  • אבטחה משופרת: מפתחות של חשבונות שירות מהווים סיכון אבטחה אם לא מנהלים אותם בצורה נכונה. אסימוני OAuth 2.0 ואיחוד שירותי אימות הזהות של עומסי עבודה נחשבים לחלופות מומלצות למפתחות של חשבונות שירות. מידע נוסף על אסימונים של חשבון שירות זמין במאמר פרטי כניסה לטווח קצר לחשבון שירות. מידע נוסף על איחוד שירותי אימות הזהות של עומסי עבודה זמין במאמר איחוד שירותי אימות הזהויות של עומסי עבודה.

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

הדף הזה מיועד לאדמינים, לארכיטקטים ולמפעילים שמגדירים, מנטרים ומנהלים את מחזור החיים של התשתית הטכנולוגית הבסיסית. כדי לקבל מידע נוסף על תפקידים נפוצים ועל משימות לדוגמה שאנחנו מתייחסים אליהן בGoogle Cloud תוכן, אפשר לעיין במאמר תפקידים נפוצים של משתמשי GKE ומשימות.

ניהול אשכולות

במדריך הזה מוסבר על איחוד שירותי אימות הזהות של עומסי עבודה באפליקציות. איחוד שירותי אימות הזהות של עומסי עבודה ברמת האשכול מנוהל באופן אוטומטי באשכולות שמחוברים ל-Distributed Cloud.

אשכולות מחוברים של Distributed Cloud נוצרים ומנוהלים על ידי Google באמצעות Distributed Cloud Edge Container API, באמצעות הפקודה gcloud edge-cloud container clusters create או במסוף Google Cloud .

אשכולות מחוברים של Distributed Cloud נרשמים באופן אוטומטי ל-Fleet בפרויקט שבו הם נוצרו. אתם לא צריכים לרשום את צי הרכבים באופן ידני. מאגר איחוד הזהויות של עומסי עבודה זמין באופן אוטומטי, והפורמט שלו הוא PROJECT_ID.svc.id.goog.

לפני שמתחילים

  • לפני שמגדירים איחוד זהויות של עומסי עבודה, צריך לוודא שהממשקי API הבאים מופעלים בפרויקט Google Cloud . מידע על הפעלת ממשקי API זמין במאמר הפעלת שירותים.

    • iam.googleapis.com
    • sts.googleapis.com
    • iamcredentials.googleapis.com
    • gkehub.googleapis.com
  • ודאו שכלי שורת הפקודה הבאים מותקנים:

    • הגרסה האחרונה של Google Cloud CLI, שכוללת את gcloud, כלי שורת הפקודה לאינטראקציה עם Google Cloud.
    • kubectl

    אם אתם משתמשים ב-Cloud Shell כסביבת המעטפת שלכם לאינטראקציה עםGoogle Cloud, הכלים האלה מותקנים בשבילכם.

  • מוודאים שאתחלתם את ה-CLI של gcloud לשימוש בפרויקט.

  • צריך לוודא שיש לכם את תפקידי ה-IAM הבאים בפרויקט. כדי לבצע את ההגדרה, צריך את התפקידים הבאים:

    • בעלים (roles/owner) או
    • אדמין אבטחה ב-IAM‏ (roles/iam.securityAdmin) ואדמין בחשבון שירות (roles/iam.serviceAccountAdmin)

בקטעים הבאים מוסבר איך ליצור חשבונות שירות ולהקצות להם את התפקידים שנדרשים לאימות של אשכול Workload Identity.

מומלץ: גישה ישירה למשאבים באמצעות איחוד שירותי אימות הזהות של עומסי עבודה

באמצעות גישה ישירה למשאבים דרך איחוד זהויות של עומסי עבודה, אתם משתמשים באיחוד זהויות של עומסי עבודה כדי להקצות תפקיד IAM ל-Kubernetes ServiceAccount, כך שיהיה לו גישה ישירה למשאבים של Google Cloud.

זהות מטרה תפקידים
Kubernetes ServiceAccount הזהות ב-Kubernetes שבה משתמש עומס העבודה. נותנים לזהות הזו את התפקידים שנדרשים כדי לגשת למשאבים הנדרשים Google Cloud . בדוגמה הזו, מוענקים התפקידים roles/storage.objectViewer ו-roles/logging.admin. roles/storage.objectViewer
roles/logging.admin

אפשרות חלופית: התחזות לחשבון שירות ב-IAM

אפשרות נוספת היא להגדיר את חשבון השירות של Kubernetes כך שישתמש בהתחזות לחשבון שירות של IAM.

חשבון שירות מטרה תפקידים
חשבון שירות של Google חשבון השירות של Google שעומס העבודה בתוך האשכול מתחזה אליו. מקצים לחשבון השירות הזה את התפקידים שנדרשים כדי לגשת למשאבים הנדרשים Google Cloud. תלוי במשאבים שאליהם ניגשים.
Kubernetes ServiceAccount נותנים לזהות הזו את היכולת להתחזות לחשבון השירות של Google. ההרשאה הזו משתמשת בתפקיד roles/iam.workloadIdentityUser. roles/iam.workloadIdentityUser

הגדרה של חשבונות שירות

בקטעים הבאים מפורטות הוראות ליצירת חשבון שירות (ServiceAccount) של Kubernetes שנדרש, ולהקצאת התפקידים הדרושים לאימות של אשכול Workload Identity באמצעות גישה ישירה למשאבים של איחוד זהויות של עומסי עבודה או התחזות לחשבון שירות של Google.

יצירה של ServiceAccount ב-Kubernetes

באשכול, משתמשים בפקודה kubectl create כדי ליצור Kubernetes ServiceAccount עבור קבוצות ה-Pod. אפשר גם להשתמש בכל חשבון שירות קיים, כולל חשבון ברירת המחדל ServiceAccount במרחב השמות.

kubectl create serviceaccount KSA_NAME --namespace NAMESPACE

מחליפים את הערכים הבאים:

  • KSA_NAME: שם לחשבון השירות של Kubernetes

  • NAMESPACE: מרחב השמות של האשכול

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

כדי להעניק תפקידים של ניהול זהויות והרשאות גישה (IAM) ישירות לזהות של חשבון השירות ב-Kubernetes, פועלים לפי השלבים הבאים.

  1. משתמשים בפקודה gcloud projects describe כדי למצוא את מספר הפרויקט:

    gcloud projects describe PROJECT_ID --format="value(projectNumber)"
    

    מחליפים את PROJECT_ID במזהה הפרויקט.

  2. משתמשים בפקודה gcloud projects add-iam-policy-binding כדי להעניק את התפקידים הנדרשים לחשבון הראשי של הזהות ב-Kubernetes:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="principal://iam.gserviceaccount.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME" \
        --role=roles/storage.objectViewer
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="principal://iam.gserviceaccount.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME" \
        --role=roles/logging.admin
    

    מחליפים את הערכים הבאים:

    • PROJECT_NUMBER: מספר הפרויקט
    • NAMESPACE: מרחב השמות של האשכול
    • KSA_NAME: השם של חשבון השירות של Kubernetes

חלופה: שימוש בהתחזות לחשבון שירות ב-IAM כדי להעניק גישה

אם אתם מעדיפים שהעומסים שלכם יתחזו לחשבון שירות של Google, אתם צריכים לפעול לפי השלבים הבאים.

  1. משתמשים בפקודה gcloud iam service-accounts create כדי ליצור חשבון שירות של Google:

    gcloud iam service-accounts create my-app-sa \
        --project=PROJECT_ID
    

    מחליפים את PROJECT_ID במזהה הפרויקט.

  2. משתמשים בפקודה gcloud projects add-iam-policy-binding כדי להקצות לחשבון השירות של Google את התפקידים הנדרשים:

    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=serviceAccount:my-app-sa@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/storage.objectViewer
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=serviceAccount:my-app-sa@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/logging.admin
    
  3. משתמשים בפקודה gcloud iam service-accounts add-iam-policy-binding כדי להעניק ל-Kubernetes ServiceAccount את היכולת להתחזות לחשבון השירות של Google:

    gcloud iam service-accounts add-iam-policy-binding my-app-sa@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/iam.workloadIdentityUser \
        --member="serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE/KSA_NAME]"
    

    מחליפים את הערכים הבאים:

    • NAMESPACE: מרחב השמות של האשכול
    • KSA_NAME: השם של חשבון השירות של Kubernetes
  4. משתמשים בפקודה kubectl annotate כדי להוסיף הערה לחשבון השירות של Kubernetes כדי לקשר אותו לחשבון השירות של Google:

    kubectl annotate serviceaccount \
        --namespace NAMESPACE KSA_NAME \
        iam.gke.io/gcp-service-account=my-app-sa@PROJECT_ID.iam.gserviceaccount.com
    

הגדרת עומס העבודה

מעדכנים את מפרט ה-Pod כדי להשתמש ב-ServiceAccount של Kubernetes ומעלים את נפח האסימון המוקרן. מכיוון שקלאסטרים מחוברים של Distributed Cloud נמצאים מחוץ ל-Google Cloud, צריך גם לספק קובץ תצורה של פרטי כניסה ולהגדיר את משתנה הסביבה GOOGLE_APPLICATION_CREDENTIALS כך שיצביע על הקובץ הזה.Google Cloud ספריות הלקוח בתוך הפוד משתמשות בפרטי הכניסה האלה כדי להחליף את אסימון Kubernetes באסימון גישה דרך Security Token Service API. Google Cloud

  1. יוצרים את קובץ ה-credential-configuration.json. בוחרים את הפקודה בהתאם לאופן שבו אתם משתמשים בגישה ישירה למשאבים באמצעות איחוד שירותי אימות הזהות של עומסי עבודה או בהתחזות לחשבון שירות של IAM.

    גישה ישירה למשאבים באמצעות איחוד שירותי אימות הזהות של עומסי עבודה

    משתמשים בפקודה gcloud iam workload-identity-pools create-cred-config:

    gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/providers/attestor \
        --credential-source-file=/var/run/secrets/tokens/gcp-ksa/token \
        --credential-source-type=text \
        --output-file=credential-configuration.json
    

    שימוש בהתחזות לחשבון שירות ב-IAM כדי להעניק גישה

    משתמשים בפקודה gcloud iam workload-identity-pools create-cred-config:

    gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/providers/attestor \
        --service-account=my-app-sa@PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/secrets/tokens/gcp-ksa/token \
        --credential-source-type=text \
        --output-file=credential-configuration.json
    

    מחליפים את PROJECT_NUMBER במספר הפרויקט ב- Google Cloud . אפשר למצוא את מספר הפרויקט באמצעות הפקודה gcloud projects describe PROJECT_ID --format="value(projectNumber)".

  2. משתמשים בפקודה kubectl create configmap כדי ליצור ConfigMap של Kubernetes לאחסון קובץ ההגדרות:

    kubectl create configmap CREDENTIAL_CONFIG_MAP \
        --namespace NAMESPACE \
        --from-file=credential-configuration.json
    

    מחליפים את הערכים הבאים:

    • CREDENTIAL_CONFIG_MAP: שם ל-ConfigMap, שמכיל את קובץ התצורה של פרטי הכניסה

    • NAMESPACE: מרחב השמות של האשכול

  3. מעדכנים את מפרט ה-Pod עם תוכן ה-YAML הבא:

    spec:
      serviceAccountName: KSA_NAME
      containers:
      - name: MY_CONTAINER
        image: MY_IMAGE
        env:
        - name: GOOGLE_APPLICATION_CREDENTIALS
          value: /var/run/secrets/tokens/gcp-creds/credential-configuration.json
        volumeMounts:
        - mountPath: /var/run/secrets/tokens/gcp-ksa
          name: gcp-ksa
        - mountPath: /var/run/secrets/tokens/gcp-creds
          name: gcp-creds
          readOnly: true
      volumes:
      - name: gcp-ksa
        projected:
          defaultMode: 0420
          sources:
          - serviceAccountToken:
              path: token
              audience: PROJECT_ID.svc.id.goog
              expirationSeconds: 3600
      - name: gcp-creds
        configMap:
          name: CREDENTIAL_CONFIG_MAP
    

    מחליפים את הערכים הבאים:

    • KSA_NAME: שם לחשבון השירות של Kubernetes

    • MY_CONTAINER: השם של הקונטיינר

    • MY_IMAGE: השם של התמונה

מגבלות

התכונות והיכולות הבאות לא נתמכות כשמשתמשים באיחוד שירותי אימות הזהות של עומסי עבודה עבור Distributed Cloud connected:

  • שימוש בשרת Proxy בתהליך החלפת האסימונים

מידע על שימוש באיחוד שירותי אימות הזהות של עומסי עבודה עם VPC Service Controls זמין במאמר הגדרת שילוב של VPC Service Controls.

המאמרים הבאים