במסמך הזה מוסבר איך להגדיר גישה מבוססת-אישורים לאיחוד שירותי אימות הזהות של עומסי עבודה באמצעות אישורי X.509.
גישה שמבוססת על אישורים משתמשת ב-TLS הדדי (mTLS) כדי לאמת גם את הלקוח וגם את השרת במהלך לחיצת יד ב-TLS. במהלך התהליך הזה, קשירת mTLS משלבת מדיניות שמבוססת על הקשר של התעבורה, ומשתמשת במצב של אישור הלקוח בתוך סשן ה-TLS כדי לקבל החלטות לגבי הרשאות.
באיחוד זהויות של עומסי עבודה עם X.509, קישור mTLS מבטיח שכל תהליך האימות קשור בצורה מאובטחת לעומס עבודה מהימן. השיטה הזו מצמצמת את הסיכון לגניבת פרטי כניסה, כי האימות קשור לנקודת קצה ספציפית ומהימנה.
סקירה כללית של הגדרת גישה מבוססת-אישורים לאיחוד זהויות של עומסי עבודה
בהמשך מפורטת סקירה כללית של התהליך להגדרת גישה מבוססת-אישורים לאיחוד זהויות של עומסי עבודה:
מגדירים איחוד שירותי אימות הזהות של עומסי עבודה על ידי הגדרת אמון עם נקודת האמון של אישורי X.509.
יוצרים רמת גישה לגישה שמבוססת על אישורים.
מוסיפים את רמת הגישה למדיניות של בקרת גישה מבוססת-הקשר שמחייבת את קישור mTLS.
לפני שמתחילים
ודאו שמתקיימות הדרישות המוקדמות הבאות:
הגרסה העדכנית של Google Cloud CLI
כדי לעדכן לגרסה האחרונה של Google Cloud CLI, מריצים את הפקודה הבאה:
gcloud components updateאם אתם צריכים להתקין את Google Cloud CLI, תוכלו להיעזר במאמר בנושא התקנת Google Cloud CLI.
הגדרת איחוד זהויות של עומסי עבודה שמשתמשת בישות עוגן אמינה של אישורי X.509
כדי להשתמש בתכונה הזו, צריך למלא את הטופס הבא כדי להוסיף אתכם לרשימת ההיתרים: טופס בקשה להוספה לרשימת ההיתרים. ניצור איתכם קשר אחרי שנוסיף אתכם לרשימת ההיתרים.
יצירת רמת גישה לתעודות
יוצרים רמת גישה של mTLS. רמת הגישה mTLS מאמתת אישורים כשקובעת גישה למשאבים.
המסוף
ב-Access Context Manager, יוצרים רמת גישה בהתאמה אישית ומזינים את הביטוי הבא בשדה הביטוי CEL:
request.auth.matchesMtlsTokens(origin) == true.gcloud
כדי ליצור רמת גישה בהתאמה אישית, מריצים את הפקודה הבאה:
gcloud access-context-manager levels create ACCESS_LEVEL_NAME \ --title=TITLE \ --custom-level-spec=FILE \ --description=DESCRIPTION \ --policy=POLICY_NAME
מחליפים את מה שכתוב בשדות הבאים:
-
ACCESS_LEVEL_NAME: השם של רמת הגישה. -
TITLE: השם של רמת הגישה. -
FILE: קובץ YAML עם התוכן הבא:expression: "request.auth.matchesMtlsTokens(origin) == true". -
DESCRIPTION: תיאור של רמת הגישה. POLICY_NAME: השם של מדיניות הגישה.
-
מייצאים את רמת הגישה שיצרתם למשתנה סביבה. המשתנה הזה ישמש אתכם בשלבים הבאים.
export ACCESS_LEVEL_ID=ACCESS_LEVEL_ID
מחליפים את
ACCESS_LEVEL_IDבשם של רמת הגישה – לדוגמה,accessPolicies/12345/accessLevels/acl_1.
יצירת קישור של בקרת גישה מבוססת-הקשר למאגר זהויות של עומסי עבודה
מגדירים את משתני הסביבה הבאים.
export ORG_ID=ORG_ID export CALLER_PROJECT_ID=CALLER_PROJECT_ID export FEDERATED_PRINCIPAL=FEDERATED_PRINCIPAL
מחליפים את מה שכתוב בשדות הבאים:
-
ORG_ID: מזהה הארגון. -
CALLER_PROJECT_ID: מזהה הפרויקט שבו רוצים להשתמש כדי לקרוא ל-API.
FEDERATED_PRINCIPAL: השם של הישות המורשית של הזהות במאגר זהויות של עומסי עבודה שתואם למדיניות של בקרת גישה מבוססת-הקשר. אפשר לבחור באחת מהאפשרויות הבאות:זהות אחת בפורמט –
principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT_ATTRIBUTE_VALUEאו
כל הזהויות במאגר בפורמט –
principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/*
gcloud
gcloud alpha access-context-manager cloud-bindings create \ --organization=
ORG_ID\ --federated-principal=FEDERATED_PRINCIPAL\ --level=ACCESS_LEVEL_ID--dry-run-level=DRY_RUN_ACCESS_LEVEL_IDמחליפים את מה שכתוב בשדות הבאים:
-
ACCESS_LEVEL_ID: שם רמת הגישה. -
DRY_RUN_ACCESS_LEVEL_ID: השם של רמת הגישה בהרצת סימולציה. מומלץ להפעיל קודם קישור מדיניות להרצה יבשה כדי להבין את ההשפעה הפוטנציאלית על התנועה הקיימת.
curl
יוצרים קובץ JSON עם הקישור של בקרת הגישה מבוססת-הקשר.
אפשר לציין רק רמת גישה אחת בבקשה, גם אם השדה חוזר על עצמו. אפשר להשתמש בסוגים הבאים של חשבונות משתמשים מאוחדים:
- זהות יחידה:
principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT_ATTRIBUTE_VALUE - כל הזהויות במאגר:
principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/*
echo { \ \"principal\": { \ \"federatedPrincipal\": \"${FEDERATED_PRINCIPAL:?}\" \ },\ \"accessLevels\": [\"${ACCESS_LEVEL_ID:?}\"] \ } \ >> request.json- זהות יחידה:
משתמשים ב-
curlכדי לשלוח את בקשת ה-HTTP הבאה.curl -H "X-Goog-User-Project: ${CALLER_PROJECT_ID:?}" -X POST \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "Content-Type: application/json; charset=utf-8" \ -d @request.json \ "https://accesscontextmanager.googleapis.com/v1alpha/organizations/${ORG_ID:?}/gcpUserAccessBindings"
-
הרשאה באמצעות Google Cloud ספריות לקוח
כדי לתת הרשאה לעומסי עבודה של איחוד שירותי אימות הזהות של כוח העבודה באמצעות ספריות הלקוח שלGoogle Cloud , מבצעים את השלבים הבאים.
יוצרים קובץ Application Default Credentials (ADC) שמוגדר לאימות באמצעות איחוד שירותי אימות הזהות של כוח העבודה.
gcloud iam workload-identity-pools create-cred-config IDENTITY_POOL_ID \ --credential-cert-path WORKLOAD_CERTIFICATE_PATH \ --credential-cert-private-key-path WORKLOAD_KEY_PATH \ --output-file ADC_FILE_OUTPUT_PATH
מחליפים את מה שכתוב בשדות הבאים:
-
IDENTITY_POOL_ID: המזהה של מאגר הזהויות של עומסי עבודה. -
WORKLOAD_CERTIFICATE_PATH: הנתיב לקובץ האישור של עומס העבודה. -
WORKLOAD_KEY_PATH: הנתיב לקובץ של המפתח הפרטי של עומס העבודה. -
ADC_FILE_OUTPUT_PATH: נתיב הפלט של קובץ ה-ADC.
הפקודה הזו יוצרת גם קובץ הגדרות של אישור בספריית ברירת המחדל של ההגדרות האישיות ב-CLI של gcloud. קובץ ההגדרות של האישור תומך באימות ראשוני ומבסס לחיצות ידיים של mTLS לבקשות הבאות למשאבי Google Cloud .
-
מגדירים משתנה סביבה שיצביע על קובץ ה-ADC. כך ספריות הלקוח של Google יוכלו לגלות את פרטי הכניסה שלכם.
export GOOGLE_APPLICATION_CREDENTIALS=${application_default_credentials.json}השלב הזה הוא אופציונלי אם משמיטים את הארגומנט
--output-fileכשיוצרים את קובץ ה-ADC. אם לא מציינים את הארגומנט, קובץ ה-ADC נוצר ונקרא מספריית ברירת המחדל של ההגדרות האישיות ב-CLI של gcloud.התכונה תומכת בספריות לקוח ב-Go, ב-Python וב-Java. כדי להפעיל mTLS עבור Python ו-Java, צריך להגדיר את משתנה הסביבה.
כדי להגדיר ולבדוק במהירות את הגישה ל-API באמצעות mTLS, אפשר להשתמש בדוגמאות הקוד הבאות. Google Cloud
המשך
משתמשים בדוגמה הבאה כדי ליצור קובץ Go, כמו
golang_test.go.package golang_test import ( "io" "log" "testing" "cloud.google.com/go/auth/credentials" "cloud.google.com/go/auth/httptransport" ) func TestGoExample(t *testing.T) { scopes := []string{ "https://www.googleapis.com/auth/pubsub", // Scope for Pub/Sub access // Add other scopes as needed } dopts := credentials.DetectOptions{ Scopes: scopes, } // Create httptransport.Options with the scopes opts := &httptransport.Options{ DetectOpts: &dopts, } hc, err := httptransport.NewClient(opts) if err != nil { t.Fatalf("NewHTTPClient: %v", err) } resp, err := hc.Get("https://pubsub.mtls.googleapis.com/v1/projects/PROJECT_ID/topics") if err != nil { t.Fatalf("Get: %v", err) } t.Logf("Status: %s", resp.Status) t.Cleanup(func() { resp.Body.Close() }) b, err := io.ReadAll(resp.Body) if err != nil { t.Fatal(err) } log.Println(string(b)) }מחליפים את PROJECT_ID במזהה הפרויקט ב-CLI של gcloud.
כדי להריץ בדיקה במכונת VM ב-Compute Engine, משתמשים בפקודה הבאה.
go mod init example.com go mod tidy go test -v golang_test.go --count=1Python
משתמשים בדוגמה הבאה כדי ליצור קובץ בדיקה, כמו
python_test.py.import google.auth import google.auth.transport.requests import requests def test_go_example(): # Define the required scopes for your application scopes = [ "https://www.googleapis.com/auth/pubsub", # Scope for Pub/Sub access # Add other scopes as needed ] # Obtain Application Default Credentials (ADC) with the specified scopes credentials, _ = google.auth.default(scopes=scopes) # Create an authorized HTTP session using the ADC credentials authed_session = google.auth.transport.requests.AuthorizedSession(credentials) try: # Make a GET request to the Pub/Sub API endpoint response = authed_session.get( "https://pubsub.mtls.googleapis.com/v1/projects/PROJECT_ID/topics" ) # Check if the request was successful response.raise_for_status() # Raise an exception for error statuses # Log the response status and content print(f"Status: {response.status_code}") print(response.text) except requests.exceptions.RequestException as e: print(f"Error making the request: {e}") if __name__ == "__main__": test_go_example()מחליפים את PROJECT_ID במזהה הפרויקט ב-CLI של gcloud.
כדי להריץ בדיקה במכונה וירטואלית ב-Compute Engine, פועלים לפי השלבים הבאים.
- מגדירים סביבה וירטואלית של Python.
מתקינים את הספריות הנדרשות.
pip install google-auth google-auth-httplib2 requestsמריצים את הבדיקה:
python3 python_test.py
הרשאה באמצעות בקשות HTTP רגילות
כדי לתת הרשאה לעומסי עבודה של איחוד שירותי אימות הזהות של כוח העבודה באמצעות בקשות HTTP פשוטות, פועלים לפי השלבים הבאים.
קבלת אסימון גישה שמשויך לאישור מ- Google Cloud Security Token Service באמצעות לחיצת יד רגילה של mTLS.
קוראים לשירותים Google Cloud עם אסימון הגישה שקיבלתם מ-Security Token Service. בדוגמה הזו מתבצעת שאילתה ב-Cloud Storage.
$ curl --key ${workload_key.pem} --cert ${workload_cert.pem} -X GET 'https://storage.mtls.googleapis.com/{replace_with_your_resources}' -H "Authorization: Bearer $ACCESS_TOKEN"הקישור mTLS אוכף את השימוש ב-mTLS. מריצים את הפקודה הבאה כדי לוודא שחיבור שאינו mTLS נכשל עם שגיאת הרשאה.
$ curl -X GET 'https://storage.googleapis.com/{replace_with_your_resources}' -H "Authorization: Bearer $ACCESS_TOKEN"
הצגת קישור המדיניות
כדי להציג את מדיניות הקישור לאיחוד שירותי אימות הזהויות של עומסי עבודה, מריצים את הפקודה הבאה.
gcloud
הפקודה הבאה מציגה רשימה של קשירות ספציפיות בארגון נתון, ומסננת את הקשירות שחלות על ישויות משנה מאוחדות.
gcloud alpha access-context-manager cloud-bindings list \
--organization=ORG_ID \
--filter='principal:federatedPrincipal'
curl
curl -H "X-Goog-User-Project: ${CALLER_PROJECT_ID:?}" -X GET \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
"https://accesscontextmanager.googleapis.com/v1alpha/organizations/${ORG_ID:?}/gcpUserAccessBindings?filter=principal%3Afederated_principal"
עדכון של קישור מדיניות
כדי לעדכן קישור למדיניות, מוסיפים את רמת הגישה החדשה לקובץ JSON ומריצים את הפקודה הבאה.
gcloud
gcloud alpha access-context-manager cloud-bindings update \ --binding=BINDING_ID\ --level=NEW_ACCESS_LEVEL_ID
curl
curl -H "X-Goog-User-Project: ${CALLER_PROJECT_ID:?}" -X PATCH \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://accesscontextmanager.googleapis.com/v1alpha/organizations/${ORG_ID:?}/gcpUserAccessBindings/${BINDING_ID:?}?updateMask=access_levels"
מחיקת קישור מדיניות
כדי למחוק קישור למדיניות, מריצים את הפקודה הבאה.
gcloud
gcloud alpha access-context-manager cloud-bindings delete \
--binding=BINDING_ID
curl
curl -H "X-Goog-User-Project: ${CALLER_PROJECT_ID:?}" -X DELETE \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
"https://accesscontextmanager.googleapis.com/v1alpha/organizations/${ORG_ID:?}/gcpUserAccessBindings/${BINDING_ID:?}"
פתרון בעיות
ריכזנו כאן כמה בעיות נפוצות והצעות לפתרונות:
שגיאה:
403 Forbidden, user does not have permission.פעולה: בודקים את מדיניות IAM כדי לוודא שלמאגר הזהויות של עומסי העבודה יש גישה למשאב Google Cloud .
שגיאה:
Unauthorized_client: Could not obtain a value for google.subject from the given credential.פעולה: ה-backend לא הצליח לחלץ ערך עבור
google.subjectמאישור הלקוח על סמך מיפוי המאפיינים. בודקים את אישור הלקוח כדי לוודא שלשדה שמשמש למיפוי יש ערך.אם נתקלתם בדחיות גישה לא צפויות אחרי הפעלת בקרת גישה מבוססת-הקשר, אתם יכולים לבטל את החסימה של התנועה במהירות על ידי הסרת הקישור של בקרת הגישה מבוססת-הקשר באמצעות הפקודה הבאה:
gcloud alpha access-context-manager cloud-bindings deleteאחרי שמשחזרים את הגישה, בודקים את יומן הביקורת כדי להבין למה הבקשות נדחו.