מדריך למתחילים: gcloud beta terraform vet

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

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

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

  • יש צורך בפרויקט ב-Google Cloud.
  • יש צורך בהרשאות הבאות בממשק של ניהול הזהויות והרשאות הגישה (IAM) לאותו פרויקט:

    • resourcemanager.projects.getIamPolicy – אפשר לתת את ההרשאה הזו עם התפקיד Security Reviewer (בדיקת אבטחה) לארגון.
    • Resourcemanager.projects.get – אפשר לתת את ההרשאה הזו עם התפקיד Project Viewer (צפייה בפרויקט) לארגון.

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

מדריך למתחילים

  1. נכנסים ל-Cloud Shell ומשכפלים את ספריית המדיניות.

    לשכפול ספריית המדיניות

  2. מעתיקים לספרייה policies/constraints את דוגמת האילוץ לדומיין ב-IAM.

    cp samples/iam_service_accounts_only.yaml policies/constraints
    
  3. כדי לבדוק את האילוץ שהועתק אפשר להדפיס אותו במסוף.

    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.

  4. כדי לוודא שהמדיניות נאכפת, משתמשים בפקודה הבאה ויוצרים את הקובץ 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.
  5. מפעילים את Terraform ויוצרים תוכנית ב-Terraform באמצעות הקוד הבא:

    terraform init
    
  6. מייצאים את התוכנית מ-Terraform, וכשמוצגת הבקשה לוחצים על Authorize:

    terraform plan -out=test.tfplan
    
  7. ממירים את התוכנית מ-Terraform לקובץ JSON:

    terraform show -json ./test.tfplan > ./tfplan.json
    
  8. מתקינים את הרכיב terraform-tools:

    sudo apt-get install google-cloud-sdk-terraform-tools
    
  9. מזינים את הפקודה הבאה כדי לאמת שהתוכנית ב-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"
    }
    ]
    
  10. כדי לאפשר דומיין נוסף (כתובת האימייל שלכם), עורכים את 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
    
  11. עכשיו מאמתים שוב את התוכנית ב-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.