אימות באמצעות איחוד שירותי אימות הזהות של כוח העבודה

בדף הזה מוסבר איך להגדיר ולהשתמש באיחוד שירותי אימות הזהות של כוח עבודה (שנקרא גם אימות IAM של צד שלישי) עם Cloud SQL. איחוד שירותי אימות הזהות של כוח עבודה מאפשר לכם להשתמש בספק הזהויות (IdP) הקיים שלכם, כמו Microsoft Active Directory או Okta, כדי לגשת למכונות Cloud SQL בלי צורך בחשבון Google .

היתרונות העיקריים של השימוש באיחוד שירותי אימות הזהות של כוח העבודה:

  • פחות תקורה: אין צורך לאמת דומיינים או לסנכרן זהויות עם Cloud Identity.
  • אבטחה משופרת: ניהול מרכזי של הגישה למסד הנתונים באמצעות ה-IdP הקיים של הארגון.
  • קלות בהרחבה: מתאים לארגונים גדולים עם צרכים מורכבים של ניהול זהויות.

לתיאור מפורט של איחוד שירותי אימות הזהות של כוח עבודה, קראו את הסקירה הכללית על איחוד שירותי אימות הזהות של כוח עבודה.

איך זה עובד

איחוד שירותי אימות הזהות של כוח עבודה מאפשר למשתמשים לאמת את הזהות שלהם ב- Google Cloud באמצעות זהות חיצונית. ב-Cloud SQL, המשמעות היא שחשבונות משתמשים ממאגר כוח עבודה יכולים להתחבר למכונות של Cloud SQL ל-PostgreSQL.

ב-Cloud SQL יש תמיכה באיחוד שירותי אימות הזהות של כוח העבודה באמצעות סוג המשתמש CLOUD_IAM_WORKFORCE_IDENTITY. כדי לתת גישה, Cloud SQL מאמת את פרטי הכניסה של כוח העבודה ואת הרשאת ה-IAM ברמת הפרויקט במהלך ההתחברות.

לפני שמתחילים

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

תפקידים והרשאות

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

להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.

יכול להיות שאפשר לקבל את ההרשאות הנדרשות גם באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש.

הגדרת אימות באמצעות איחוד שירותי אימות הזהות של כוח העבודה

בקטעים הבאים מוסבר איך להגדיר את המכונה כך שתשתמש באימות של איחוד שירותי אימות הזהות של כוח עבודה.

הפעלת אימות IAM במכונה

כדי להפעיל אימות ב-IAM, מגדירים את הדגל cloudsql.iam_authentication לערך on.

המסוף

  1. נכנסים לדף Cloud SQL Instances במסוף Google Cloud .

    כניסה לדף Cloud SQL Instances

  2. כדי לפתוח את הדף Overview של מכונה, לוחצים על שם המכונה.
  3. לוחצים על Edit.
  4. מרחיבים את הקטע Customize your instance.
  5. מרחיבים את הקטע Connections.
  6. בקטע Security, מסמנים את התיבה Enable Cloud SQL IAM authentication.
  7. לוחצים על Save.

gcloud

כדי להפעיל אימות IAM, משתמשים בפקודה הבאה:

gcloud sql instances patch INSTANCE_NAME \
    --database-flags=cloudsql.iam_authentication=on
  

מחליפים את INSTANCE_NAME בשם המכונה.

Terraform

מוסיפים את הבלוק database_flags למשאב google_sql_database_instance:

resource "google_sql_database_instance" "instance" {
  name             = "INSTANCE_NAME"
  database_version = "POSTGRES_15"
  region           = "REGION"

  settings {
    tier = "db-f1-micro"
    database_flags {
      name  = "cloudsql.iam_authentication"
      value = "on"
    }
  }
}
  

מחליפים את מה שכתוב בשדות הבאים:

  • ‫INSTANCE_NAME: שם המכונה.
  • ‫REGION: האזור שבו נמצא המכונה.

REST v1

לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:

  • ‫PROJECT_ID: מזהה הפרויקט
  • ‫LOCATION_ID: מזהה המיקום
  • ‫INSTANCE_ID: מזהה המכונה הרצוי
  • ‫REGION: האזור הרצוי
  • ‫DATABASE_VERSION: מחרוזת של טיפוסים בני מנייה (enum) של גרסת מסד הנתונים. לדוגמה: POSTGRES_12
  • ‫PASSWORD: הסיסמה של משתמש ה-root
  • ‫MACHINE_TYPE: מחרוזת enum של סוג המכונה (רמה), למשל: db-custom-[CPUS]-[MEMORY_MBS]

ה-method של ה-HTTP וכתובת ה-URL:

POST https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/instances

תוכן בקשת JSON:

{
  "name": "INSTANCE_ID",
  "region": "REGION",
  "databaseVersion": "DATABASE_VERSION",
  "rootPassword": "PASSWORD",
  "settings": {
    "tier": "MACHINE_TYPE",
    "backupConfiguration": {
      "enabled": true
    }
    "databaseFlags":
    [
      {
        "name": "cloudsql.iam_authentication",
        "value": "on"
      }
    ]
  }
}

כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:

אתם אמורים לקבל תגובת JSON שדומה לזו:

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID",
  "status": "PENDING",
  "user": "user@example.com",
  "insertTime": "2020-01-01T19:13:21.834Z",
  "operationType": "CREATE",
  "name": "OPERATION_ID",
  "targetId": "INSTANCE_ID",
  "selfLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/operations/OPERATION_ID",
  "targetProject": "PROJECT_ID"
}

‫REST v1beta4

לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:

  • ‫PROJECT_ID: מזהה הפרויקט
  • ‫LOCATION_ID: מזהה המיקום
  • ‫INSTANCE_ID: מזהה המכונה הרצוי
  • ‫REGION: האזור הרצוי
  • ‫DATABASE_VERSION: מחרוזת של טיפוסים בני מנייה (enum) של גרסת מסד הנתונים. לדוגמה: POSTGRES_12
  • ‫PASSWORD: הסיסמה של משתמש ה-root
  • ‫MACHINE_TYPE: מחרוזת enum של סוג המכונה (רמה), למשל: db-custom-[CPUS]-[MEMORY_MBS]

ה-method של ה-HTTP וכתובת ה-URL:

POST https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/locations/LOCATION_ID/instances

תוכן בקשת JSON:

{
  "name": "INSTANCE_ID",
  "region": "REGION",
  "databaseVersion": "DATABASE_VERSION",
  "rootPassword": "PASSWORD",
  "settings": {
    "tier": "MACHINE_TYPE",
    "backupConfiguration": {
      "enabled": true
    }
    "databaseFlags":
    [
      {
        "name": "cloudsql.iam_authentication",
        "value": "on"
      }
    ]
  }
}

כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:

אתם אמורים לקבל תגובת JSON שדומה לזו:

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID",
  "status": "PENDING",
  "user": "user@example.com",
  "insertTime": "2020-01-01T19:13:21.834Z",
  "operationType": "CREATE",
  "name": "OPERATION_ID",
  "targetId": "INSTANCE_ID",
  "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/operations/OPERATION_ID",
  "targetProject": "PROJECT_ID"
}

הוספת המשתמש של איחוד שירותי אימות הזהות של כוח העבודה למכונה

מוסיפים את חשבון המשתמש החיצוני למכונה באמצעות הסוג CLOUD_IAM_WORKFORCE_IDENTITY.

חשוב לוודא שמזהה המשתמש שבו אתם משתמשים תואם לערך שסופק על ידי מיפוי המאפיינים מספק הזהויות של כוח העבודה. בדרך כלל, המזהה הזה מוגדר ככתובת אימייל, לדוגמה cruz@example.com.

המסוף

  1. נכנסים לדף Cloud SQL Instances במסוף Google Cloud .

    כניסה לדף Cloud SQL Instances

  2. כדי לפתוח את הדף Overview של מכונה, לוחצים על שם המכונה.
  3. בתפריט הניווט של SQL, לוחצים על Users.
  4. לוחצים על הוספת חשבון משתמש. נפתח החלון Add a user account to instance INSTANCE_NAME.
  5. בוחרים באפשרות איחוד שירותי אימות הזהות של כוח עבודה.
  6. בשדה Workforce user, מזינים את מזהה המשתמש שרוצים להוסיף.
  7. לוחצים על הוספה.

gcloud

מריצים את הפקודה הבאה כדי ליצור את המשתמש:

gcloud sql users create USER_ID \
    --instance=INSTANCE_NAME \
    --type=CLOUD_IAM_WORKFORCE_IDENTITY
  

מחליפים את מה שכתוב בשדות הבאים:

  • ‫USER_ID: מזהה המשתמש שרוצים להוסיף, לדוגמה cruz@example.com.
  • ‫INSTANCE_NAME: שם המכונה.

Terraform

משתמשים במשאב google_sql_user כדי להגדיר את המשתמש של כוח העבודה:

resource "google_sql_user" "workforce_user" {
  name     = "USER_ID" # e.g., "cruz@example.com"
  instance = "INSTANCE_NAME"
  type     = "CLOUD_IAM_WORKFORCE_IDENTITY"
}
  

מחליפים את מה שכתוב בשדות הבאים:

  • ‫USER_ID: מזהה המשתמש שרוצים להוסיף, לדוגמה cruz@example.com.
  • ‫INSTANCE_NAME: שם המכונה.

REST v1

יצירה של חשבון משתמש

לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:

  • ‫PROJECT_ID: מזהה הפרויקט
  • ‫INSTANCE_ID: מזהה המכונה שאליה מוסיפים את המשתמש
  • USERNAME: כתובת האימייל של המשתמש

ה-method של ה-HTTP וכתובת ה-URL:

POST https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID/users

תוכן בקשת JSON:

{
  "name": "USERNAME",
  "type": "CLOUD_IAM_WORKFORCE_IDENTITY"
}

כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:

אתם אמורים לקבל תגובת JSON שדומה לזו:

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID",
  "status": "DONE",
  "user": "user@example.com",
  "insertTime": "2020-02-07T22:44:16.656Z",
  "startTime": "2020-02-07T22:44:16.686Z",
  "endTime": "2020-02-07T22:44:20.437Z",
  "operationType": "CREATE_USER",
  "name": "OPERATION_ID",
  "targetId": "INSTANCE_ID",
  "selfLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/operations/OPERATION_ID",
  "targetProject": "PROJECT_ID"
}

‫REST v1beta4

יצירה של חשבון משתמש

לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:

  • ‫PROJECT_ID: מזהה הפרויקט
  • ‫INSTANCE_ID: מזהה המכונה שאליה מוסיפים את המשתמש
  • USERNAME: כתובת האימייל של המשתמש

ה-method של ה-HTTP וכתובת ה-URL:

POST https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID/users

תוכן בקשת JSON:

{
  "name": "USERNAME",
  "type": "CLOUD_IAM_WORKFORCE_IDENTITY"
  }

כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:

אתם אמורים לקבל תגובת JSON שדומה לזו:

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID",
  "status": "DONE",
  "user": "user@example.com",
  "insertTime": "2020-02-07T22:44:16.656Z",
  "startTime": "2020-02-07T22:44:16.686Z",
  "endTime": "2020-02-07T22:44:20.437Z",
  "operationType": "CREATE_USER",
  "name": "OPERATION_ID",
  "targetId": "INSTANCE_ID",
  "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/operations/OPERATION_ID",
  "targetProject": "PROJECT_ID"
}

הקצאת תפקיד משתמש במכונה

מקצים את התפקיד roles/cloudsql.instanceUser לחשבון הראשי של זהות כוח העבודה או למאגר כולו.

המסוף

  1. נכנסים לדף Service accounts במסוף Google Cloud .

    כניסה לדף IAM

  2. לוחצים על הענקת גישה.
  3. בשדה New principals, מבצעים אחת מהפעולות הבאות:

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

      principal://iam.googleapis.com/locations/global/workforcePools/POOL_ID/subject/USER_ID

    • כדי לתת גישה לכל המאגר, מזינים את מאגר כוח העבודה בתור principalSet:

      principalSet://iam.googleapis.com/locations/global/workforcePools/POOL_ID/*

  4. ברשימה Role, בוחרים באפשרות Cloud SQL > Cloud SQL Instance User.
  5. אופציונלי: אם רוצים להתחבר באמצעות Cloud SQL Auth Proxy או מחברי השפה של Cloud SQL, לוחצים על Add another role ובוחרים באפשרות Cloud SQL > Cloud SQL Client.
  6. לוחצים על Save.

gcloud

כדי לתת גישה למשתמש ספציפי, משתמשים בפקודה gcloud projects add-iam-policy-binding:

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member="principal://iam.googleapis.com/locations/global/workforcePools/POOL_ID/subject/USER_ID" \
    --role="roles/cloudsql.instanceUser"
  

מחליפים את מה שכתוב בשדות הבאים:

  • ‫USER_ID: מזהה המשתמש שרוצים להוסיף, לדוגמה cruz@example.com.
  • ‫POOL_ID: מזהה המאגר של כוח העבודה.
  • ‫PROJECT_ID: מזהה הפרויקט שמכיל את המכונה.

כדי לתת גישה לכל מאגר כוח העבודה, משתמשים בפקודה gcloud projects add-iam-policy-binding עם פורמט החבר principalSet:

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member="principalSet://iam.googleapis.com/locations/global/workforcePools/POOL_ID/*" \
    --role="roles/cloudsql.instanceUser"
  

Terraform

משתמשים במשאב google_project_iam_member כדי להקצות את התפקיד לחשבון הראשי של כוח העבודה:

resource "google_project_iam_member" "workforce_user_iam" {
  project = "PROJECT_ID"
  role    = "roles/cloudsql.instanceUser"
  member  = "principal://iam.googleapis.com/locations/global/workforcePools/POOL_ID/subject/USER_ID"
}
  

מחליפים את מה שכתוב בשדות הבאים:

  • ‫USER_ID: מזהה המשתמש שרוצים להוסיף, לדוגמה cruz@example.com.
  • ‫POOL_ID: מזהה המאגר של כוח העבודה.
  • ‫PROJECT_ID: מזהה הפרויקט שמכיל את המכונה.

REST

כדי להקצות מדיניות IAM באמצעות ה-API, מאחזרים את מדיניות ה-IAM של הפרויקט באמצעות ה-method‏ getIamPolicy. לאחר מכן, מוסיפים את הקישור החדש למדיניות, ולבסוף מחילים את המדיניות המעודכנת באמצעות השיטה setIamPolicy.

המטען הייעודי (payload) הבא הוא דוגמה לקישור שצריך לצרף למדיניות ה-IAM:

{
  "bindings": [
    {
      "role": "roles/cloudsql.instanceUser",
      "members": [
        "principal://iam.googleapis.com/locations/global/workforcePools/POOL_ID/subject/USER_ID"
      ]
    }
  ]
}
  

מחליפים את מה שכתוב בשדות הבאים:

  • ‫USER_ID: מזהה המשתמש שרוצים להוסיף, לדוגמה cruz@example.com.
  • ‫POOL_ID: מזהה המאגר של כוח העבודה.

מתן הרשאות למסד הנתונים

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

לדוגמה, כדי להעניק הרשאות באופן ידני:

GRANT SELECT ON TABLE_NAME TO "USER_ID";

מחליפים את מה שכתוב בשדות הבאים:

  • ‫TABLE_NAME: שם הטבלה במסד הנתונים.
  • ‫USER_ID: מזהה המשתמש של המשתמש במסד הנתונים של מאגר הזהויות של כוח העבודה, לדוגמה cruz@example.com.

התחברות למכונה

עכשיו אפשר להתחבר למכונה באמצעות ה-CLI של gcloud או Cloud SQL Auth Proxy.

שימוש ב-CLI של gcloud

כדי ליצור אסימון התחברות, קודם צריך לבצע אימות באמצעות זהות כוח העבודה.

  1. כדי לאמת באמצעות איחוד שירותי אימות הזהות של כוח עבודה, משתמשים בפקודה gcloud auth login עם הדגל --cred-file:

    gcloud auth login --cred-file=CONFIGURATION_FILE
    

    מחליפים את CONFIGURATION_FILE בנתיב לקובץ התצורה שנוצר בשביל ספק הזהויות של כוח העבודה.

  2. כדי להתחבר באמצעות טוקן שנוצר, מריצים את הפקודה הבאה:

    bash export PGPASSWORD=$(gcloud sql generate-login-token) psql "host=INSTANCE_IP user=USER_ID \ dbname=DB_NAME sslmode=require"

    מחליפים את מה שכתוב בשדות הבאים:

  3. ‫INSTANCE_IP: כתובת ה-IP של המכונה ב-Cloud SQL.

  4. ‫USER_ID: מזהה המשתמש של המשתמש בכוח העבודה, לדוגמה cruz@example.com.

  5. ‫DB_NAME: שם מסד הנתונים שאליו רוצים להתחבר.

שימוש ב-Cloud SQL Auth Proxy

מפעילים את שרת ה-proxy עם הדגל --auto-iam-authn:

./cloud-sql-proxy INSTANCE_CONNECTION_NAME --auto-iam-authn

מידע נוסף על שרת ה-proxy זמין במאמר מידע על Cloud SQL Auth Proxy.

הגבלות ומגבלות

  • מזהה משתמש כפול במאגרים: Cloud SQL לא יכול להבחין בין נושאים עם אותו מזהה משתמש במאגרים שונים של כוח עבודה או בספקי זהויות שונים. אם אתם משתמשים בכמה מאגרים או ספקים של כוח עבודה, אתם צריכים להשתמש בכללי מדיניות של IAM כדי לוודא שאתם לא נותנים את הרשאת ההתחברות של roles/cloudsql.instanceUser לשמות נושאים כפולים ממאגרים או מספקים שונים. כך אפשר למנוע גישה לא מורשית ממאגר או מספק אחר עם אותו מזהה משתמש.
  • מכסת התחברויות: יש מכסה של 12,000 התחברויות לדקה לכל מכונה, כולל ניסיונות התחברות שהצליחו וניסיונות שנכשלו. אם חורגים מהמכסה, אי אפשר להתחבר באופן זמני. מומלץ להימנע מהתחברויות תכופות ולהגביל את ההתחברויות באמצעות רשתות מורשות.

המאמרים הבאים