במדריך למתחילים נסביר איך משתמשים באילוץ לאכיפת מגבלה על דומיין. נבדוק את האילוץ הזה ונגרום לשגיאה מכוּונת. לאחר מכן נשנה את האילוץ כדי שהדומיין יעבור את הבדיקה.
לפני שמתחילים
- צריך פרויקט ב-Google Cloud .
יש צורך בהרשאות הבאות בממשק של ניהול הזהויות והרשאות הגישה (IAM) לאותו פרויקט:
resourcemanager.projects.getIamPolicy– אפשר לתת את ההרשאה הזו עם התפקיד Security Reviewer (בדיקת אבטחה) לארגון.resourcemanager.projects.get– אפשר לתת את ההרשאה הזו עם התפקיד Project Viewer (צפייה בפרויקט) לארגון.
כדי שתוכלו להתחיל בקלות, השתמשנו בהוראות האלה ב-Cloud Shell, שמותקן מראש ב-Terraform, ובמאגר משוכפל של ספריית המדיניות. אנחנו יוצאים מנקודת הנחה שכבר יש לכם חשבון Google Cloud .
מדריך למתחילים
נכנסים ל-Cloud Shell ומשכפלים את ספריית המדיניות.
מעתיקים לספרייה
policies/constraintsאת דוגמת האילוץ לדומיין ב-IAM.cp samples/iam_service_accounts_only.yaml policies/constraintsכדי לבדוק את האילוץ שהועתק אפשר להדפיס אותו במסוף.
cat policies/constraints/iam_service_accounts_only.yamlהפלט אמור להיראות כך:
# This constraint checks that all IAM policy members are in the # "gserviceaccount.com" domain. apiVersion: constraints.gatekeeper.sh/v1alpha1 kind: GCPIAMAllowedPolicyMemberDomainsConstraintV2 metadata: name: service_accounts_only annotations: description: Checks that members that have been granted IAM roles belong to allowlisted domains. spec: severity: high match: target: # {"$ref":"#/definitions/io.k8s.cli.setters.target"} - "organizations/**" parameters: domains: - gserviceaccount.comשימו לב לדומיין
gserviceaccount.comלמטה. רק משתמשים מהדומייןgserviceaccount.comיכולים להופיע במדיניות של IAM.כדי לוודא שהמדיניות נאכפת, משתמשים בפקודה הבאה ויוצרים את הקובץ
main.tfב-Terraform בספרייה הנוכחית. כדי ליצור אתpolicy-library/main.tfתוכלו להשתמש ב-nano, ב-vim או בעורך של Cloud Shell.terraform { required_providers { google = { source = "hashicorp/google" version = "~> 3.84" } } } resource "google_project_iam_binding" "sample_iam_binding" { project = "PROJECT_ID" role = "roles/viewer" members = [ "user:EMAIL_ADDRESS" ] }מחליפים את מה שכתוב בשדות הבאים:
PROJECT_ID: מזהה הפרויקט.EMAIL_ADDRESS: כתובת אימייל לדוגמה. זו יכולה להיות כל כתובת, כל עוד היא תקינה. לדוגמה:user@example.com.
מפעילים את Terraform ויוצרים תוכנית ב-Terraform באמצעות הקוד הבא:
terraform initמייצאים את התוכנית מ-Terraform, וכשמוצגת הבקשה לוחצים על Authorize:
terraform plan -out=test.tfplanממירים את התוכנית מ-Terraform לקובץ JSON:
terraform show -json ./test.tfplan > ./tfplan.jsonמתקינים את הרכיב terraform-tools:
sudo apt-get install google-cloud-sdk-terraform-toolsמזינים את הפקודה הבאה כדי לאמת שהתוכנית ב-Terraform תואמת את המדיניות:
gcloud beta terraform vet tfplan.json --policy-library=. --format=jsonמכיוון שכתובת האימייל שסיפקנו בקישור למדיניות של IAM לא שייכת לחשבון שירות, התוכנית מפירה את האילוץ שהגדרנו.
[ { "constraint": "GCPIAMAllowedPolicyMemberDomainsConstraintV2.service_accounts_only", "constraint_config": { "api_version": "constraints.gatekeeper.sh/v1alpha1", "kind": "GCPIAMAllowedPolicyMemberDomainsConstraintV2", "metadata": { "annotations": { "description": "Checks that members that have been granted IAM roles belong to allowlisted domains.", "validation.gcp.forsetisecurity.org/originalName": "service_accounts_only", "validation.gcp.forsetisecurity.org/yamlpath": "policies/constraints/iam_service_accounts_only.yaml" }, "name": "service-accounts-only" }, "spec": { "match": { "target": [ "organizations/**" ] }, "parameters": { "domains": [ "gserviceaccount.com" ] }, "severity": "high" } }, "message": "IAM policy for //cloudresourcemanager.googleapis.com/projects/PROJECT_ID contains member from unexpected domain: user:user@example.com", "metadata": { "ancestry_path": "organizations/ORG_ID/projects/PROJECT_ID", "constraint": { "annotations": { "description": "Checks that members that have been granted IAM roles belong to allowlisted domains.", "validation.gcp.forsetisecurity.org/originalName": "service_accounts_only", "validation.gcp.forsetisecurity.org/yamlpath": "policies/constraints/iam_service_accounts_only.yaml" }, "labels": {}, "parameters": { "domains": [ "gserviceaccount.com" ] } }, "details": { "member": "user:user@example.com", "resource": "//cloudresourcemanager.googleapis.com/projects/PROJECT_ID" } }, "resource": "//cloudresourcemanager.googleapis.com/projects/PROJECT_ID", "severity": "high" } ]
כדי לאפשר דומיין נוסף (כתובת האימייל שלכם), עורכים את
policy-library/policies/constraints/iam_service_accounts_only.yamlולרשימת הדומיינים המותרים מוסיפים את הדומיין של כתובת האימייל. בדוגמה הבאה הוספנו אתexample.com, אבל בפועל תצטרכו להזין את הדומיין של כתובת האימייל שלכם:apiVersion: constraints.gatekeeper.sh/v1alpha1 kind: GCPIAMAllowedPolicyMemberDomainsConstraintV1 metadata: name: service_accounts_only spec: severity: high match: target: ["organizations/**"] parameters: domains: - gserviceaccount.com - example.comעכשיו מאמתים שוב את התוכנית ב-Terraform. לא אמורה להיות הפרה:
gcloud beta terraform vet tfplan.json --policy-library=. --format=jsonהפלט אמור להיראות כך:
[]
פתרון בעיות
אם מתקבלת הודעת השגיאה "Error 403: The caller does not have permission, forbidden", סימן שלא החלפתם את PROJECT_ID בשדה policy-library/main.tf בשם הפרויקט שלכם או שאין לכם את ההרשאות הנדרשות בפרויקט שציינתם.
אחרי עריכת שם הפרויקט או ההרשאות (resourcemanager.projects.getIamPolicy ו-resourcemanager.projects.get), תוכלו לחזור אחורה, לייצא שוב את התוכנית מ-Terraform ולהמיר אותה לקובץ JSON.