הפעלת איחוד שירותי אימות הזהות של עומסי עבודה ב-AKS וב-EKS

במאמר הזה מוסבר איך להפעיל את איחוד שירותי אימות הזהות של עומסי עבודה בהתקנות של Apigee Hybrid בפלטפורמות AKS ו-EKS באמצעות אסימונים של חשבונות שירות מוקרנים של Kubernetes.

להתקנות ב-GKE, פועלים לפי ההוראות במאמר הפעלת איחוד זהויות של עומסי עבודה ל-GKE ב-GKE.

סקירה כללית

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

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

סקירה כללית זמינה במאמר שיטות מומלצות לשימוש באיחוד שירותי אימות הזהות של עומסי עבודה.

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

כדי להשתמש באיחוד שירותי אימות הזהות של עומסי עבודה עם Apigee Hybrid, קודם צריך להגדיר את האשכול ואז להחיל את התכונה על ההתקנה של Apigee Hybrid.

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

ההוראות האלה מניחות שכבר הגדרתם את ההתקנה של Apigee hybrid. חשבונות השירות של IAM וחשבונות השירות של Kubernetes נוצרים במהלך ההתקנה הראשונית. במאמר The Big Picture מופיעה סקירה כללית על התקנת Apigee hybrid.

במקרה של התקנות ב-AKS, צריך לוודא שהפעלתם את מנפיק OpenID Connect‏ (OIDC). צריך להפעיל את התכונה הזו כדי שאיחוד שירותי אימות הזהות של עומסי עבודה יוכל לגשת למטא-נתונים של OpenID Connect ול-JSON Web Key Set‏ (JWKS) של האשכול.

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

  1. מריצים את הפקודה הבאה כדי לוודא שההגדרות הנוכחיות של gcloud תואמות למזהה הפרויקט ב-Google Cloud:
    gcloud config get project
  2. אם צריך, מגדירים את ההגדרות הנוכחיות של gcloud:

    gcloud config set project PROJECT_ID
  3. מפעילים את Security Token Service API:

    מריצים את הפקודה הבאה כדי לוודא שה-API של שירות אבטחת האסימון מופעל:

    gcloud services list --enabled --project PROJECT_ID | grep sts.googleapis.com

    אם ה-API לא מופעל:

    המסוף

    מפעילים את Security Token Service API, אם הוא עדיין לא מופעל.

    התפקידים שנדרשים כדי להפעיל ממשקי API

    כדי להפעיל ממשקי API, צריך את ההרשאה serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד 'בעלים' (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד 'אדמין בממשק 'שימוש בשירות'' (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידים

    להפעלת ה-API

    שורת הפקודה

    מפעילים את ה-API באמצעות הפקודה הבאה:

    gcloud services enable sts.googleapis.com --project PROJECT_ID
  4. יוצרים את הספק ואת מאגר הזהויות של עומסי העבודה.

    התפקידים הנדרשים

    כדי לקבל את ההרשאות שדרושות להגדרה של איחוד שירותי אימות הזהות של עומסי עבודה, צריך לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים בפרויקט:

    להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.

    יכול להיות שאפשר לקבל את ההרשאות הנדרשות גם באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש.

    לחלופין, התפקיד הבסיסי ב-IAM 'בעלים' (roles/owner) כולל גם הרשאות להגדרה של איחוד זהויות. בסביבת ייצור לא מומלץ להקצות תפקידים בסיסיים, אבל אפשר להעניק אותם בסביבת פיתוח או בסביבת בדיקה.

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

    1. מגדירים את כתובת ה-URL של המנפיק של אשכול ה-AKS:

      AKS

      az aks show -n NAME -g RESOURCE_GROUP --query "oidcIssuerProfile.issuerUrl" -otsv

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

      • ‫NAME: שם האשכול.
      • ‫RESOURCE_GROUP: קבוצת המשאבים של האשכול.

      הפקודה מחזירה את כתובת ה-URL של המנפיק. תצטרכו את כתובת ה-URL של הגורם המנפיק באחד מהשלבים הבאים.

      אם הפקודה לא מחזירה כתובת URL של מנפיק, ודאו שהפעלתם את התכונה מנפיק OIDC.

      EKS

      aws eks describe-cluster --name NAME --query "cluster.identity.oidc.issuer" --output text
      

      מחליפים את NAME בשם האשכול.

      הפקודה מפיקה את כתובת ה-URL של המנפיק. תצטרכו את כתובת ה-URL של המנפיק באחד מהשלבים הבאים.

      ‫Kubernetes אחר

      מתחברים לאשכול Kubernetes ומשתמשים ב-`kubectl` כדי לקבוע את כתובת ה-URL של מנפיק האשכול:

      kubectl get --raw /.well-known/openid-configuration | jq -r .issuer
      

      תצטרכו את כתובת ה-URL של המנפיק באחד מהשלבים הבאים.

    2. אופציונלי: אם אי אפשר לגשת לשרת ה-OIDC שלכם באופן ציבורי, מורידים את קבוצת מפתחות ה-JSON Web Key Set‏ (JWKS) של האשכול:
      kubectl get --raw /openid/v1/jwks > cluster-jwks.json
      

      כדי לבדוק אם ספק ה-OIDC זמין לציבור, אתם אמורים להיות מסוגלים לגשת לכתובת ה-URL של הספק באמצעות פקודת CURL ולקבל תגובה 200.

    3. יוצרים מאגר זהויות חדש של עומסי עבודה:
      gcloud iam workload-identity-pools create POOL_ID \
        --location="global" \
        --description="DESCRIPTION" \
        --display-name="DISPLAY_NAME"
                  

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

      • ‫POOL_ID: המזהה הייחודי של המאגר.
      • ‫DISPLAY_NAME: (אופציונלי) שם המאגר.
      • ‫DESCRIPTION: (אופציונלי) תיאור של המאגר שנבחר. התיאור הזה מופיע כשמעניקים גישה לזהויות במאגר.

      לדוגמה:

      gcloud iam workload-identity-pools create my-wi-pool --display-name="My workload pool" --description="My workload pool description"
    4. מוסיפים את האשכול כספק של מאגר זהויות של עומסי עבודה. בוחרים את הפקודה ליצירת הפלאגין שמתממשק עם שירותים חיצוניים בהתאם לשאלה אם המוסד המנפיק OIDC נגיש לציבור או לא נגיש לציבור:

      נגישה לכולם

      אם הנפקן של OIDC נגיש לציבור, יוצרים את הספק באמצעות הפקודה הבאה:

      gcloud iam workload-identity-pools providers create-oidc WORKLOAD_PROVIDER_ID \
        --location="global" \
        --workload-identity-pool="POOL_ID" \
        --issuer-uri="ISSUER" \
        --attribute-mapping="google.subject=assertion.sub"

      לא נגיש לציבור

      אם מנפיק ה-OIDC לא נגיש לציבור, יוצרים את הספק באמצעות הפקודה הבאה:

        gcloud iam workload-identity-pools providers create-oidc WORKLOAD_PROVIDER_ID \
        --location="global" \
        --workload-identity-pool="POOL_ID" \
        --issuer-uri="ISSUER" \
        --jwks-file="cluster-jwks.json" \
        --attribute-mapping="google.subject=assertion.sub"

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

      • WORKLOAD_PROVIDER_ID: מזהה ייחודי לפי בחירתכם של ספק מאגר הזהויות של עומסי העבודה.
      • ‫POOL_ID: מזהה מאגר הזהויות של עומסי העבודה שיצרתם קודם.
      • ‫ISSUER: משתמשים בכתובת ה-URL של המנפיק שקבעתם קודם ל-URI של המנפיק .

      attribute-mapping="google.subject=assertion.sub" ממפה את הנושא של Kubernetes לנושא של IAM.

יצירת קובצי התצורה של פרטי הכניסה

כדי לפרוס עומס עבודה ב-Kubernetes שיכול לגשת למשאבים של Google Cloud , צריך קודם ליצור קובץ תצורה של פרטי כניסה לכל חשבון שירות ב-IAM:

  1. כדי להציג את רשימת חשבונות השירות ב-IAM (שנקראים גם 'חשבונות שירות של Google'), מריצים את הפקודה הבאה:
    gcloud iam service-accounts list --project PROJECT_ID

    תצטרכו ליצור את קובצי התצורה של פרטי הכניסה לחשבונות השירות הבאים ב-IAM:

    Prod

    בסביבות ייצור:

    DISPLAY NAME          EMAIL                                                       DISABLED
    apigee-cassandra      apigee-cassandra@my_project_id.iam.gserviceaccount.com      False
    apigee-guardrails     apigee-guardrails@my_project_id.iam.gserviceaccount.com     False
    apigee-mart           apigee-mart@my_project_id.iam.gserviceaccount.com           False
    apigee-metrics        apigee-metrics@my_project_id.iam.gserviceaccount.com        False
    apigee-runtime        apigee-runtime@my_project_id.iam.gserviceaccount.com        False
    apigee-synchronizer   apigee-synchronizer@my_project_id.iam.gserviceaccount.com   False
    apigee-watcher        apigee-watcher@my_project_id.iam.gserviceaccount.com        False
    

    אם אתם משתמשים במונטיזציה ל-Apigee hybrid, תצטרכו גם ליצור את קובץ התצורה של פרטי הכניסה לחשבון השירות apigee-mint-task-scheduler.

    DISPLAY NAME                 EMAIL                                                              DISABLED
    ...
    apigee-mint-task-scheduler   apigee-mint-task-scheduler@my_project_id.iam.gserviceaccount.com   False
    ...

    Non-prod

    לסביבות שאינן סביבות ייצור:

    DISPLAY NAME         EMAIL                                                      DISABLED
    apigee-non-prod      apigee-non-prod@my-project.iam.gserviceaccount.com      False
    
  2. יוצרים קובץ תצורה של פרטי כניסה לכל חשבון שירות ב-IAM ברשימה הקודמת. תצטרכו את קובצי התצורה האלה של פרטי הכניסה כדי להגדיר את Apigee Hybrid לשימוש באיחוד שירותי אימות הזהות של עומסי עבודה:

    קוד

    gcloud iam workload-identity-pools create-cred-config \
      projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
      --service-account=SERVICE_ACCOUNT_EMAIL \
      --credential-source-file=/var/run/service-account/token \
      --credential-source-type=text \
      --output-file=SERVICE_ACCOUNT_NAME-credential-configuration.json
      

    דוגמה

    gcloud iam workload-identity-pools create-cred-config \
      projects/123123123123/locations/global/workloadIdentityPools/my-wi-pool/providers/my-wi-provider \
      --service-account=apigee-cassandra@myhybridporg.iam.gserviceaccount.com \
      --credential-source-file=/var/run/service-account/token \
      --credential-source-type=text \
      --output-file=apigee-cassandra-credential-configuration.json
      

    כאשר:

    • ‫PROJECT_NUMBER: מספר הפרויקט שמכיל את מאגר הזהויות של עומסי העבודה. צריך להזין את מספר הפרויקט ולא את מזהה הפרויקט.
    • ‫POOL_ID: המזהה של מאגר הזהויות של עומסי העבודה
    • ‫WORKLOAD_PROVIDER_ID: מזהה הספק של מאגר הזהויות של עומסי העבודה
    • ‫SERVICE_ACCOUNT_EMAIL: כתובת האימייל של חשבון השירות, אם הגדרתם את חשבון השירות של Kubernetes להשתמש בהתחזות לחשבון שירות של IAM.

    קובץ התצורה של פרטי הכניסה מאפשר ל[ספריות הלקוח ב-Cloud‏](/apis/docs/cloud-client-libraries), ל-CLI של gcloud ול-Terraform לקבוע את הפרטים הבאים:

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

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

  1. מעתיקים או מעבירים כל קובץ פלט (SERVICE_ACCOUNT_NAME-credential-configuration.json) לספריות התרשימים הבאות (או לספריות המשנה שלהן). אלה הקבצים שיצרתם בשלב יצירת קובצי התצורה של פרטי הכניסה.

    Prod

    חשבון שירות ספריית תרשימי Helm של Apigee
    apigee-cassandra apigee-datastore/
    apigee-guardrails apigee-operator/
    apigee-mart apigee-org/
    apigee-metrics apigee-telemetry/
    apigee-mint-task-scheduler
    (אם משתמשים ב-Monetization for Apigee hybrid)
    apigee-org/
    apigee-runtime apigee-env/
    apigee-synchronizer apigee-env/
    apigee-watcher apigee-org/

    לא בסביבת ייצור

    חשבון שירות תרשים Helm של Apigee
    apigee-non-prod apigee-operator/
    apigee-datastore/
    apigee-telemetry/
    apigee-org/
    apigee-env/
  2. מבצעים את השינויים הגלובליים הבאים בקובץ ההחלפות של האשכול:

    קוד

    gcp:
      workloadIdentity:
        enabled: false # must be set to false to use Workload Identity Federation
      federatedWorkloadIdentity:
        enabled: true
        audience: "AUDIENCE"
        credentialSourceFile: "/var/run/service-account/token"
    

    דוגמה

    gcp:
      workloadIdentity:
        enabled: false
      federatedWorkloadIdentity:
        enabled: true
        audience: "//iam.googleapis.com/projects/123123123123/locations/global/workloadIdentityPools/my-wi-pool/providers/my-wi-provider"
        credentialSourceFile: "/var/run/service-account/token"
    

    כאשר: AUDIENCE הוא הקהל המורשה של ספק מאגרי הזהויות של עומסי העבודה. כדי למצוא את הערך, מחפשים את המונח audience: באחד מקובצי התצורה של פרטי הכניסה. ערך הקהל זהה בכל קובץ תצורה של פרטי הכניסה.

    לדוגמה, בקובץ apigee-udca-credential-configuration.json הבא:

    {
      "universe_domain": "googleapis.com",
      "type": "external_account:,"
      "audience": "//iam.googleapis.com/projects/123123123123/locations/global/workloadIdentityPools/my-wi-pool/providers/my-wi-provider",
      "subject_token_type": "urn:ietf:params:oauth: token-type:jwt",
      "token_url": "https://sts.googleapis.com/v1/token",
      "service
      "impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/apigee-udca@my-project.iam.gserviceaccount.com:generateAccessToken",
      "credential_source": {
        "file": "/var/run/service-account/token",
        "format": {
          "type": "text"
        }
      }
    }

    ערך הקהל הוא //iam.googleapis.com/projects/123123123123/locations/global/workloadIdentityPools/my-wi-pool/providers/my-wi-provider.

  3. מגדירים את השינויים לכל רכיב באמצעות איחוד שירותי אימות הזהות של עומסי עבודה. בוחרים את ההוראות לקובצי JSON, לסודות של Kubernetes או ל-Vault, בהתאם להתקנה.

    קובץ אישור

    מחליפים את הערך של serviceAccountPath בקובץ המקור של פרטי הכניסה לחשבון השירות התואם ב-IAM. הנתיב הזה צריך להיות יחסי לספריית התרשים. לדוגמה:

    envs:
    - name: ENVIRONMENT_NAME
      serviceAccountPaths:
        synchronizer: apigee-synchronizer-credential-configuration.json
        runtime: apigee-runtime-credential-configuration.json
    
    guardrails:
      serviceAccountPath: apigee-guardrails-credential-configuration.json
    
    mart:
      serviceAccountPath: apigee-mart-credential-configuration.json
    
    connectAgent:
      serviceAccountPath: apigee-mart-credential-configuration.json
    
    metrics:
      serviceAccountPath: apigee-metrics-credential-configuration.json
    
    mintTaskScheduler: # Required if using Monetization for Apigee hybrid
      serviceAccountPath: apigee-mint-task-scheduler-credential-configuration.json
    
    watcher:
      serviceAccountPath: apigee-watcher-credential-configuration.json
    

    סוד של K8s

    1. יוצרים סוד חדש של Kubernetes באמצעות קובץ מקור פרטי הכניסה לכל קובץ תצורה של פרטי כניסה.
      kubectl create secret -n APIGEE_NAMESPACE generic SECRET_NAME --from-file="client_secret.json=CREDENTIAL_CONFIGURATION_FILE"

      לדוגמה:

      kubectl create secret -n apigee generic synchronizer-workload-identity-secret --from-file="client_secret.json=./apigee-synchronizer-credential-configuration.json"
    2. מחליפים את הערך של serviceAccountRef בסוד החדש. לדוגמה:
      envs:
      - name: ENVIRONMENT_NAME
        serviceAccountRefs:
          runtime: runtime-workload-identity-secret
          synchronizer: synchronizer-workload-identity-secret
      

    Vault

    מעדכנים את המפתח של חשבון השירות, SAKEY, לכל חשבון שירות ב-Vault עם קובץ מקור פרטי הכניסה המתאים. התהליך דומה בכל הרכיבים. לדוגמה, עבור Synchronizer:

    SAKEY=$(cat .apigee-synchronizer-credential-configuration.json); kubectl -n APIGEE_NAMESPACE exec vault-0 -- vault kv patch secret/apigee/orgsakeys synchronizer="$SAKEY"

    מידע נוסף זמין בכתובת Storing service account keys in Hashicorp Vault.

  4. מחילים את השינויים על כל רכיב מושפע באמצעות הפקודה helm upgrade:

    אם עדכנתם את המפתחות של חשבון השירות של Vault, תצטרכו לעדכן את התרשים apigee-operator.

    helm upgrade operator apigee-operator/ \
      --namespace APIGEE_NAMESPACE \
      --atomic \
      -f overrides.yaml
    

    מעדכנים את שאר התרשימים המושפעים בסדר הבא:

    helm upgrade datastore apigee-datastore/ \
      --namespace APIGEE_NAMESPACE \
      --atomic \
      -f overrides.yaml
    
    helm upgrade telemetry apigee-telemetry/ \
      --namespace APIGEE_NAMESPACE \
      --atomic \
      -f overrides.yaml
    
    helm upgrade $ORG_NAME apigee-org/ \
      --namespace APIGEE_NAMESPACE \
      --atomic \
      -f overrides.yaml
    

    מעדכנים את התרשים של apigee-env לכל סביבה, ומחליפים את $ENV_RELEASE_NAME ו-ENV_NAME בכל פעם:

    helm upgrade $ENV_RELEASE_NAME apigee-env/ \
      --namespace APIGEE_NAMESPACE \
      --atomic \
      --set env=$ENV_NAME \
      -f overrides.yaml
    

    רשימת הרכיבים והתרשימים התואמים שלהם מופיעה בחומר העזר בנושא Apigee hybrid Helm.

מתן גישה לחשבונות שירות של Kubernetes

  1. מציגים את רשימת חשבונות השירות של Kubernetes באמצעות הפקודה הבאה:
    kubectl get sa -n APIGEE_NAMESPACE
  2. נותנים לחשבונות השירות של Kubernetes גישה להתחזות לחשבונות השירות המשויכים ב-IAM, כמו שמוצג בטבלה הבאה. בטבלה מוצגים השמות של חשבונות השירות שמוגדרים כברירת מחדל ב-Apigee IAM. אם אתם משתמשים בשמות של חשבונות שירות בהתאמה אישית, השתמשו בחשבונות השירות התואמים ב-IAM:
    חשבונות שירות ב-Kubernetes חשבון שירות ב-IAM
    חשבונות שירות של Kubernetes ברמת הארגון
    apigee-connect-agent-ORG_NAME-ORG_HASH_ID apigee-mart
    apigee-operator-guardrails-sa apigee-guardrails
    apigee-mart-ORG_NAME-ORG_HASH_ID apigee-mart
    apigee-metrics-apigee-telemetry apigee-metrics
    apigee-open-telemetry-collector-apigee-telemetry apigee-metrics
    apigee-mint-task-scheduler-ORG_NAME-ORG_HASH_ID
    (אם משתמשים במונטיזציה ל-Apigee Hybrid)
    apigee-mint-task-scheduler
    apigee-watcher-ORG_NAME-ORG_HASH_ID apigee-watcher
    חשבונות שירות של Kubernetes ברמת הסביבה
    apigee-runtime-ORG_NAME-ENV_NAME-ENV_HASH_ID apigee-runtime
    apigee-synchronizer-ORG_NAME-ENV_NAME-ENV_HASH_ID apigee-synchronizer
    גיבוי ושחזור של Cassandra (אם האפשרות מופעלת)
    apigee-cassandra-backup-sa apigee-cassandra
    apigee-cassandra-restore-sa apigee-cassandra

    כאשר:

    • ‫ORG_NAME: 15 התווים הראשונים של שם הארגון.
    • ‫ORG_HASH_ID: מזהה גיבוב (hash) ייחודי של השם המלא של הארגון.
    • ‫ENV_NAME: 15 התווים הראשונים של שם הסביבה.
    • ‫ENV_HASH_ID: מזהה גיבוב ייחודי של שמות הארגון והסביבה.

    לדוגמה:

    • apigee-connect-agent-myhybridorg-123abcd
    • apigee-runtime-myhybridorg-prodenv-234bcde

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

    gcloud iam service-accounts add-iam-policy-binding \
      IAM_SA_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/MAPPED_SUBJECT" \
        --role=roles/iam.workloadIdentityUser

    כאשר:

    • ‫IAM_SA_NAME: השם של חשבון השירות.
    • ‫PROJECT_ID: מזהה הפרויקט שמשויך לארגון ב-Apigee.
    • ‫PROJECT_NUMBER: מספר הפרויקט שבו יצרתם את מאגר הזהויות של עומסי העבודה.
    • ‫POOL_ID: המזהה של מאגר הזהויות של עומסי העבודה.
    • ‫MAPPED_SUBJECT: חשבון השירות של Kubernetes מתוך ההצהרה באסימון המזהה שמיפיתם ל-google.subject. לדוגמה, אם מיפיתם את google.subject=assertions.sub והטוקן של המזהה מכיל את "sub": "system:serviceaccount:default:my-kubernetes-serviceaccount", אז MAPPED_SUBJECT הוא system:serviceaccount:default:my-kubernetes-serviceaccount.

מידע נוסף על איחוד שירותי אימות הזהות של עומסי עבודה ושיטות מומלצות זמין במאמר שיטות מומלצות לשימוש באיחוד שירותי אימות הזהות של עומסי עבודה.