במאמר הזה מוסבר איך להפעיל את איחוד שירותי אימות הזהות של עומסי עבודה בהתקנות של 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) של האשכול.
מגדירים את האשכול כך שישתמש באיחוד שירותי אימות הזהות של עומסי עבודה.
-
מריצים את הפקודה הבאה כדי לוודא שההגדרות הנוכחיות של
gcloudתואמות למזהה הפרויקט ב-Google Cloud:gcloud config get project
-
מפעילים את 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 באמצעות הפקודה הבאה:
gcloud services enable sts.googleapis.com --project PROJECT_ID
-
יוצרים את הספק ואת מאגר הזהויות של עומסי העבודה.
התפקידים הנדרשים
כדי לקבל את ההרשאות שדרושות להגדרה של איחוד שירותי אימות הזהות של עומסי עבודה, צריך לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים בפרויקט:
- אדמין במאגר זהויות של עומסי עבודה (
roles/iam.workloadIdentityPoolAdmin) - אדמין בחשבון שירות (
roles/iam.serviceAccountAdmin)
להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.
יכול להיות שאפשר לקבל את ההרשאות הנדרשות גם באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש.
לחלופין, התפקיד הבסיסי ב-IAM 'בעלים' (roles/owner) כולל גם הרשאות להגדרה של איחוד זהויות. בסביבת ייצור לא מומלץ להקצות תפקידים בסיסיים, אבל אפשר להעניק אותם בסביבת פיתוח או בסביבת בדיקה.כדי ליצור ספק ומאגר זהויות של כוח עבודה:
-
מגדירים את כתובת ה-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 של המנפיק באחד מהשלבים הבאים.
-
-
אופציונלי: אם אי אפשר לגשת לשרת ה-OIDC שלכם באופן ציבורי, מורידים את קבוצת מפתחות ה-JSON Web Key Set (JWKS) של האשכול:
kubectl get --raw /openid/v1/jwks > cluster-jwks.json
כדי לבדוק אם ספק ה-OIDC זמין לציבור, אתם אמורים להיות מסוגלים לגשת לכתובת ה-URL של הספק באמצעות פקודת CURL ולקבל תגובה 200.
-
יוצרים מאגר זהויות חדש של עומסי עבודה:
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" -
-
מוסיפים את האשכול כספק של מאגר זהויות של עומסי עבודה. בוחרים את הפקודה ליצירת הפלאגין שמתממשק עם שירותים חיצוניים בהתאם לשאלה אם המוסד המנפיק 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.
- אדמין במאגר זהויות של עומסי עבודה (
אם צריך, מגדירים את ההגדרות הנוכחיות של gcloud:
gcloud config set project PROJECT_ID
יצירת קובצי התצורה של פרטי הכניסה
כדי לפרוס עומס עבודה ב-Kubernetes שיכול לגשת למשאבים של Google Cloud , צריך קודם ליצור קובץ תצורה של פרטי כניסה לכל חשבון שירות ב-IAM:
-
כדי להציג את רשימת חשבונות השירות ב-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
-
יוצרים קובץ תצורה של פרטי כניסה לכל חשבון שירות ב-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 לשימוש באיחוד שירותי אימות הזהות של עומסי עבודה
-
מעתיקים או מעבירים כל קובץ פלט (
SERVICE_ACCOUNT_NAME-credential-configuration.json) לספריות התרשימים הבאות (או לספריות המשנה שלהן). אלה הקבצים שיצרתם בשלב יצירת קובצי התצורה של פרטי הכניסה.Prod
חשבון שירות ספריית תרשימי Helm של Apigee apigee-cassandraapigee-datastore/apigee-guardrailsapigee-operator/apigee-martapigee-org/apigee-metricsapigee-telemetry/apigee-mint-task-scheduler
(אם משתמשים ב-Monetization for Apigee hybrid)apigee-org/apigee-runtimeapigee-env/apigee-synchronizerapigee-env/apigee-watcherapigee-org/לא בסביבת ייצור
חשבון שירות תרשים Helm של Apigee apigee-non-prodapigee-operator/
apigee-datastore/
apigee-telemetry/
apigee-org/
apigee-env/ -
מבצעים את השינויים הגלובליים הבאים בקובץ ההחלפות של האשכול:
קוד
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. -
מגדירים את השינויים לכל רכיב באמצעות איחוד שירותי אימות הזהות של עומסי עבודה. בוחרים את ההוראות לקובצי 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
-
יוצרים סוד חדש של 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"
-
מחליפים את הערך של
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. -
יוצרים סוד חדש של Kubernetes באמצעות קובץ מקור פרטי הכניסה לכל קובץ תצורה של פרטי כניסה.
-
מחילים את השינויים על כל רכיב מושפע באמצעות הפקודה
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
-
מציגים את רשימת חשבונות השירות של Kubernetes באמצעות הפקודה הבאה:
kubectl get sa -n APIGEE_NAMESPACE
-
נותנים לחשבונות השירות של Kubernetes גישה להתחזות לחשבונות השירות המשויכים ב-IAM, כמו שמוצג בטבלה הבאה. בטבלה מוצגים השמות של חשבונות השירות שמוגדרים כברירת מחדל ב-Apigee IAM. אם אתם משתמשים בשמות של חשבונות שירות בהתאמה אישית, השתמשו בחשבונות השירות התואמים ב-IAM:
חשבונות שירות ב-Kubernetes חשבון שירות ב-IAM חשבונות שירות של Kubernetes ברמת הארגון apigee-connect-agent-ORG_NAME-ORG_HASH_IDapigee-martapigee-operator-guardrails-saapigee-guardrailsapigee-mart-ORG_NAME-ORG_HASH_IDapigee-martapigee-metrics-apigee-telemetryapigee-metricsapigee-open-telemetry-collector-apigee-telemetryapigee-metricsapigee-mint-task-scheduler-ORG_NAME-ORG_HASH_ID
(אם משתמשים במונטיזציה ל-Apigee Hybrid)apigee-mint-task-schedulerapigee-watcher-ORG_NAME-ORG_HASH_IDapigee-watcherחשבונות שירות של Kubernetes ברמת הסביבה apigee-runtime-ORG_NAME-ENV_NAME-ENV_HASH_IDapigee-runtimeapigee-synchronizer-ORG_NAME-ENV_NAME-ENV_HASH_IDapigee-synchronizerגיבוי ושחזור של Cassandra (אם האפשרות מופעלת) apigee-cassandra-backup-saapigee-cassandraapigee-cassandra-restore-saapigee-cassandraכאשר:
-
ORG_NAME: 15 התווים הראשונים של שם הארגון. -
ORG_HASH_ID: מזהה גיבוב (hash) ייחודי של השם המלא של הארגון. -
ENV_NAME: 15 התווים הראשונים של שם הסביבה. -
ENV_HASH_ID: מזהה גיבוב ייחודי של שמות הארגון והסביבה.
לדוגמה:
apigee-connect-agent-myhybridorg-123abcdapigee-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.
-
מידע נוסף על איחוד שירותי אימות הזהות של עומסי עבודה ושיטות מומלצות זמין במאמר שיטות מומלצות לשימוש באיחוד שירותי אימות הזהות של עומסי עבודה.