בקרת גישה למשאבי ארגון באמצעות IAM

ניהול זהויות והרשאות גישה (IAM) מאפשר לכם לתת גישה פרטנית למשאבים ספציפיים ב- Cloud de Confiance by S3NS , ולמנוע גישה לא רצויה למשאבים אחרים. כשמיישמים את העיקרון של הרשאות מינימליות, מעניקים רק את ההרשאות שנדרשות לעומסי העבודה.

באמצעות כללי מדיניות ההרשאה ב-IAM אתם יכולים לקבוע למי (משתמשים) יש גישה (תפקידים) אל משאבים ספציפיים. כללי המדיניות האלה מקשרים תפקידים ספציפיים למשתמשים. כדי לנהל את הגישה בהיררכיית המשאבים, אתם יכולים להגדיר תפקידי IAM וכללי מדיניות הרשאה ברמת הארגון באמצעות Cloud Resource Manager API. אתם יכולים גם להגדיר כללי מדיניות דחייה כדי למנוע מחשבונות משתמשים להשתמש בהרשאות ספציפיות. למידע נוסף, קראו את המאמר ניהול הגישה לפרויקטים, לתיקיות ולארגונים.

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

כדי לשלוט בגישה למשאבים,ב- Cloud de Confiance by S3NS נדרש שלחשבונות ששולחים בקשות API יהיו תפקידי IAM מתאימים. תפקידי IAM כוללים הרשאות שמאפשרות למשתמשים לבצע פעולות ספציפיות במשאביCloud de Confiance . לדוגמה, ההרשאה resourcemanager.organizations.get מאפשרת למשתמש לקבל פרטים על משאב הארגון שלו.

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

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

שימוש בתפקידים מוגדרים מראש

בטבלה הבאה מפורטים: 1) התפקידים שאתם יכולים להקצות כדי לתת גישה למאפיינים של משאב הארגון;‏ 2) התיאור של התפקידים; ו-3) ההרשאות שמוגדרות להם.

תפקיד הרשאות

(roles/resourcemanager.organizationAdmin)

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

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

  • פרויקט

essentialcontacts.*

  • essentialcontacts.contacts.create
  • essentialcontacts.contacts.delete
  • essentialcontacts.contacts.get
  • essentialcontacts.contacts.list
  • essentialcontacts.contacts.send
  • essentialcontacts.contacts.update

iam.policybindings.*

  • iam.policybindings.get
  • iam.policybindings.list

orgpolicy.constraints.list

orgpolicy.policies.list

orgpolicy.policy.get

resourcemanager.capabilities.*

  • resourcemanager.capabilities.get
  • resourcemanager.capabilities.update

resourcemanager.folders.createPolicyBinding

resourcemanager.folders.deletePolicyBinding

resourcemanager.folders.get

resourcemanager.folders.getIamPolicy

resourcemanager.folders.list

resourcemanager.folders.searchPolicyBindings

resourcemanager.folders.setIamPolicy

resourcemanager.folders.updatePolicyBinding

resourcemanager.organizations.*

  • resourcemanager.organizations.createPolicyBinding
  • resourcemanager.organizations.deletePolicyBinding
  • resourcemanager.organizations.get
  • resourcemanager.organizations.getIamPolicy
  • resourcemanager.organizations.searchPolicyBindings
  • resourcemanager.organizations.setIamPolicy
  • resourcemanager.organizations.updatePolicyBinding

resourcemanager.projects.createPolicyBinding

resourcemanager.projects.deletePolicyBinding

resourcemanager.projects.get

resourcemanager.projects.getIamPolicy

resourcemanager.projects.list

resourcemanager.projects.searchPolicyBindings

resourcemanager.projects.setIamPolicy

resourcemanager.projects.updatePolicyBinding

(roles/resourcemanager.organizationViewer)

מאפשרת לצפות בארגון.

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

  • ארגון

resourcemanager.organizations.get

(roles/orgpolicy.policyAdmin)

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

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

  • ארגון

cloudasset.assets.analyzeOrgPolicy

cloudasset.assets.exportResource

cloudasset.assets.listResource

cloudasset.assets.searchAllResources

orgpolicy.*

  • orgpolicy.constraints.list
  • orgpolicy.customConstraints.create
  • orgpolicy.customConstraints.delete
  • orgpolicy.customConstraints.get
  • orgpolicy.customConstraints.list
  • orgpolicy.customConstraints.update
  • orgpolicy.policies.create
  • orgpolicy.policies.delete
  • orgpolicy.policies.list
  • orgpolicy.policies.update
  • orgpolicy.policy.get
  • orgpolicy.policy.set

policysimulator.orgPolicyViolations.list

policysimulator.orgPolicyViolationsPreviews.*

  • policysimulator.orgPolicyViolationsPreviews.create
  • policysimulator.orgPolicyViolationsPreviews.get
  • policysimulator.orgPolicyViolationsPreviews.list

recommender.orgPolicyInsights.*

  • recommender.orgPolicyInsights.get
  • recommender.orgPolicyInsights.list
  • recommender.orgPolicyInsights.update

recommender.orgPolicyRecommendations.*

  • recommender.orgPolicyRecommendations.get
  • recommender.orgPolicyRecommendations.list
  • recommender.orgPolicyRecommendations.update

(roles/browser)

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

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

  • פרויקט

resourcemanager.folders.get

resourcemanager.folders.list

resourcemanager.organizations.get

resourcemanager.projects.get

resourcemanager.projects.getIamPolicy

resourcemanager.projects.list

יצירת תפקידים בהתאמה אישית

בנוסף לתפקידים המוגדרים מראש שמתוארים בנושא הזה, אתם יכולים גם ליצור תפקידים בהתאמה אישית, שהם אוספים של הרשאות שאתם מתאימים לצרכים שלכם. כשיוצרים תפקיד בהתאמה אישית לשימוש עם מנהל המשאבים, חשוב לשים לב לנקודות הבאות:
  • הרשאות להצגה ברשימה ולקבלת הרשאות, כמו resourcemanager.projects.get/list, תמיד צריך להעניק כזוג.
  • אם התפקיד בהתאמה אישית כולל את ההרשאות folders.list ו-folders.get, הוא צריך לכלול גם את ההרשאות projects.list ו-projects.get.
  • חשוב לדעת שההרשאה setIamPolicy למשאבים של ארגון, תיקייה ופרויקט מאפשרת למשתמש להעניק את כל ההרשאות האחרות, ולכן צריך להקצות אותה בזהירות.

הצגת הגישה הקיימת למשאב של הארגון

כדי לראות אילו תפקידים הוקצו למשתמש במשאב של הארגון, צריך לבדוק את מדיניות ההרשאות של המשאב. אפשר לראות את מדיניות ההרשאות של משאב הארגון באמצעות מסוף Cloud de Confiance ,‏ Google Cloud CLI או ה-method‏ getIamPolicy().

המסוף

כדי לראות את התפקידים שהוקצו ברמת משאב הארגון באמצעות מסוף Cloud de Confiance :

  1. נכנסים לדף Manage resources במסוף Cloud de Confiance :

    פתיחת הדף Manage resources

  2. בתפריט הנפתח Organization, בוחרים את המשאב הארגוני.

  3. מסמנים את התיבה של משאב הארגון.

  4. בקטע Permissions שבחלונית Info Panel, לוחצים על Expand כדי להרחיב את התפקיד ולהציג את כל החברים שיש להם את התפקיד הזה.

gcloud

מפעילים את הפקודה get-iam-policy כדי לקבל את מדיניות ההרשאות של משאב הארגון:

gcloud organizations get-iam-policy \
ORGANIZATION_ID --format json > \
FILENAME.JSON

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

bindings:
- members:
- user:testuser1@gcp-test.com
role: roles/editor
- members:
- user:admin@gcp-test.com
role:roles/resourcemanager.organizationAdmin
- members:
- user:testuser2@gcp-test.com
role: roles/resourcemanager.projectCreator
etag": "BwU1aRxWk30="

API

קטע הקוד הבא מחזיר את מדיניות ההרשאות של משאב הארגון https://cloudresourcemanager.googleapis.com/v3/organizations/12345.

בקשה:

POST
https://cloudresourcemanager.googleapis.com/v3/organizations/12345:getIamPolicy

תשובה:

{
    "bindings": [
    {
        "role": "roles/resourcemanager.organizationAdmin",
        "members": [
        "user:email1@gmail.com"
    ]
    },
    {
        "role": "roles/resourcemanager.projectCreator",
        "members": [
            "user:email2@gmail.com",
            "user:email3@gmail.com",
            "serviceAccount:my-other-app@appspot.s3ns-system.iam.gserviceaccount.com"
        ]
    }
    ]
    "etag": "BwUjHYKHHiQ="
}

Python

ה-method‏ getIamPolicy() מאפשרת לקבל מדיניות הרשאות שכבר הוגדרה.

crm = discovery.build(
    'cloudresourcemanager', 'v3', http=creds.authorize(httplib2.Http()))
policy = crm.organizations().getIamPolicy(
    resource=flags.organizationId, body={}).execute()
print json.dumps(policy, indent=2)

הענקת גישה למשאב של ארגון

אדמינים ארגוניים יכולים להקצות תפקידי IAM לחברי הצוות, כדי שהם יוכלו לגשת למשאבים ולממשקי ה-API של הארגון. אפשר להקצות תפקידים לכתובת אימייל של חשבון משתמש, לקבוצה ב-Google, לחשבון שירות או לדומיין ב-G Suite. כדי להקצות תפקידים, אתם יכולים להשתמש במסוף Cloud de Confiance , ב-CLI של gcloud או ב-method‏ setIamPolicy().

המסוף

כדי להגדיר בקרת גישה ברמת משאב הארגון באמצעות מסוף Cloud de Confiance :

  1. נכנסים לדף Manage resources במסוף Cloud de Confiance :

    פתיחת הדף Manage resources

  2. בתפריט הנפתח Organization, בוחרים את המשאב הארגוני.

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

  4. אם החלונית Info Panel שבצד ימין מוסתרת, לוחצים על Show Info Panel בפינה הימנית העליונה.

  5. ב-Info Panel, בכרטיסייה Permissions לוחצים על Add Member.

  6. בשדה New members, מזינים את חברי הצוות שרוצים להוסיף. אפשר לציין כתובת אימייל של חשבון משתמש, קבוצת Google, חשבון שירות או דומיין ב-G Suite.

  7. בתפריט הנפתח Select a role, בוחרים את התפקיד שרוצים להקצות לחברי הצוות.

  8. לוחצים על הוספה.

gcloud

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

  1. משיגים את מדיניות ההרשאה של משאב הארגון באמצעות הפקודה get-iam-policy, ומפיקים את המדיניות לקובץ JSON:

    gcloud organizations get-iam-policy \
    ORGANIZATION_ID \
    --format json > FILENAME.JSON
    
  2. התוכן של קובץ ה-JSON נראה כך:

{
    "bindings": [
    {
        "members": [
            "user:testuser1@gcp-test.com"
        ],
        "role": "roles/editor"
    },
    {
        "members": [
            "user:admin@gcp-test.com",
        ],
        "role": "roles/resourcemanager.organizationAdmin"
    },
    {
        "members": [
            "user:testuser2@gcp-test.com"
        ],
        "role": "roles/resourcemanager.projectCreator"
    },
    ],
    "etag": "BwU1aRxWk30="
}
  1. פותחים את קובץ ה-JSON בכלי לעריכת טקסט. לאחר מכן, מוסיפים רשומה חדשה למערך bindings כדי להגדיר אדמין ארגוני. לדוגמה, כדי להפוך את anotheradmin@gcp-test.com למנהל ארגון, משנים את הדוגמה הקודמת באופן הבא:
{
    "bindings": [
    {
        "members": [
            "user:testuser1@gcp-test.com"
        ],
        "role": "roles/editor"
    },
    {
        "members": [
            "user:admin@gcp-test.com",
            "user:anotheradmin@gcp-test.com"
        ],
        "role": "roles/resourcemanager.organizationAdmin"
    },
    {
        "members": [
            "user:testuser20@gcp-test.com"
        ],
        "role": "roles/resourcemanager.projectCreator"
    },
    ],
    "etag": "BwU1aRxWk30="
}
  1. כדי לעדכן את מדיניות ההרשאה של משאב הארגון, מריצים את הפקודה הבאה:
gcloud organizations set-iam-policy \
ORGANIZATION_ID policy.json

API

בקשה:

POST https://cloudresourcemanager.googleapis.com/v3/organizations/12345:setIamPolicy
{
    "policy": {
    "version": "0",
    "bindings": [
    {
        "role": "roles/resourcemanager.organizationAdmin",
        "members": [
            "user:email1@gmail.com"
        ]
    },
    {
        "role": "roles/resourcemanager.projectCreator",
        "members": [
        "user:email2@gmail.com",
        "user:email3@gmail.com",
        "serviceAccount:my-other-app@appspot.s3ns-system.iam.gserviceaccount.com"
        ]
    }
    ]
    "etag": "BwUjHYKHHiQ="
    }
}

תשובה:

{
    "bindings": [
    {
        "role": "roles/resourcemanager.organizationAdmin",
        "members": [
            "user:email1@gmail.com"
        ]
    },
    {
        "role": "roles/resourcemanager.projectCreator",
        "members": [
            "user:email2@gmail.com",
            "user:email3@gmail.com",
            "serviceAccount:my-other-app@appspot.s3ns-system.iam.gserviceaccount.com"
        ]
    }
    ]
    "etag": "BwUjHYKJUiQ="
}

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

קריאה-שינוי-כתיבה: דפוס נפוץ לעדכון מטא-נתונים של משאב, כמו מדיניות ההרשאות, שכולל קריאה של המצב הנוכחי, עדכון הנתונים באופן מקומי ואז שליחת הנתונים ששונו לכתיבה. הדפוס הזה עלול לגרום לבעיות אם משתמשים בו בו-זמנית בשני תהליכים בלתי תלויים (או יותר). לדוגמה, אם שני Project Owners מנסים לבצע שינויים מתנגשים במדיניות ההרשאה בו-זמנית, יכול להיות שהשינויים של אחד מהם לא יתבצעו. כדי לפתור את הבעיה הזו, ב-IAM משתמשים במאפיין etag במדיניות ההרשאות. המאפיין הזה בודק אם מדיניות ההרשאה השתנתה מאז הבקשה האחרונה. כששולחים בקשה עם ערך etag, המערכת משווה את הערך של etag בבקשה לערך הקיים של etag שמשויך למדיניות. כך, מדיניות ההרשאות נכתבת רק אם ערכי ה-etag תואמים.

כשאתם מעדכנים את מדיניות ההרשאות, אתם צריכים קודם לטעון אותה באמצעות getIamPolicy(), לבצע את השינויים ואז לכתוב את המדיניות המעודכנת באמצעות setIamPolicy(). כשמגדירים את מדיניות ההרשאות, משתמשים בערך etag רק אם מדיניות ההרשאות התואמת ב-GetPolicyResponse מכילה ערך etag.

Python

השיטה setIamPolicy() מאפשרת לצרף מדיניות הרשאה למשאב. ה-method ‏setIamPolicy מקבלת SetIamPolicyRequest, שמכיל את מדיניות ההרשאות שצריך להגדיר ואת המשאב שאליו מצורפת מדיניות ההרשאות. היא מחזירה את מדיניות ההרשאה שנוצרה. כשמעדכנים מדיניות הרשאה באמצעות setIamPolicy(), מומלץ לפעול לפי התבנית קריאה-שינוי-כתיבה.

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

crm = discovery.build(
    'cloudresourcemanager', 'v3', http=creds.authorize(httplib2.Http()))
policy = crm.organizations().getIamPolicy(
    resource=flags.organizationId, body={}).execute()

admin_binding = next(
    (binding
        for binding in policy['bindings']
        if binding['role'] == 'roles/resourcemanager.organizationAdmin'),
        None)

# Add an empty Organization Administrator binding if not present.
if not admin_binding:
    admin_binding = {
        'role': 'roles/resourcemanager.organizationAdmin',
        'members': []
    }
policy['bindings'].append(admin_binding)

# Add the new Admin (if necessary).
new_admin = 'user:' + flags.adminEmail
if new_admin not in admin_binding['members']:
    admin_binding['members'].append(new_admin)
policy = crm.organizations().setIamPolicy(
    resource=flags.organizationId,
    body={
        'resource': flags.organizationId,
        'policy': policy
    }).execute()

print json.dumps(policy, indent=2)

הגבלת החשיפה של פרויקטים למשתמשים

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

האילוץ constraints/resourcemanager.accessBoundaries של מדיניות הארגון הוא אילוץ רשימה שנאכף על משאב הארגון. האילוץ מקבל רשימה של מזהי משאבים של הארגון, שמגדירים את קבוצת המשאבים של הארגון שהמשאבים שלהם גלויים למשתמשים בשאילתה או במסוף Cloud de Confiance .

הפרויקטים מופיעים בקטע No organization אם למשתמש אין את ההרשאה resourcemanager.organizations.get במשאב של ארגון ההורה של הפרויקט. כך, פרויקט שלא שייך למשאב הארגון שלכם יכול להיראות כאילו הוא לא משויך לאף משאב ארגון. אם אתם משתמשים באילוץ resourcemanager.accessBoundaries כדי לא לאפשר משאב ארגוני, פרויקטים ששייכים למשאב הארגוני הזה לא יופיעו בשאילתות או במסוף Cloud de Confiance . אם תאכפו את המגבלה הזו, לא תוכלו לראות פרויקטים שעדיין לא הועברו למשאב ארגוני.

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

למידע על הגדרת מדיניות ארגון, ראו שימוש באילוצים.

הענקת גישה מותנית

יש תפקידי IAM, כמו אדמין של מדיניות הארגון (roles/orgpolicy.policyAdmin), שאפשר להקצות רק למשאב ארגון. בגלל ירושת המדיניות, כל המשאבים בארגון בדרך כלל מקבלים בירושה את התפקיד הזה.

כדי לקבל שליטה רבה יותר על המשאבים שבהם מוקצה התפקיד, אתם יכולים להשתמש בתנאי IAM. שימוש בתגים עם תנאים מאפשר לכם לתת גישה למשאבים רק אם יש להם את התג שצוין. לדוגמה, מדיניות ההרשאות הבאה מקצה את התפקיד "אדמין של מדיניות הארגון" רק למשאבים עם התג environment: dev, ולא מקצה אותו לאף משאב אחר:

{
  "bindings": [
    {
      "members": [
        "{dynamic print variables.examples.principal_group_api}"
      ],
      "role": "roles/orgpolicy.policyAdmin",
      "condition": {
          "title": "Dev_environment_only",
          "description": "Only granted in the development environment",
          "expression":
            "resource.matchTag('123456789012/env', 'dev')"
      }
    }
  ],
  "etag": "BwWKmjvelug=",
  "version": 3
}

בדיקת ההרשאות

אפשר לבדוק את הרשאות ה-IAM של משתמש במשאב ארגוני באמצעות ה-method‏ testIamPermissions(). השיטה הזו מקבלת את כתובת ה-URL של המשאב ואת קבוצת ההרשאות שרוצים לבדוק. היא מחזירה את קבוצת המשנה של ההרשאות האלה שהמשתמש יכול לגשת אליהן.

בדרך כלל לא מפעילים את testIamPermissions() אם משתמשים ישירות במסוףCloud de Confiance כדי לנהל הרשאות. ‫testIamPermissions() מיועד לשילוב עם התוכנה הקניינית שלכם, כמו ממשק משתמש גרפי בהתאמה אישית. לדוגמה, במסוף Cloud de Confiance משתמשים ב-testIamPermissions() כדי לקבוע איזה ממשק משתמש יהיה זמין למשתמש שמחובר לחשבון.

API

אפשר להשתמש ב-method‏ testIamPermissions() כדי לבדוק אילו מההרשאות הנתונות יש למבצע הקריאה החוזרת במשאב הנתון. ה-method הזו מקבלת שם משאב וקבוצת הרשאות כפרמטרים, ומחזירה את קבוצת המשנה של ההרשאות שיש למשתמש ששלח את הקריאה.

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

Request:

POST https://cloudresourcemanager.googleapis.com/v3/organizations/12345:testIamPermissions

{
    "permissions":  [
        "resourcemanager.organizations.get",
        "resourcemanager.organizations.setIamPolicy"
    ]
}

Response:

{
    "permissions": [
        "resourcemanager.organizations.get"
    ]
}

Python

crm = discovery.build(
    'cloudresourcemanager', 'v3', http=creds.authorize(httplib2.Http()))

response = crm.organizations().testIamPermissions(
    resource=flags.organizationId,
    body={
        'resource': flags.organizationId,
        'permissions': [
            'resourcemanager.organizations.setIamPolicy',
            'resourcemanager.projects.patch'
        ]
    }).execute()

print json.dumps(response, indent=2)