במסמך הזה מוסבר איך להגדיר גישה מבוססת-אישורים לאיחוד שירותי אימות הזהות של עומסי עבודה באמצעות אישורי X.509.
בגישה שמבוססת על אישורים, נעשה שימוש ב-Mutual TLS (mTLS) כדי לאמת גם את הלקוח וגם את השרת במהלך לחיצת יד בפרוטוקול TLS. בתהליך הזה, קישור mTLS משלב כללי מדיניות שמבוססים על הקשר התעבורה, ומשתמש במצב של אישור הלקוח בסשן ה-TLS כדי לקבל החלטות לגבי הרשאות.
באיחוד שירותי אימות הזהות של עומסי עבודה ב-X.509, קישור mTLS מבטיח שכל תהליך האימות מקושר באופן מאובטח לעומס עבודה מהימן. כך אפשר לצמצם את הסיכון לגניבת פרטי כניסה, כי המערכת מקשרת את האימות לנקודת קצה ספציפית ומהימנה.
סקירה כללית על הגדרת גישה מבוססת-אישורים לאיחוד שירותי אימות הזהות של עומסי עבודה
כאן מופיעה סקירה כללית ברמה גבוהה של התהליך להגדרת גישה מבוססת-אישורים לאיחוד שירותי אימות הזהות של עומסי עבודה:
מגדירים את איחוד שירותי אימות הזהות של עומסי עבודה באמצעות הגדרת יחסי אמון עם ישות העוגן האמינה של אישורי X.509.
יוצרים רמת גישה לגישה שמבוססת על אישורים.
מוסיפים את רמת הגישה למדיניות של בקרת גישה מבוססת-הקשר שאוכפת את הקישור ל-mTLS.
לפני שמתחילים
מוודאים שאתם עומדים בדרישות המוקדמות הבאות:
הגרסה העדכנית של Google Cloud CLI.
כדי לעדכן לגרסה העדכנית של ה-CLI של gcloud, מריצים את הפקודה הבאה:
gcloud components updateאם אתם צריכים להתקין את ה-CLI של gcloud, קראו את המאמר התקנת ה-CLI של gcloud.
הגדרת איחוד שירותי אימות הזהות של עומסי עבודה שמשתמשת בישות העוגן האמינה של אישורי 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/*
cat <<EOF > request.json { "principal": { "federatedPrincipal": "${FEDERATED_PRINCIPAL:?}" }, "accessLevels": ["${ACCESS_LEVEL_ID:?}"] } EOF- זהות אחת:
משתמשים ב-
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"
-
אישור באמצעות ספריות הלקוח של Cloud de Confiance by S3NS
כדי לאשר עומסי עבודה של איחוד שירותי אימות הזהות של עומסי עבודה באמצעות ספריות הלקוח שלCloud de Confiance , מבצעים את הפעולות הבאות:
יוצרים קובץ 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 לבקשות הבאות למשאבי Cloud de Confiance .
-
מגדירים משתנה סביבה שיצביע על קובץ ה-ADC, כדי שספריות הלקוח של Google יוכלו לזהות את פרטי הכניסה:
export GOOGLE_APPLICATION_CREDENTIALS=ADC_FILE_OUTPUT_PATH
השלב הזה הוא אופציונלי אם משמיטים את הארגומנט
--output-fileכשיוצרים את קובץ ה-ADC. אם לא תציינו את הארגומנט, ה-CLI של gcloud ייצור ויקרא את קובץ ה-ADC מספריית ברירת המחדל של ההגדרות האישיות של ה-CLI של gcloud.התכונה תומכת בספריות הלקוח ב-Go, ב-Python וב-Java. כדי להפעיל את mTLS ב-Python וב-Java, צריך להגדיר את משתנה הסביבה.
כדי להגדיר במהירות את הגישה ל-mTLS לממשקי ה-API של Cloud de Confiance ולבדוק אותה, אתם יכולים להשתמש בדוגמאות הקוד הבאות:
המשך
כדי ליצור קובץ 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במזהה הפרויקט ב-Cloud de Confiance .כדי להריץ בדיקה ב-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_python_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_python_example()מחליפים את
PROJECT_IDבמזהה הפרויקט ב-Cloud de Confiance .כדי להריץ בדיקה ב-Compute Engine VM:
- מגדירים סביבה וירטואלית של Python.
מתקינים את הספריות הנדרשות:
pip install google-auth google-auth-httplib2 requestsמריצים את הבדיקה:
python3 python_test.py
אישור באמצעות בקשות HTTP רגילות
כדי לאשר עומסי עבודה של איחוד שירותי אימות הזהות של עומסי עבודה באמצעות בקשות HTTP פשוטות, מבצעים את השלבים הבאים:
מקבלים אסימון גישה שקשור לאישור מ- Cloud de Confiance Security Token Service באמצעות לחיצת יד רגילה של mTLS.
שולחים קריאה לשירותי Cloud de Confiance באמצעות אסימון הגישה שקיבלתם מ-Security Token Service. הדוגמה הזו שולחת שאילתה ל-Cloud Storage:
curl --key WORKLOAD_KEY_PATH --cert WORKLOAD_CERTIFICATE_PATH \ -X GET "https://storage.mtls.googleapis.com/RESOURCE_PATH" \ -H "Authorization: Bearer $ACCESS_TOKEN"
הקישור של mTLS אוכף את השימוש ב-mTLS. מריצים את הפקודה הבאה כדי לוודא שחיבור שאינו mTLS נכשל עם שגיאת הרשאה:
curl -X GET "https://storage.googleapis.com/RESOURCE_PATH" \ -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"
עדכון של קישור מדיניות
כדי לעדכן קישור מדיניות, מבצעים את השלבים הבאים:
gcloud
gcloud alpha access-context-manager cloud-bindings update \ --binding=BINDING_ID\ --organization=ORG_ID\ --level=NEW_ACCESS_LEVEL_ID
curl
מוסיפים את רמת הגישה החדשה לקובץ request.json ומריצים את הפקודה הבאה:
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\ --organization=ORG_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:?}"