שימוש בתנאים ב-IAM

תנאי IAM מאפשרים להגדיר ולאכוף בקרת גישה מותנית למשאביGoogle Cloud , כולל מכונות Cloud SQL, על סמך מאפיינים. למידע נוסף על תנאי IAM, קראו את המאמר סקירה כללית של תנאי IAM.

מבוא

ב-Cloud SQL, אתם יכולים לאכוף גישה מותנית על סמך המאפיינים הבאים:

  • מאפייני תאריך/שעה: משמשים להגדרת גישה זמנית (עם תאריך תפוגה), מתוזמנת או לזמן מוגבל למשאבים של Cloud SQL. לדוגמה, אתם יכולים לאפשר למשתמש לגשת למכונה של מסד נתונים עד לתאריך מסוים. אפשר להשתמש במאפייני תאריך ושעה בכל רמה בהיררכיית המשאבים. למידע נוסף, קראו את המאמר הגדרת גישה זמנית.
  • מאפייני משאבים: משמשים להגדרת גישה מותנית על סמך תג, שם משאב, סוג משאב או מאפיין של שירות משאבים. ב-Cloud SQL, אתם יכולים להשתמש במאפיינים של מכונות של מסדי נתונים כדי להגדיר גישה מותנית. לדוגמה, אתם יכולים לאפשר למשתמש לגשת רק למכונות עם תג ספציפי. למידע נוסף, ראו הגדרת גישה מבוססת משאבים.

תרחישי שימוש לדוגמה:

  • לאפשר למשתמשים להתחבר למכונות ספציפיות.

  • לאפשר למשתמשים ליצור מכונות עם קידומות או סיומות ספציפיות (לדוגמה, "test").

  • הגבלת הגישה לפעולות גיבוי במכונות לבדיקה

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

  • לאפשר למשתמשים לבצע פעולות אדמין בתאריכים או בזמנים מסוימים.

מגבלות

תנאי IAM לא תומכים בפעולות במשאב users (הרשאות cloudsql.users.*) או במשאב databases (הרשאות cloudsql.databases.*) ב-Cloud SQL Admin API. ב-Cloud SQL, תנאים שמבוססים על משאבים תומכים רק בסוגי המשאבים sqladmin.googleapis.com/Instance ו-sqladmin.googleapis.com/BackupRun. אי אפשר להשתמש בתנאי IAM כדי להגביל את הגישה לפעולות של ניהול משתמשים (User API) או לפעולות של ניהול מסדי נתונים (Database API).

המשתמשים יכולים להתחבר למכונות ספציפיות

נניח שאתם רוצים לתת למשתמש או לחשבון שירות הרשאה להתחבר למכונה ספציפית אחת בלבד של Cloud SQL. אתם יכולים לכלול תנאי IAM בקישור של מדיניות ה-IAM שמעניק לחשבון הזה את ההרשאות של תפקיד Cloud SQL.

כברירת מחדל, התפקיד המוגדר מראש "לקוח Cloud SQL" (roles/cloudsql.client), שמכיל את ההרשאה cloudsql.instances.connect, מאפשר לחברים בו להתחבר לכל המכונות של Cloud SQL בפרויקט. אם מוסיפים תנאי IAM לקישור של המדיניות, אפשר לתת הרשאה רק למכונה שצוינה.

המסוף

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

בדוגמה הזו נעשה שימוש במשתנים הבאים:

  • ‫PROJECT_ID: הפרויקט ב- Google Cloud .
  • ‫INSTANCE_ID: שם המכונה שרוצים לתת גישה אליה.

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

    כניסה לדף IAM

  2. לוחצים על הוספה.
  3. בתיבת הקלט New Members, מזינים את כתובת האימייל של חשבון השירות.
  4. לוחצים על הרשימה הנפתחת Role ובוחרים בתפקיד Cloud SQL Client.
  5. לוחצים על הוספת תנאי.
  6. מזינים שם ותיאור.
  7. לוחצים על הכרטיסייה עורך התנאים.
  8. בקטע הכלי להגדרת תנאים:
    • בשדה Condition type - Resource - Name, מזינים projects/PROJECT_ID/instances/INSTANCE_ID
    • מוודאים שהתנאי AND נבחר.
    • בשדה Condition type - Resource - Service, בוחרים באפשרות sqladmin.googleapis.com.
  9. לוחצים על שמירה כדי לשמור את התנאי.
  10. לוחצים על שמירה כדי לשמור את המדיניות.

gcloud

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

בדוגמה הזו נעשה שימוש במשתנים הבאים:

  • ‫PROJECT_ID: הפרויקט ב- Google Cloud .
  • ‫INSTANCE_ID: שם המכונה שרוצים לתת גישה אליה.
  • ‫SERVICE_ACCOUNT_EMAIL: כתובת האימייל המלאה של חשבון השירות שאת הגישה שלו רוצים לשנות.

  1. מציגים את הקישורים הקיימים של מדיניות ה-IAM ומוציאים אותם לקובץ bindings.json:
  2. gcloud projects get-iam-policy PROJECT_ID --format=json > bindings.json
  3. מוסיפים את קישור התפקיד המותנה הבא לקובץ bindings.json:
    {
      "bindings": [
        {
          "role": "roles/cloudsql.client",
          "members": [
            "serviceAccount:SERVICE_ACCOUNT_EMAIL"
          ],
          "condition": {
            "expression": "resource.name == 'projects/PROJECT_ID/instances/INSTANCE_ID'
              && resource.service == 'sqladmin.googleapis.com'"
          }
        }
      ],
      "etag": "BwWKmjvelug=",
      "version": 3
    }
  4. מעדכנים את מדיניות ה-IAM באמצעות הקובץ החדש bindings.json.
    gcloud projects set-iam-policy PROJECT_ID bindings.json

Terraform

כדי לאפשר למשתמשים להתחבר למכונות ספציפיות, משתמשים במשאב נתונים של google_iam_policy ב-Terraform ובמשאב של google_project_iam_policy ב-Terraform.

data "google_iam_policy" "sql_iam_policy" {
  binding {
    role = "roles/cloudsql.client"
    members = [
      "serviceAccount:${google_project_service_identity.gcp_sa_cloud_sql.email}",
    ]
    condition {
      expression  = "resource.name == 'projects/${data.google_project.project.project_id}/instances/${google_sql_database_instance.default.name}' && resource.type == 'sqladmin.googleapis.com/Instance'"
      title       = "created"
      description = "Cloud SQL instance creation"
    }
  }
}

resource "google_project_iam_policy" "project" {
  project     = data.google_project.project.project_id
  policy_data = data.google_iam_policy.sql_iam_policy.policy_data
}

החלה של השינויים

כך מחילים את ההגדרות של Terraform בפרויקט ב- Google Cloud :

הכנת Cloud Shell

  1. מפעילים את Cloud Shell.
  2. מגדירים את פרויקט ברירת המחדל ב- Google Cloud שבו רוצים להחיל את ההגדרות של Terraform.

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

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

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

הכנת הספרייה

לכל קובץ תצורה של Terraform צריכה להיות ספרייה משלו (שנקראת גם מודול ברמה הבסיסית).

  1. יוצרים ספרייה חדשה ב-Cloud Shell ובה יוצרים קובץ חדש. שם הקובץ חייב לכלול את הסיומת .tf, למשל main.tf. במדריך הזה, הקובץ נקרא main.tf.
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. אם אתם עוקבים אחרי המדריך, תוכלו להעתיק את הקוד לדוגמה בכל קטע או שלב.

    מעתיקים את הקוד לדוגמה בקובץ main.tf החדש שיצרתם.

    לחלופין, אפשר גם להעתיק את הקוד מ-GitHub. כדאי לעשות את זה כשקטע הקוד של Terraform הוא חלק מפתרון מקצה לקצה.

  3. בודקים את הפרמטרים לדוגמה ומשנים אותם בהתאם לסביבה שלכם.
  4. שומרים את השינויים.
  5. מפעילים את Terraform. צריך לעשות זאת רק פעם אחת לכל ספרייה.
    terraform init

    אופציונלי: תוכלו לכלול את האפשרות -upgrade, כדי להשתמש בגרסה העדכנית ביותר של הספק של Google:

    terraform init -upgrade

החלה של השינויים

  1. בודקים את ההגדרות ומוודאים שהמשאבים שמערכת Terraform תיצור או תעדכן תואמים לציפיות שלכם:
    terraform plan

    מתקנים את ההגדרות לפי הצורך.

  2. מריצים את הפקודה הבאה ומזינים yes בהודעה שמופיעה, כדי להחיל את הגדרות Terraform:
    terraform apply

    ממתינים עד שב-Terraform תוצג ההודעה "Apply complete!‎".

  3. פותחים את הפרויקט ב- Google Cloud כדי להציג את התוצאות. במסוף Google Cloud , נכנסים למשאבים בממשק המשתמש כדי לוודא שהם נוצרו או עודכנו ב-Terraform.

למחוק את השינויים

כדי למחוק את השינויים:

  1. כדי להשבית את ההגנה מפני מחיקה, בקובץ התצורה של Terraform מגדירים את הארגומנט deletion_protection לערך false.
    deletion_protection =  "false"
  2. מריצים את הפקודה הבאה ומזינים yes בהודעה שמופיעה, כדי להחיל את הגדרות Terraform המעודכנות:
    terraform apply
  1. כדי להסיר משאבים שהוחלו בעבר על הגדרות Terraform, מריצים את הפקודה הבאה ומזינים yes בהודעה שמופיעה:

    terraform destroy

הגבלת הגישה לפעולות גיבוי במכונות לבדיקה

נניח שהטופולוגיה של השירות מוגדרת כך שלכל המכונות לבדיקה יש את הקידומת test (לדוגמה, test-instance-1), ולכל המכונות בסביבת הייצור יש את הקידומת prod (לדוגמה, prod-instance-1).

אתם יכולים להגביל את הגישה לפעולות גיבוי למכונות לבדיקה של משתמש או של חשבון שירות. הגבלת הגישה כוללת הגבלת פעולות CREATE,‏ GET,‏ LIST או DELETE לגיבויים של המכונות לבדיקה.

המסוף

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

    כניסה לדף IAM

  2. לוחצים על הכרטיסייה PRINCIPALS.
  3. מאתרים את כתובת האימייל של המשתמש או את חשבון השירות (חשבון המשתמש) שרוצים להגביל את הגישה שלו.
  4. לוחצים על הסמל Edit principal משמאל לחשבון המשתמש. הסמל הזה נראה כמו עיפרון.
  5. בתיבת הדו-שיח Edit permissions, לוחצים על ADD ANOTHER ROLE.
  6. בשדה Filter של תיבת הדו-שיח הבאה, מזינים Cloud SQL Admin. בוחרים את התפקיד אדמין ב-Cloud SQL שמופיע.

    תיבת הדו-שיח Edit permissions פעילה, והתפקיד Cloud SQL Admin מופיע בה.

  7. משמאל לתפקיד אדמין ב-Cloud SQL, לוחצים על הקישור Add condition.
  8. בתיבת הדו-שיח Edit condition, מזינים את הפרטים הבאים:
    1. בשדה Title, מזינים שם לתנאי שמוסיפים כדי להגביל את הגישה לפעולות גיבוי של מכונות לבדיקה. לדוגמה, אפשר להזין Limit access to backup operations.
    2. לוחצים על הכרטיסייה CONDITION EDITOR ומוסיפים את התנאי הבא:

      resource.type == "sqladmin.googleapis.com/BackupRun" && 
      resource.name.startsWith("projects/PROJECT_ID/instances/test")
          

  9. לוחצים על SAVE.
  10. בתיבת הדו-שיח Edit permissions, לוחצים על SAVE.

gcloud

בדוגמה הזו נעשה שימוש במשתנים הבאים:

  • ‫PROJECT_ID: הפרויקט ב- Google Cloud .
  • ‫USER_EMAIL: כתובת האימייל של המשתמש.
  • ‫SERVICE_ACCOUNT_EMAIL:כתובת האימייל המלאה של חשבון השירות שאת הגישה שלו רוצים להגביל.

  1. הגבלת ההיקף של התפקיד cloudsql.admin למשתמש עם כתובת האימייל USER_EMAIL.

    היקף התפקיד מוגבל למשאבים ששמות המשאבים שלהם מתחילים ב-projects/PROJECT_ID/instances/test.

    gcloud projects add-iam-policy-binding PROJECT_ID \ --member=user:USER_EMAIL \
    --role=roles/cloudsql.admin \
    --condition=expression="resource.type == \"sqladmin.googleapis.com/BackupRun\" && resource.name.startsWith(\"projects/PROJECT_ID/instances/test-instance-1\")",title="test"
        
  2. או

  3. הגבלת ההיקף של התפקיד cloudsql.admin למשתמש שמחובר באמצעות חשבון שירות של SERVICE_ACCOUNT_EMAIL.

    gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:SERVICE_ACCOUNT_EMAIL \
    --role=roles/cloudsql.admin \
    --condition=expression="resource.type == \"sqladmin.googleapis.com/BackupRun\" && resource.name.startsWith(\"projects/PROJECT_ID/instances/test-instance-1\")",title="test"
        

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

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

  • תפקיד עריכה ב-Cloud SQL במשאב שבו הקציתם את התפקיד, ובמשאבים הצאצאים שלו. אם מקצים את התפקיד ברמת הפרויקט, הוא חל על כל המכונות בפרויקט. התפקיד "עריכה ב-Cloud SQL" לא כולל את ההרשאה cloudsql.instances.delete.
  • תפקיד אדמין ב-Cloud SQL במכונות עם התג test.

המסוף

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

    כניסה לדף IAM

  2. לוחצים על הוספה.
  3. בשדה New Members, מזינים את כתובת האימייל של חשבון השירות.
  4. לוחצים על הרשימה הנפתחת Role ובוחרים בתפקיד Cloud SQL Editor. לא להוסיף שום דבר אחר לתפקיד הזה.
  5. לוחצים על שמירה כדי לשמור את התנאי.
  6. לוחצים על התפריט Role של אותו חשבון ובוחרים בתפקיד Cloud Cloud SQL Admin.
  7. לוחצים על הוספת תנאי.
  8. מזינים שם ותיאור.
  9. לוחצים על הכרטיסייה עורך התנאים.
  10. בקטע הכלי להגדרת תנאים:
    • בשדה Condition type - Resource - Name, מזינים שם לתנאי.
    • בשדה Condition type - Resource - Service, בוחרים באפשרות sqladmin.googleapis.com.
    • בשדה Condition type - Resource - Tag, מזינים את השם ממרחב השמות של מפתח התג. בדוגמה הזו, האופרטור הוא matches והערך הוא 815471563813/env/test.
  11. לוחצים על שמירה כדי לשמור את התנאי.
  12. לוחצים על שמירה כדי לשמור את המדיניות.

gcloud

בדוגמה הזו נעשה שימוש במשתנים הבאים:

  • ‫PROJECT_ID: הפרויקט ב- Google Cloud .
  • ‫INSTANCE_ID: המכונה שלכם ב-Cloud SQL.
  • ‫REGION: האזור שבו נמצא המכונה של Cloud SQL.
  • ORGANIZATION_ID: המזהה של הארגון שיהיה משאב ההורה של מפתח התג הזה, לדוגמה: 12345678901. במאמר יצירה וניהול של ארגונים מוסבר איך מקבלים את מזהה הארגון.
  • ‫SERVICE_ACCOUNT_EMAIL:כתובת האימייל המלאה של חשבון השירות שאת הגישה שלו רוצים לשנות.

  1. יוצרים מפתח תג בשם `env` עם ערכי התג `prod` ו-`test`. מידע נוסף זמין במאמר יצירה והגדרה של תג חדש.
    gcloud alpha resource-manager tags keys create env \
    --parent=organizations/ORGANIZATION_ID
    gcloud alpha resource-manager tags values create prod \
    --parent=env
    gcloud alpha resource-manager tags values create test \
    --parent=env
        
  2. מצרפים את התג `env` עם הערך `test` למכונות של Cloud SQL בסביבת הבדיקה. מידע נוסף מופיע בדף תגים של Cloud SQL.
  3. gcloud alpha resource-manager tags bindings create \
    --tag-value=test \
    --parent=//sqladmin.googleapis.com/projects/PROJECT_ID/instances/INSTANCE_ID \
    --location=REGION
      
  4. מציגים את הקישורים הקיימים של מדיניות ה-IAM ומוציאים אותם לקובץ bindings.json:
    gcloud projects get-iam-policy PROJECT_ID --format=json >> bindings.json
  5. מוסיפים את הקישורים המותנים הבאים לקובץ bindings.json:
    {
      "bindings": [
        {
          "role": "roles/cloudsql.editor",
          "members": [
              "serviceAccount:SERVICE_ACCOUNT_EMAIL"
            ]
        },
        {
          "role": "roles/cloudsql.admin",
          "members": [
              "serviceAccount:SERVICE_ACCOUNT_EMAIL"
            ],
          "condition": {
            "expression": "resource.matchTag('ORGANIZATION_ID/env', 'test')"
          }
        }
      ],
      "etag": "BwWKmjvelug="
      "version": 3
    }
  6. מעדכנים את הקישורים של מדיניות ה-IAM באמצעות הקובץ החדש bindings.json.
    gcloud projects set-iam-policy PROJECT_ID bindings.json