בדף הזה מוסבר איך להגדיר את האפליקציות כך שיבצעו אימות ל-Google Cloud APIs כמו Compute Engine API או AI Platform API מציים שיש להם מודל אמון משותף. אם בצי שלכם יש מודל אמון מעורב, תוכלו לקרוא את המאמר אימות ל-API מתוך עומסי עבודה בצי עם מודל אמון מעורב (גרסת Preview). Google Cloud
הדף הזה מיועד לאדמינים ולמפעילים של פלטפורמות ולמהנדסי אבטחה שרוצים לבצע אימות פרוגרמטי של עומסי עבודה בצי לממשקי API של Google Cloud. מידע נוסף על תפקידי המשתמשים ועל משימות לדוגמה שאנחנו מתייחסים אליהם במסמכי התיעוד זמין במאמר תפקידי משתמשים נפוצים ומשימות ב-GKE. Google Cloud
לפני שקוראים את הדף הזה, חשוב להכיר את המושגים הבאים:
- מידע על איחוד שירותי אימות הזהות של עומסי עבודה ב-Fleet
- Kubernetes ConfigMaps
- מדיניות הרשאות בניהול זהויות והרשאות גישה (IAM)
מידע על איחוד שירותי אימות הזהות של עומסי עבודה ב-Fleet בסביבות של אמון משותף
Fleet Workload Identity Federation מאפשר לכם לבצע אימות מעומסי עבודה ב-Fleet אל ממשקי API שלGoogle Cloud באמצעות מנגנוני אימות מובנים של Google Cloud ושל Kubernetes. איחוד שירותי אימות הזהות של עומסי עבודה ב-Fleet מבטל את הצורך להשתמש בשיטות פחות מאובטחות כמו טעינת אסימוני גישה ב-Pods או אחסון פרטי כניסה לטווח ארוך.
כברירת מחדל, פרויקט המארח של ה-Fleet משתמש במאגר זהויות של עומסי עבודה שמנוהל על ידי Google כדי להקצות זהויות לישויות ב-Fleet. כל ישות בצי או בפרויקט המארח של הצי שיש לה אותו מזהה IAM נחשבת לאותו דבר על ידי IAM. הזהות המשתמעת הזהה שימושית כשמעניקים גישה בהיקף גדול בסביבות של אמון משותף, כמו צי של מכשירים עם דייר יחיד, שבהן לא משנה אם ישויות אחרות מקבלות בטעות הרשאות דומות למשאבים.
לפני שמתחילים
ודאו שכלי שורת הפקודה הבאים מותקנים:
- הגרסה העדכנית של Google Cloud CLI, שכוללת את
gcloud, כלי שורת הפקודה לאינטראקציה עם Google Cloud. kubectl
אם אתם משתמשים ב-Cloud Shell כסביבת המעטפת שלכם לאינטראקציה עם Google Cloud, הכלים האלה מותקנים בשבילכם.
- הגרסה העדכנית של Google Cloud CLI, שכוללת את
מוודאים שאתחלתם את ה-CLI של gcloud לשימוש בפרויקט.
הכנת האשכולות
כדי שאפליקציות בצי יוכלו לקבל זהות מאוחדת, צריך לרשום את האשכולות שבהם הן פועלות לצי ולהגדיר אותם בצורה נכונה לשימוש באיחוד זהויות של עומסי עבודה בצי. בקטעים הבאים מוסבר איך להגדיר איחוד שירותי אימות הזהות של עומסי עבודה בציים לסוגים שונים של אשכולות.
GKE
באשכולות GKE, מבצעים את הפעולות הבאות:
- אם היא עדיין לא מופעלת, צריך להפעיל את איחוד זהויות של עומסי עבודה ל-GKE באשכול Google Kubernetes Engine.
- רושמים את האשכול ב-Fleet.
אפשר גם להפעיל איחוד זהויות של עומסי עבודה ל-GKE במהלך תהליך יצירת האשכול ורישום צי האשכולות.
מקבצים מחוץ Google Cloud
בסוגי האשכולות הבאים, איחוד שירותי אימות הזהות של עומסי עבודה ב-Fleet מופעל באופן אוטומטי, והם נרשמים ל-Fleet במהלך יצירת האשכול:
- Google Distributed Cloud (תוכנה בלבד) ב-VMware
- Google Distributed Cloud (תוכנה בלבד) בשרת פיזי
- GKE ב-AWS
- GKE ב-Azure
אשכולות מצורפים
אשכולות מצורפים של EKS ו-AKS שנרשמו באמצעות GKE Multi-Cloud API נרשמים עם איחוד שירותי אימות הזהות של עומסי עבודה של Fleet שמופעל כברירת מחדל. אפשר לרשום אשכולות מצורפים אחרים עם איחוד שירותי אימות הזהות של עומסי עבודה מופעל אם הם עומדים בדרישות הנדרשות. פועלים לפי ההוראות לסוג האשכול שמופיעות במאמר בנושא רישום אשכול.
שימוש באיחוד שירותי אימות הזהות של עומסי עבודה ב-Fleet באפליקציות
בשלבים הבאים מוסבר איך להגדיר עומס עבודה באשכול רשום לשימוש באיחוד שירותי אימות הזהות של עומסי עבודה ב-Fleet:
מאתרים את השם של מאגר הזהויות של עומסי העבודה וספק הזהויות של האשכול:
gcloud container fleet memberships describe MEMBERSHIP_ID \ --project=FLEET_PROJECT_ID \ --format="table(authority.identityProvider,authority.workloadIdentityPool,name)"מחליפים את מה שכתוב בשדות הבאים:
-
MEMBERSHIP_ID: השם של החברות באשכול. זה בדרך כלל השם של האשכול. -
FLEET_PROJECT_ID: מזהה הפרויקט המארח של הצי.
הפלט אמור להיראות כך:
IDENTITY_PROVIDER: IDENTITY_PROVIDER WORKLOAD_IDENTITY_POOL: WORKLOAD_IDENTITY_POOL NAME: projects/FLEET_PROJECT_ID/locations/MEMBERSHIP_LOCATION/memberships/MEMBERSHIP_IDהפלט הזה כולל את המידע הבא:
-
IDENTITY_PROVIDER: ספק הזהויות של האשכול. -
MEMBERSHIP_LOCATION: המיקום של החברות ב-Fleet. בדרך כלל זהה למיקום האשכול. -
WORKLOAD_IDENTITY_POOL: השם של מאגר הזהויות של עומסי העבודה שמשויך לצי. הערך הזה כולל את התחבירFLEET_PROJECT_ID.svc.id.goog.
-
יוצרים מרחב שמות של Kubernetes. אפשר גם להשתמש בכל מרחב שמות קיים, כולל מרחב השמות
default.kubectl create namespace NAMESPACEמחליפים את
NAMESPACEבשם של מרחב השמות.יוצרים חשבון שירות חדש של Kubernetes במרחב השמות. אפשר גם להשתמש בכל ServiceAccount קיים, כולל ServiceAccount
defaultבמרחב השמות.kubectl create serviceaccount KSA_NAME \ --namespace=NAMESPACEמחליפים את
KSA_NAMEבשם של ServiceAccount.שומרים את קובץ המניפסט הבא בשם
adc-config-map.yaml. ה-ConfigMap הזה מכיל את הגדרות ה-ADC לעומסי עבודה.kind: ConfigMap apiVersion: v1 metadata: namespace: NAMESPACE name: my-cloudsdk-config data: config: | { "type": "external_account", "audience": "identitynamespace:WORKLOAD_IDENTITY_POOL:IDENTITY_PROVIDER", "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" } }פורסים את ה-ConfigMap:
kubectl create -f adc-config-map.yamlשומרים את קובץ המניפסט הבא בשם
workload-config.yaml:apiVersion: v1 kind: Pod metadata: name: my-pod namespace: NAMESPACE spec: serviceAccountName: KSA_NAME containers: - name: sample-container image: google/cloud-sdk:slim command: ["sleep","infinity"] 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: WORKLOAD_IDENTITY_POOL expirationSeconds: 172800 - configMap: name: my-cloudsdk-config optional: false items: - key: "config" path: "google-application-credentials.json"כשפורסים את עומס העבודה הזה, הנפח
gcp-ksaב-Pod מכיל את הנתונים הבאים:- הנתונים ב-ConfigMap שפרסתם כקובץ בשם
google-application-credentials.json. הקובץ הזה הוא קובץ תצורה של פרטי כניסה ל-ADC. - האסימון של Kubernetes ServiceAccount בתור
token. Kubernetes מבצעת mount של JWT חתום בשביל ServiceAccount כקובץ אסימון ServiceAccount מוקרן.
הקונטיינר ב-Pod מטמיע את הווליום
gcp-ksaבנתיב/var/run/secrets/tokens/gcp-ksaומגדיר את ADC לחפש את קובץ ה-JSON של הגדרות פרטי הכניסה בנתיב הזה.- הנתונים ב-ConfigMap שפרסתם כקובץ בשם
פורסים את עומס העבודה:
kubectl apply -f workload-config.yaml
אפשרות חלופית: התחזות לחשבון שירות של IAM
לחלופין, אתם יכולים להגדיר חשבונות שירות של Kubernetes באשכולות שלכם כדי להתחזות לחשבונות שירות של IAM ולבצע כל פעולה מורשית שחשבונות השירות של IAM יכולים לבצע. הגישה הזו עלולה להגדיל את תקורה התחזוקה, כי צריך לנהל את ההתאמות של חשבונות השירות גם ב-IAM וגם ב-Kubernetes.
ברוב התרחישים, מומלץ להפנות ישירות לחשבונות משתמשים של Kubernetes במדיניות הרשאות ב-IAM כדי להעניק גישה למשאביGoogle Cloud . לשם כך, צריך לפעול לפי ההוראות במאמר שימוש באיחוד שירותי אימות הזהות של עומסי עבודה ב-Fleet באפליקציות.
מאתרים את השם של מאגר הזהויות של עומסי העבודה וספק הזהויות של האשכול:
gcloud container fleet memberships describe MEMBERSHIP_ID \ --project=FLEET_PROJECT_ID \ --format="table(authority.identityProvider,authority.workloadIdentityPool,name)"מחליפים את מה שכתוב בשדות הבאים:
-
MEMBERSHIP_ID: השם של החברות באשכול. זה בדרך כלל השם של האשכול. -
FLEET_PROJECT_ID: מזהה הפרויקט המארח של הצי.
הפלט אמור להיראות כך:
IDENTITY_PROVIDER: IDENTITY_PROVIDER WORKLOAD_IDENTITY_POOL: WORKLOAD_IDENTITY_POOL NAME: projects/FLEET_PROJECT_ID/locations/MEMBERSHIP_LOCATION/memberships/MEMBERSHIP_IDהפלט הזה כולל את המידע הבא:
-
IDENTITY_PROVIDER: ספק הזהויות של האשכול. -
MEMBERSHIP_LOCATION: המיקום של החברות. בדרך כלל זה אותו מיקום כמו המיקום של האשכול. -
WORKLOAD_IDENTITY_POOL: השם של מאגר הזהויות של עומסי העבודה שמשויך לצי. הערך הזה כולל את התחבירFLEET_PROJECT_ID.svc.id.goog.
-
יוצרים חשבון שירות ב-IAM שהאפליקציה יכולה להתחזות אליו. אפשר גם להשתמש בחשבון שירות קיים של IAM.
gcloud iam service-accounts create IAM_SA_NAME \ --project=IAM_SA_PROJECT_IDמחליפים את מה שכתוב בשדות הבאים:
-
IAM_SA_NAME: השם של חשבון השירות ב-IAM. -
IAM_SA_PROJECT_ID: מזהה הפרויקט שמכיל את חשבון השירות שלכם ב-IAM. הפרויקט הזה יכול להיות שונה מהפרויקט המארח של צי הרכבים.
-
נותנים לחשבון השירות ב-IAM את ההרשאות שנדרשות לו כדי לגשת ל-API של Google Cloud על ידי הוספה של כללי מדיניות ההרשאה הנדרשים ב-IAM. אפשר לעשות זאת באמצעות
gcloud iam service-accounts add-iam-policy-bindingאו שיטה אחרת. במאמר הסבר על תפקידים מפורטת רשימה מלאה של תפקידים מוגדרים מראש עם ההרשאות הנדרשות. אפשר גם לעיין במסמכי התיעוד של כל שירות כדי לראות אילו הרשאות נדרשות לשימוש בממשקי API של Google Cloud .יוצרים ServiceAccount ב-Kubernetes במרחב שמות. אפשר גם להשתמש ב-ServiceAccount קיים של Kubernetes ובכל מרחב שמות, כולל ServiceAccount של
defaultומרחב השמות שלdefault.kubectl create serviceaccount KSA_NAME \ --namespace=NAMESPACEמחליפים את מה שכתוב בשדות הבאים:
-
KSA_NAME: השם של ServiceAccount. -
NAMESPACE: השם של מרחב השמות.
-
יוצרים מדיניות הרשאה ב-IAM שמאפשרת לחשבון שירות של Kubernetes במרחב שמות ספציפי באשכול להתחזות לחשבון שירות של IAM:
gcloud iam service-accounts add-iam-policy-binding IAM_SA_NAME@IAM_SA_PROJECT_ID.iam.gserviceaccount.com \ --project=IAM_SA_PROJECT_ID \ --role=roles/iam.workloadIdentityUser \ --member="serviceAccount:WORKLOAD_IDENTITY_POOL[NAMESPACE/KSA_NAME]"מחליפים את
WORKLOAD_IDENTITY_POOLבשם של מאגר הזהויות של עומסי העבודה.שומרים את קובץ המניפסט הבא בשם
adc-config-map.yaml. ה-ConfigMap הזה מכיל את הגדרות ה-ADC לעומסי עבודה.kind: ConfigMap apiVersion: v1 metadata: namespace: K8S_NAMESPACE name: my-cloudsdk-config data: config: | { "type": "external_account", "audience": "identitynamespace:WORKLOAD_IDENTITY_POOL:IDENTITY_PROVIDER", "service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/IAM_SA_NAME@GSA_PROJECT_ID.iam.gserviceaccount.com: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" } }מחליפים את מה שכתוב בשדות הבאים:
-
IAM_SA_NAME: השם של חשבון השירות ב-IAM שרוצים להתחזות אליו. -
IAM_SA_PROJECT_ID: מזהה הפרויקט של חשבון השירות ב-IAM.
-
שומרים את קובץ המניפסט הבא בשם
workload-config.yaml:apiVersion: v1 kind: Pod metadata: name: my-pod namespace: K8S_NAMESPACE spec: serviceAccountName: KSA_NAME containers: - name: my-container image: my-image command: ["sleep","infinity"] 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: WORKLOAD_IDENTITY_POOL expirationSeconds: 172800 - configMap: name: my-cloudsdk-config optional: false items: - key: "config" path: "google-application-credentials.json"כשפורסים את עומס העבודה הזה, הנפח
gcp-ksaב-Pod מכיל את הנתונים הבאים:- הנתונים ב-ConfigMap שפרסתם כקובץ בשם
google-application-credentials.json. הקובץ הזה הוא קובץ תצורה של פרטי כניסה ל-ADC. - האסימון של Kubernetes ServiceAccount בתור
token. Kubernetes מבצעת mount של JWT חתום בשביל ServiceAccount כקובץ אסימון ServiceAccount מוקרן.
הקונטיינר ב-Pod מטמיע את הווליום
gcp-ksaבנתיב/var/run/secrets/tokens/gcp-ksaומגדיר את ADC לחפש את קובץ ה-JSON של הגדרות פרטי הכניסה בנתיב הזה.- הנתונים ב-ConfigMap שפרסתם כקובץ בשם
פורסים את עומס העבודה:
kubectl apply -f workload-config.yaml
אימות ההגדרה של איחוד שירותי אימות הזהות של עומסי עבודה ב-Fleet
בקטע הזה יוצרים קטגוריה של Cloud Storage וניגשים אליה מ-Pod שמשתמש באיחוד שירותי אימות הזהויות של עומסי עבודה בצי. לפני שמבצעים את השלבים האלה, צריך לוודא שהגדרתם את איחוד שירותי אימות הזהות של עומסי עבודה בהתאם להוראות שבקטע שימוש באיחוד שירותי אימות הזהות של עומסי עבודה ב-Fleet באפליקציות.
בקטע הזה לא מוסבר איך לאמת את איחוד שירותי אימות הזהות של עומסי עבודה באמצעות שיטת ההתחזות לחשבון שירות של IAM.
מאתרים את מספר הפרויקט:
gcloud projects describe FLEET_PROJECT_ID \ --format="value(projectNumber)"הפלט אמור להיראות כך:
1234567890יוצרים קטגוריה של Cloud Storage:
gcloud storage buckets create gs://FLEET_PROJECT_ID-test-bucket \ --location=LOCATIONמחליפים את
LOCATIONבמיקום Google Cloud.יוצרים מדיניות הרשאה ב-IAM שמעניקה גישה לדלי לחשבון השירות שיצרתם:
gcloud storage buckets add-iam-policy-binding gs://FLEET_PROJECT_ID-test-bucket \ --condition=None \ --role=roles/storage.objectViewer \ --member=principal://iam.googleapis.com/projects/FLEET_PROJECT_NUMBER/locations/global/workloadIdentityPools/FLEET_PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAMEמחליפים את מה שכתוב בשדות הבאים:
-
FLEET_PROJECT_NUMBER: מספר הפרויקט. FLEET_PROJECT_ID: מזהה הפרויקט.-
NAMESPACE: השם של מרחב השמות של Kubernetes שבו פועל ה-Pod מהקטע הקודם. -
KSA_NAME: השם של חשבון השירות ב-Kubernetes שה-Pod מהקטע הקודם משתמש בו.
-
יוצרים סשן של מעטפת ב-Pod:
kubectl exec -it pods/my-pod --namespace=NAMESPACE -- /bin/bashמנסים להציג את רשימת האובייקטים בקטגוריה:
curl -X GET -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ "https://storage.googleapis.com/storage/v1/b/FLEET_PROJECT_ID-test-bucket/o"הפלט שיתקבל:
{ "kind": "storage#objects" }
אימות מהקוד
כשמשתמשים בספריות לקוח של Cloud, ספריות האימות משתמשות אוטומטית ב-ADC כדי לחפש פרטי כניסה לאימות מול שירותי Google Cloud . צריך להשתמש בספריות לקוח ב-Cloud שתומכות באיחוד שירותי אימות הזהות של עומסי עבודה. בטבלה הבאה מפורטות הגרסאות המינימליות הנדרשות של ספריות הלקוח ב-Cloud, ומוסבר איך לבדוק את הגרסה הנוכחית:
C++
רוב ספריות הלקוח ב-C++ תומכות באיחוד שירותי אימות הזהות באמצעות אובייקט ChannelCredentials שנוצר בקריאה ל-grpc::GoogleDefaultCredentials().Google Cloud כדי לאתחל את פרטי הכניסה האלה, צריך ליצור את ספריות הלקוח ב-gRPC בגרסה 1.36.0 ואילך.
בספריית הלקוח ב-Cloud Storage ל-C++ נעשה שימוש ב-API בארכיטקטורת REST ולא ב-gRPC, ולכן אין בה תמיכה באיחוד שירותי אימות הזהות.
Go
ספריות לקוח ל-Go תומכות באיחוד שירותי אימות הזהות אם נעשה בהן שימוש במודול golang.org/x/oauth2 בגרסה 00.0.0-20210218202405-ba52d332ba99 ואילך.
כדי לבדוק באיזו גרסה של המודול הזה נעשה שימוש בספריית הלקוח, מפעילים את הפקודות האלה:
cd $GOPATH/src/cloud.google.com/go
go list -m golang.org/x/oauth2
Java
בספריות לקוח ל-Java יש תמיכה באיחוד שירותי אימות הזהות, אם נעשה בהן שימוש בארטיפקט com.google.auth:google-auth-library-oauth2-http בגרסה 0.24.0 ואילך.
כדי לבדוק באיזו גרסה של הארטיפקט הזה נעשה שימוש בספריית הלקוח, בספרייה של האפליקציה מפעילים את פקודת Maven הזאת:
mvn dependency:list -DincludeArtifactIds=google-auth-library-oauth2-http
Node.js
בספריות לקוח ל-Node.js יש תמיכה באיחוד שירותי אימות הזהות אם נעשה בהן שימוש בחבילת google-auth-library בגרסה 7.0.2 ואילך.
כדי לבדוק באיזו גרסה של החבילה הזאת נעשה שימוש בספריית הלקוח, בספרייה של האפליקציה מפעילים את פקודת Maven הזאת:
npm list google-auth-library
כשיוצרים אובייקט GoogleAuth, אפשר לציין מזהה פרויקט או לאפשר ל-GoogleAuth לאתר את מזהה הפרויקט באופן אוטומטי. כדי לאתר את מזהה הפרויקט באופן אוטומטי, צריך להקצות לחשבון השירות בקובץ התצורה את התפקיד דפדפן (roles/browser) או תפקיד עם הרשאות דומות בפרויקט. לפרטים נוספים, ראו README לחבילת google-auth-library.
Python
בספריות לקוח ל-Python יש תמיכה באיחוד שירותי אימות הזהות של עומסי עבודה אם נעשה בהן שימוש בחבילת google-auth בגרסת 1.27.0 ואילך.
כדי לבדוק באיזו גרסה של החבילה הזאת נעשה שימוש בספריית הלקוח, בסביבה שהחבילה מותקנת בה מפעילים את הפקודה:
pip show google-auth
כדי לציין מזהה פרויקט ללקוח האימות, תוכלו להגדיר את משתנה הסביבה GOOGLE_CLOUD_PROJECT או לאפשר ללקוח למצוא את מזהה הפרויקט באופן אוטומטי. כדי לאתר את מזהה הפרויקט באופן אוטומטי, צריך להקצות לחשבון השירות בקובץ התצורה את התפקיד דפדפן (roles/browser) או תפקיד עם הרשאות דומות בפרויקט. לפרטים נוספים, ראו מדריך למשתמש לחבילת google-auth.
מה השלב הבא?
שיטות מומלצות לארגון צי הרכבים כשמשתמשים באיחוד שירותי אימות הזהות של עומסי עבודה בצי.