כדי לנתח ולפתור בעיות בניסיונות כושלים של אימות בניהול זהויות והרשאות גישה (IAM) כשמתחברים ל-AlloyDB ל-PostgreSQL, אתם יכולים לבדוק את יומני ההתראות של האימות ב-Logs Explorer.
כדי לזהות את הסיבה לניסיון אימות כושל שמבוסס על IAM, צריך לבצע את השלבים הבאים:
נכנסים לדף Logs Explorer במסוף Google Cloud :
ברשימה הנפתחת All resources, בוחרים באפשרות AlloyDB Instance.
בקטע Severity, לוחצים על Alert.
אם האפשרות Alert לא מופיעה, סימן שלא תועדו כשלים באימות בחלון הזמן שנבחר. יכול להיות שתצטרכו לשנות את החלון באמצעות אמצעי הבקרה של Logs Explorer.
בקטע Query results, בודקים אם אחת מההודעות הבאות מופיעה ברשומות ביומן:
Request had invalid authentication credentials.- טוקן הגישה לא תקין.
Caller does not have required permission to use project.- לחשבון המשתמש ב-IAM אין את התפקידים או ההרשאות הנדרשים ב-IAM. בהודעת השגיאה המלאה מצוינים התפקידים או ההרשאות שחסרים.
IAM principal does not match database user.חשבון המשתמש המאומת ב-IAM שצוין בטוקן הגישה לא תואם למשתמש במסד הנתונים שאליו אתם רוצים להתחבר.
כדי לראות את חשבון המשתמש שצוין באסימון, מריצים את הפקודה הבאה:
curl -H "Content-Type: application/x-www-form-urlencoded" \ -d "access_token=ACCESS_TOKEN" \ https://www.googleapis.com/oauth2/v1/tokeninfoמחליפים את
ACCESS_TOKENבאסימון הגישה מסוג OAuth 2.0.השגיאה הזו מתרחשת גם אם חשבון המשתמש המקוצר של חשבון השירות, שהוא כתובת האימייל ללא הסיומת
.gserviceaccount.com, ארוך מ-63 תווים.ב-PostgreSQL יש מגבלה של 63 תווים למזהי תפקידים ומזהי משתמשים. למרות ש-AlloyDB מאפשר ליצור את המשתמש, PostgreSQL מקצר את שם התפקיד ל-63 בייטים בקטלוג הפנימי. במהלך ההתחברות, שכבת האימות של IAM ב-AlloyDB משווה בין חשבון המשתמש המלא והלא מקוצר מהאסימון של OAuth לבין התפקיד המקוצר במסד הנתונים, וכתוצאה מכך יש חוסר התאמה במחרוזת.
פתרון עקיף: שימוש בהתחזות לחשבון שירות
אם אתם לא יכולים לקצר את שם חשבון השירות, אתם יכולים לעקוף את המגבלה הזו באמצעות התחזות לחשבון שירות. כך מפרידים בין הזהות שמריצה את עומס העבודה לבין הזהות שמשמשת לכניסה למסד הנתונים:
- יוצרים חשבון שירות של שרת proxy עם שם שבו חשבון המשתמש המקוצר, לא כולל הסיומת
.gserviceaccount.com, הוא באורך של 63 תווים או פחות, למשלdb-proxy@PROJECT_ID.iam.gserviceaccount.com. - מוסיפים את חשבון השירות של שרת ה-proxy לאשכול AlloyDB כמשתמש במסד הנתונים של
IAM_BASEDעם שם המשתמשdb-proxy@PROJECT_ID.iam. - ב-IAM, מקצים לחשבון השירות המקורי של עומס העבודה את התפקיד "יצירת אסימונים בחשבון שירות" (
roles/iam.serviceAccountTokenCreator) בחשבון השירות של שרת ה-proxy. - מגדירים את האפליקציה, את מחברי השפות ל-AlloyDB או את שרת ה-proxy לאימות ב-AlloyDB כך שיתחברו באמצעות זהות ה-proxy.
לדוגמה, אפשר להתחבר באמצעות הפקודה
gcloud beta alloydb connectעם הדגל--impersonate-service-account:gcloud beta alloydb connect INSTANCE_ID \ --cluster=CLUSTER_ID \ --region=REGION_ID \ --impersonate-service-account=PROXY_SERVICE_ACCOUNT_EMAIL \ --auto-iam-authnמחליפים את מה שכתוב בשדות הבאים:
-
INSTANCE_ID: המזהה של מכונת AlloyDB. -
CLUSTER_ID: המזהה של האשכול שמכיל את המכונה. -
REGION_ID: האזור שבו נמצא האשכול. -
PROXY_SERVICE_ACCOUNT_EMAIL: כתובת האימייל המלאה של חשבון השירות של שרת ה-proxy.
הערה: חשבון השירות המקורי לא צריך גישת התחברות ישירה למסד הנתונים, אלא רק הרשאה להתחזות לחשבון ה-proxy. חשבון השירות של שרת ה-proxy מחזיק בהרשאות של מסד הנתונים.
- יוצרים חשבון שירות של שרת proxy עם שם שבו חשבון המשתמש המקוצר, לא כולל הסיומת
Request had insufficient scopes.- טוקן הגישה לא מכיל את ההיקף
alloydb.loginאו את ההיקףcloud-platform. צריך לפחות אחד מהיקפי ההרשאות האלה.