פתרון בעיות באימות IAM

כדי לנתח ולפתור בעיות בניסיונות כושלים של אימות בניהול זהויות והרשאות גישה (IAM) כשמתחברים ל-AlloyDB ל-PostgreSQL, אתם יכולים לבדוק את יומני ההתראות של האימות ב-Logs Explorer.

כדי לזהות את הסיבה לניסיון אימות כושל שמבוסס על IAM, צריך לבצע את השלבים הבאים:

  1. נכנסים לדף Logs Explorer במסוף Google Cloud :

    כניסה לדף Logs Explorer

  2. ברשימה הנפתחת All resources, בוחרים באפשרות AlloyDB Instance.

  3. בקטע Severity, לוחצים על Alert.

    אם האפשרות Alert לא מופיעה, סימן שלא תועדו כשלים באימות בחלון הזמן שנבחר. יכול להיות שתצטרכו לשנות את החלון באמצעות אמצעי הבקרה של Logs Explorer.

  4. בקטע 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 לבין התפקיד המקוצר במסד הנתונים, וכתוצאה מכך יש חוסר התאמה במחרוזת.

    פתרון עקיף: שימוש בהתחזות לחשבון שירות

    אם אתם לא יכולים לקצר את שם חשבון השירות, אתם יכולים לעקוף את המגבלה הזו באמצעות התחזות לחשבון שירות. כך מפרידים בין הזהות שמריצה את עומס העבודה לבין הזהות שמשמשת לכניסה למסד הנתונים:

    1. יוצרים חשבון שירות של שרת proxy עם שם שבו חשבון המשתמש המקוצר, לא כולל הסיומת .gserviceaccount.com, הוא באורך של 63 תווים או פחות, למשל db-proxy@PROJECT_ID.iam.gserviceaccount.com.
    2. מוסיפים את חשבון השירות של שרת ה-proxy לאשכול AlloyDB כמשתמש במסד הנתונים של IAM_BASED עם שם המשתמש db-proxy@PROJECT_ID.iam.
    3. ב-IAM, מקצים לחשבון השירות המקורי של עומס העבודה את התפקיד "יצירת אסימונים בחשבון שירות" (roles/iam.serviceAccountTokenCreator) בחשבון השירות של שרת ה-proxy.
    4. מגדירים את האפליקציה, את מחברי השפות ל-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 מחזיק בהרשאות של מסד הנתונים.

    Request had insufficient scopes.
    טוקן הגישה לא מכיל את ההיקף alloydb.login או את ההיקף cloud-platform. צריך לפחות אחד מהיקפי ההרשאות האלה.