דחיית הגישה למשאבים

בדף הזה מוסבר איך למנוע מחשבונות משתמשים להשתמש בהרשאות ספציפיות של ניהול זהויות והרשאות גישה (IAM) כדי לדחות גישה שלהם.

ב-IAM, אפשר לדחות את הגישה באמצעות כללי מדיניות הדחייה. כל מדיניות דחייה מצורפת לארגון, לתיקייה או לפרויקט. Google Cloud מדיניות דחייה <x0A>כוללת כללי דחייה, שבהם מזוהים חשבונות המשתמשים ורשומים ההרשאות <x0A>שהם לא יכולים להשתמש בהן.

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

אפשר לנהל את כללי מדיניות הדחייה באמצעות מסוף Google Cloud ,‏ Google Cloud CLI או API בארכיטקטורת REST של IAM v2.

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

  • מפעילים את IAM API.

    תפקידים שנדרשים להפעלת ממשקי API

    כדי להפעיל ממשקי API, נדרשת ההרשאה serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד 'בעלים' (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד 'אדמין בממשק 'שימוש בשירות'' (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידים

    להפעלת ה-API

  • מגדירים אימות.

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

    המסוף

    כשמשתמשים במסוף Google Cloud כדי לגשת לשירותים ולממשקי ה-API, לא צריך להגדיר אימות. Google Cloud

    gcloud

    במסוף Google Cloud , מפעילים את Cloud Shell.

    הפעלת Cloud Shell

    בחלק התחתון של Google Cloud המסוף יתחיל סשן של Cloud Shell ותופיע הודעה של שורת הפקודה. Cloud Shell היא סביבת מעטפת שבה ה-CLI של Google Cloud מותקן ומוגדרים ערכים לפרויקט הקיים. הסשן יופעל תוך כמה שניות.

    Terraform

    כדי להשתמש בסביבת פיתוח מקומית בדוגמאות של Terraform שבדף הזה, מתקינים ומפעילים את ה-CLI של gcloud, ואז מגדירים את Application Default Credentials באמצעות פרטי הכניסה של המשתמש.

    1. התקינו את ה-CLI של Google Cloud.

    2. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

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

      gcloud auth application-default login

      אם אתם משתמשים ב-Cloud Shell, אין צורך לבצע את הפעולה הזו.

      אם מוחזרת שגיאת אימות ואתם משתמשים בספק זהויות חיצוני (IdP), ודאו ש נכנסתם ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

    למידע נוסף, ראו הגדרת ADC לסביבת פיתוח מקומית במאמרי העזרה בנושא אימות Google Cloud .

    המשך

    כדי להשתמש בדוגמאות של Go שבדף הזה בסביבת פיתוח מקומית, מתקינים ומפעילים את ה-CLI של gcloud, ואז מגדירים את Application Default Credentials באמצעות פרטי הכניסה של המשתמש.

    1. התקינו את ה-CLI של Google Cloud.

    2. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

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

      gcloud auth application-default login

      אם אתם משתמשים ב-Cloud Shell, אין צורך לבצע את הפעולה הזו.

      אם מוחזרת שגיאת אימות ואתם משתמשים בספק זהויות חיצוני (IdP), ודאו ש נכנסתם ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

    למידע נוסף, ראו הגדרת ADC לסביבת פיתוח מקומית במאמרי העזרה בנושא אימות Google Cloud .

    Java

    כדי להשתמש בדוגמאות של Java שבדף הזה בסביבת פיתוח מקומית, מתקינים ומפעילים את ה-CLI של gcloud, ואז מגדירים את Application Default Credentials באמצעות פרטי הכניסה של המשתמש.

    1. התקינו את ה-CLI של Google Cloud.

    2. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

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

      gcloud auth application-default login

      אם אתם משתמשים ב-Cloud Shell, אין צורך לבצע את הפעולה הזו.

      אם מוחזרת שגיאת אימות ואתם משתמשים בספק זהויות חיצוני (IdP), ודאו ש נכנסתם ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

    למידע נוסף, ראו הגדרת ADC לסביבת פיתוח מקומית במאמרי העזרה בנושא אימות Google Cloud .

    Node.js

    כדי להשתמש בדוגמאות של Node.js שבדף הזה בסביבת פיתוח מקומית, מתקינים ומפעילים את ה-CLI של gcloud, ואז מגדירים את Application Default Credentials באמצעות פרטי הכניסה של המשתמש.

    1. התקינו את ה-CLI של Google Cloud.

    2. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

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

      gcloud auth application-default login

      אם אתם משתמשים ב-Cloud Shell, אין צורך לבצע את הפעולה הזו.

      אם מוחזרת שגיאת אימות ואתם משתמשים בספק זהויות חיצוני (IdP), ודאו ש נכנסתם ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

    למידע נוסף, ראו הגדרת ADC לסביבת פיתוח מקומית במאמרי העזרה בנושא אימות Google Cloud .

    Python

    כדי להשתמש בסביבת פיתוח מקומית בדוגמאות של Python שבדף הזה, מתקינים ומפעילים את ה-CLI של gcloud, ואז מגדירים את Application Default Credentials באמצעות פרטי הכניסה של המשתמש.

    1. התקינו את ה-CLI של Google Cloud.

    2. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

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

      gcloud auth application-default login

      אם אתם משתמשים ב-Cloud Shell, אין צורך לבצע את הפעולה הזו.

      אם מוחזרת שגיאת אימות ואתם משתמשים בספק זהויות חיצוני (IdP), ודאו ש נכנסתם ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

    למידע נוסף, ראו הגדרת ADC לסביבת פיתוח מקומית במאמרי העזרה בנושא אימות Google Cloud .

    REST

    כדי להשתמש בסביבת פיתוח מקומית בדוגמאות של API בארכיטקטורת REST שבדף הזה, צריך להשתמש בפרטי הכניסה שאתם נותנים ל-CLI של gcloud.

      התקינו את ה-CLI של Google Cloud.

      אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

    מידע נוסף מופיע במאמר אימות לשימוש ב-REST במסמכי האימות של Google Cloud .

  • כדאי לקרוא את הסקירה הכללית של כללי מדיניות הדחייה.

התפקידים הנדרשים

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

  • כדי לצפות בכללי מדיניות הדחייה: דחיית סוקר (roles/iam.denyReviewer)
  • כדי להציג, ליצור, לעדכן ולמחוק כללי מדיניות דחייה: דחיית אדמין (roles/iam.denyAdmin)

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

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

הרשאות נדרשות

כדי לנהל את כללי מדיניות הדחייה נדרשות ההרשאות הבאות:

  • כדי להציג את כללי מדיניות הדחייה:
    • iam.denypolicies.get
    • iam.denypolicies.list
  • כדי ליצור, לעדכן ולמחוק כללי מדיניות דחייה:
    • iam.denypolicies.create
    • iam.denypolicies.delete
    • iam.denypolicies.get
    • iam.denypolicies.update

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

זיהוי ההרשאות לדחייה

לפני שיוצרים מדיניות דחייה, צריך להחליט אילו הרשאות רוצים לדחות, ובאילו חשבונות המשתמשים יידחו ההרשאות האלה.

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

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

כללי מדיניות הדחייה מנוהלים באמצעות ה-v2 של API בארכיטקטורת REST, שדורש פורמט מיוחד עבור שמות הרשאות. לדוגמה, ההרשאה ליצירת תפקיד ב-IAM בהתאמה אישית ל-IAM נקראת כך:

  • v1 API: iam.roles.create
  • v2 API: iam.googleapis.com/roles.create

יצירה של מדיניות דחייה

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

כללי מדיניות הדחייה כוללים כללי דחייה שבהם מפורטים:

  • ההרשאות לדחייה.
  • חשבונות המשתמשים שעבורם נדחו ההרשאות האלה.
  • אופציונלי: החרגת חשבונות משתמשים מדחיית הרשאות.

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

  • אופציונלי: ביטוי תנאי שמציין את הזמן שבו חשבונות המשתמשים לא יכולים להשתמש בהרשאות. בכללי מדיניות דחייה אפשר להשתמש בביטויי תנאי רק בפונקציות של תגי משאבים – אין תמיכה בפונקציות ובאופרטורים אחרים.

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

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

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

המסוף

  1. במסוף Google Cloud , עוברים לכרטיסייה Deny בדף IAM.

    כניסה לדף IAM

  2. בוחרים פרויקט, תיקייה או ארגון.

  3. לוחצים על יצירה של מדיניות דחייה.

  4. בקטע Policy name, מגדירים את מזהה המדיניות באחת מהדרכים הבאות:

    • בשדה שם לתצוגה, מזינים שם לתצוגה של המדיניות. מילוי השדה הזה גורם למילוי אוטומטי של השדה מזהה. אם רוצים לשנות את המזהה של המדיניות, מעדכנים את הטקסט בשדה מזהה.
    • בשדה ID, מזינים מזהה למדיניות.
  5. בקטע Deny rules (כללי דחייה), מגדירים את כללי הדחייה של המדיניות. כל מדיניות דחייה חייבת לכלול לפחות כלל דחייה אחד. כדי להוסיף עוד כללי דחייה, לוחצים על הוספת כלל דחייה.

    לכל כלל דחייה, מבצעים את הפעולות הבאות:

    1. בשדה Denied principals, מוסיפים חשבון משתמש אחד או יותר שרוצים למנוע ממנו להשתמש בהרשאות שצוינו. החשבון הראשי יכול להיות כל אחד מסוגי החשבונות שמופיעים במזהים של חשבונות משתמשים בכללי מדיניות הדחייה, למעט חשבונות משתמשים שהמזהים שלהם מתחילים ב-deleted:.
    2. אופציונלי: בשדה Exception principals, מוסיפים את חשבונות המשתמשים שרוצים לאפשר להם להשתמש בהרשאות שצוינו, גם אם החשבונות האלה כלולים בקטע Denied principals. לדוגמה, אפשר להשתמש בשדה הזה כדי להחריג משתמשים ספציפיים ששייכים לקבוצה שנדחתה.

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

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

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

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

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

      • כותרת: אופציונלי. סיכום קצר של מטרת התנאי.
      • תיאור: אופציונלי. תיאור ארוך יותר של התנאי.
      • ביטוי תנאי: אפשר להוסיף ביטוי תנאי באמצעות הכלי להגדרת תנאים או עורך התנאים. הכלי להגדרת תנאים הוא ממשק אינטראקטיבי שבו בוחרים את סוג התנאי, האופרטור ופרטים רלוונטיים אחרים של הביטוי. עורך התנאים הוא ממשק מבוסס-טקסט שבו מזינים ידנית ביטוי בתחביר Common Expression Language ‏ (CEL).

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

  6. לוחצים על יצירה.

gcloud

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

{
  "displayName": "POLICY_NAME",
  "rules": [
    {
      "denyRule": DENY_RULE_1
    },
    {
      "denyRule": DENY_RULE_2
    },
    {
      "denyRule": DENY_RULE_N
    }
  ]
}

מציינים את הערכים הבאים:

  • POLICY_NAME: השם המוצג של מדיניות הדחייה.
  • DENY_RULE_1, DENY_RULE_2, ...DENY_RULE_N: כללי הדחייה במדיניות. כל כלל דחייה יכול להכיל את השדות הבאים:

    • deniedPermissions: רשימה של הרשאות שחשבונות המשתמשים שצוינו לא יכולים להשתמש בהן. ההרשאות חייבות להיות בתמיכה של כללי מדיניות הדחייה.

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

    • exceptionPermissions: רשימה של הרשאות שחשבונות המשתמשים שצוינו יכולים להשתמש בהן, גם אם ההרשאות האלה כלולות ב-deniedPermissions. לדוגמה, אפשר להשתמש בשדה הזה כדי להחריג הרשאות ספציפיות בקבוצת הרשאות.
    • deniedPrincipals: רשימה של חשבונות משתמשים שלא יכולים להשתמש בהרשאות שצוינו. מידע על הפורמט של מזהי חשבונות משתמשים מופיע במאמר מזהים של חשבונות משתמשים בכללי מדיניות הדחייה.
    • exceptionPrincipals: אופציונלי. רשימה של חשבונות משתמשים שיכולים להשתמש בהרשאות שצוינו, גם אם החשבונות האלה כלולים ב-deniedPrincipals. לדוגמה, ניתן להשתמש בשדה הזה כדי להחריג משתמשים ספציפיים ששייכים לקבוצה שנדחתה. מידע על הפורמט של מזהי חשבונות משתמשים מופיע במאמר מזהים של חשבונות משתמשים בכללי מדיניות הדחייה.

    • denialCondition: אופציונלי. ביטוי תנאי שמציין את הזמן שבו חשבונות המשתמשים לא יכולים להשתמש בהרשאות. מכיל את השדות הבאים:

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

לדוגמה, מדיניות הדחייה הבאה מכילה כלל דחייה אחד שדוחה הרשאה אחת ללוסיאן:

{
  "displayName": "My deny policy.",
  "rules": [
    {
      "denyRule": {
        "deniedPrincipals": [
          "principal://goog/subject/lucian@example.com"
        ],
        "deniedPermissions": [
          "iam.googleapis.com/roles.create"
        ]
      }
    }
  ]
}

לאחר מכן, מריצים את הפקודה gcloud iam policies create:

gcloud iam policies create POLICY_ID \
    --attachment-point=ATTACHMENT_POINT \
    --kind=denypolicies \
    --policy-file=POLICY_FILE

מציינים את הערכים הבאים:

  • POLICY_ID: המזהה של מדיניות הדחייה.

  • ATTACHMENT_POINT: מזהה של המשאב שאליו מצורפת מדיניות הדחייה. אפשר לקרוא מידע על הפורמט של הערך הזה בקטע נקודת הצירוף.

  • POLICY_FILE: הנתיב של קובץ ה-JSON שמכיל את מדיניות הדחייה.

כברירת מחדל, אם הפקודה הזו מצליחה, היא לא מדפיסה פלט. כדי להדפיס תגובה מפורטת, מוסיפים את הדגל --format=json לפקודה.

לדוגמה, אפשר להשתמש בפקודה הבאה כדי ליצור מדיניות דחייה בשם my-deny-policy לפרויקט my-project באמצעות הקובץ policy.json:

gcloud iam policies create my-deny-policy \
    --attachment-point=cloudresourcemanager.googleapis.com/projects/my-project \
    --kind=denypolicies \
    --policy-file=policy.json

Terraform

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

data "google_project" "default" {
}

# Create a service account
resource "google_service_account" "default" {
  display_name = "IAM Deny Example - Service Account"
  account_id   = "example-sa"
  project      = data.google_project.default.project_id
}

# Create an IAM deny policy that denies a permission for the service account
resource "google_iam_deny_policy" "default" {
  provider     = google-beta
  parent       = urlencode("cloudresourcemanager.googleapis.com/projects/${data.google_project.default.project_id}")
  name         = "my-deny-policy"
  display_name = "My deny policy."
  rules {
    deny_rule {
      denied_principals  = ["principal://iam.googleapis.com/projects/-/serviceAccounts/${google_service_account.default.email}"]
      denied_permissions = ["iam.googleapis.com/roles.create"]
    }
  }
}

Go

במאמר ספריות הלקוח של IAM מוסבר איך להתקין את ספריית הלקוח ולהשתמש בה ב-IAM. למידע נוסף, קראו את מאמרי העזרה של ‎IAM Go API‎.

כדי לבצע אימות ב-IAM, צריך להגדיר את Application Default Credentials. מידע נוסף מופיע במאמר לפני שמתחילים.

import (
	"context"
	"fmt"
	"io"

	iam "cloud.google.com/go/iam/apiv2"
	"cloud.google.com/go/iam/apiv2/iampb"

	"google.golang.org/genproto/googleapis/type/expr"
)

// createDenyPolicy creates a deny policy.
func createDenyPolicy(w io.Writer, projectID, policyID string) error {
	// You can add deny policies to organizations, folders, and projects.
	// Each of these resources can have up to 5 deny policies.
	// Deny policies contain deny rules, which specify the following:
	// 1. The permissions to deny and/or exempt.
	// 2. The principals that are denied, or exempted from denial.
	// 3. An optional condition on when to enforce the deny rules.

	// projectID := "your_project_id"
	// policyID := "your_policy_id"

	ctx := context.Background()
	policiesClient, err := iam.NewPoliciesClient(ctx)
	if err != nil {
		return fmt.Errorf("NewPoliciesClient: %w", err)
	}
	defer policiesClient.Close()

	// Each deny policy is attached to an organization, folder, or project.
	// To work with deny policies, specify the attachment point.
	//
	// Its format can be one of the following:
	// 1. cloudresourcemanager.googleapis.com/organizations/ORG_ID
	// 2. cloudresourcemanager.googleapis.com/folders/FOLDER_ID
	// 3. cloudresourcemanager.googleapis.com/projects/PROJECT_ID
	//
	// The attachment point is identified by its URL-encoded resource name. Hence, replace
	// the "/" with "%%2F".
	attachmentPoint := fmt.Sprintf(
		"cloudresourcemanager.googleapis.com%%2Fprojects%%2F%s",
		projectID,
	)

	denyRule := &iampb.DenyRule{
		// Add one or more principals who should be denied the permissions specified in this rule.
		// For more information on allowed values,
		// see: https://cloud.google.com/iam/help/deny/principal-identifiers
		DeniedPrincipals: []string{"principalSet://goog/public:all"},
		// Optionally, set the principals who should be exempted from the
		// list of denied principals. For example, if you want to deny certain permissions
		// to a group but exempt a few principals, then add those here.
		// ExceptionPrincipals: []string{"principalSet://goog/group/project-admins@example.com"},
		//
		// Set the permissions to deny.
		// The permission value is of the format: service_fqdn/resource.action
		// For the list of supported permissions,
		// see: https://cloud.google.com/iam/help/deny/supported-permissions
		DeniedPermissions: []string{"cloudresourcemanager.googleapis.com/projects.delete"},
		// Optionally, add the permissions to be exempted from this rule.
		// Meaning, the deny rule will not be applicable to these permissions.
		// ExceptionPermissions: []string{"cloudresourcemanager.googleapis.com/projects.create"},
		//
		// Set the condition which will enforce the deny rule.
		// If this condition is true, the deny rule will be applicable.
		// Else, the rule will not be enforced.
		// The expression uses Common Expression Language syntax (CEL).
		// Here we block access based on tags.
		//
		// Here, we create a deny rule that denies the
		// cloudresourcemanager.googleapis.com/projects.delete permission
		// to everyone except project-admins@example.com for resources that are tagged test.
		// A tag is a key-value pair that can be attached to an organization, folder, or project.
		// For more info, see: https://cloud.google.com/iam/docs/deny-access#create-deny-policy
		DenialCondition: &expr.Expr{
			Expression: "!resource.matchTag('12345678/env', 'test')",
		},
	}

	// Add the deny rule and a description for it.
	policyRule := &iampb.PolicyRule{
		Description: "block all principals from deleting projects, unless the principal is a member of project-admins@example.com and the project being deleted has a tag with the value test",
		Kind: &iampb.PolicyRule_DenyRule{
			DenyRule: denyRule,
		},
	}

	policy := &iampb.Policy{
		DisplayName: "Restrict project deletion access",
		Rules:       [](*iampb.PolicyRule){policyRule},
	}

	req := &iampb.CreatePolicyRequest{
		// Construct the full path of the resource's deny policies.
		// Its format is: "policies/ATTACHMENT_POINT/denypolicies"
		Parent:   fmt.Sprintf("policies/%s/denypolicies", attachmentPoint),
		Policy:   policy,
		PolicyId: policyID,
	}
	op, err := policiesClient.CreatePolicy(ctx, req)
	if err != nil {
		return fmt.Errorf("unable to create policy: %w", err)
	}

	policy, err = op.Wait(ctx)
	if err != nil {
		return fmt.Errorf("unable to wait for the operation: %w", err)
	}

	fmt.Fprintf(w, "Policy %s created\n", policy.GetName())

	return nil
}

Java

במאמר ספריות הלקוח של IAM מוסבר איך להתקין את ספריית הלקוח ולהשתמש בה ב-IAM. למידע נוסף, קראו את מאמרי העזרה של ‎IAM Java API‎.

כדי לבצע אימות ב-IAM, צריך להגדיר את Application Default Credentials. מידע נוסף מופיע במאמר לפני שמתחילים.


import com.google.iam.v2.CreatePolicyRequest;
import com.google.iam.v2.DenyRule;
import com.google.iam.v2.PoliciesClient;
import com.google.iam.v2.Policy;
import com.google.iam.v2.PolicyRule;
import com.google.longrunning.Operation;
import com.google.type.Expr;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class CreateDenyPolicy {

  public static void main(String[] args)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    // ID or number of the Google Cloud project you want to use.
    String projectId = "your-google-cloud-project-id";

    // Specify the id of the Deny policy you want to create.
    String policyId = "deny-policy-id";

    createDenyPolicy(projectId, policyId);
  }

  // Create a deny policy.
  // You can add deny policies to organizations, folders, and projects.
  // Each of these resources can have up to 5 deny policies.
  //
  // Deny policies contain deny rules, which specify the following:
  // 1. The permissions to deny and/or exempt.
  // 2. The principals that are denied, or exempted from denial.
  // 3. An optional condition on when to enforce the deny rules.
  public static void createDenyPolicy(String projectId, String policyId)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {

    try (PoliciesClient policiesClient = PoliciesClient.create()) {
      // Each deny policy is attached to an organization, folder, or project.
      // To work with deny policies, specify the attachment point.
      //
      // Its format can be one of the following:
      // 1. cloudresourcemanager.googleapis.com/organizations/ORG_ID
      // 2. cloudresourcemanager.googleapis.com/folders/FOLDER_ID
      // 3. cloudresourcemanager.googleapis.com/projects/PROJECT_ID
      //
      // The attachment point is identified by its URL-encoded resource name.
      String urlEncodedResource =
          URLEncoder.encode(
              "cloudresourcemanager.googleapis.com/projects/", StandardCharsets.UTF_8);
      String attachmentPoint = String.format("%s%s", urlEncodedResource, projectId);

      // Construct the full path of the resource to which the policy is attached.
      // Its format is: "policies/{attachmentPoint}/denypolicies/{policyId}"
      String policyParent = String.format("policies/%s/denypolicies", attachmentPoint);

      DenyRule denyRule =
          DenyRule.newBuilder