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

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

להתקנות ב-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-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-udca                  apigee-udca@my_project_id.iam.gserviceaccount.com                  False
    apigee-watcher               apigee-watcher@my_project_id.iam.gserviceaccount.com               False
    

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

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

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

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

    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 ServiceAccount כך שישתמש בהתחזות לחשבון שירות של 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-mart apigee-org/
    apigee-metrics apigee-telemetry/
    apigee-mint-task-scheduler
    (אם משתמשים במונטיזציה ב-Apigee Hybrid)
    apigee-org/
    apigee-runtime apigee-env/
    apigee-synchronizer apigee-env/
    apigee-udca apigee-org/
    apigee-env/
    apigee-watcher apigee-org/

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

    חשבון שירות תרשים Helm של Apigee
    apigee-non-prod 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
        udca: apigee-udca-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 for Monetization for Apigee hybrid (v1.15.1 and later)
      serviceAccountPath: apigee-mint-task-scheduler-credential-configuration.json
    
    udca:
      serviceAccountPath: apigee-udca-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 udca-workload-identity-secret --from-file="client_secret.json=./apigee-udca-credential-configuration.json"
    2. מחליפים את הערך של serviceAccountRef בסוד החדש. לדוגמה:
      udca:
        serviceAccountRef: udca-workload-identity-secret
      

    Vault

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

    SAKEY=$(cat .apigee-udca-credential-configuration.json); kubectl -n APIGEE_NAMESPACE exec vault-0 -- vault kv patch secret/apigee/orgsakeys udca="$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-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-udca-ORG_NAME-ORG_HASH_ID apigee-udca
    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: מזהה גיבוב (hash) ייחודי של שמות הארגון והסביבה.

    לדוגמה:

    • 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 ServiceAccount מההצהרה בטוקן של מזהה שמיפיתם ל-google.subject. לדוגמה, אם מיפיתם את google.subject=assertions.sub והטוקן של המזהה מכיל את "sub": "system:serviceaccount:default:my-kubernetes-serviceaccount", אז MAPPED_SUBJECT הוא system:serviceaccount:default:my-kubernetes-serviceaccount.

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