אימות המדיניות

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

התקנת Google Cloud CLI

כדי שתוכלו להשתמש ב-gcloud beta terraform vet תחילה עליכם להתקין את Google Cloud CLI:

  1. מתקינים את Google Cloud CLI אבל מדלגים על הפקודה gcloud init.

  2. מריצים את הפקודות הבאות כדי להתקין את הרכיב terraform-tools:

    gcloud components update
    gcloud components install terraform-tools
    
  3. מריצים את הפקודה הבאה כדי לוודא שה-CLI של gcloud מותקן:

    gcloud beta terraform vet --help
    

קבלת ההרשאות הנדרשות

לחשבון Google Cloud שבו משתמשים לאימות צריכות להיות ההרשאות הבאות:

  • getIamPolicy: ב-gcloud beta terraform vet יש צורך בגישה מלאה לכללי המדיניות של ניהול הזהויות והרשאות הגישה, וביכולת למזג אותן עם המשתמשים והקישורים, כדי לאמת במדויק את המצב הסופי.
  • resourcemanager.projects.get: ב-gcloud beta terraform vet יש צורך בישויות האב של הפרויקטים מה-API, כדי ליצור במדויק שמות נכסים מלאים ב-CAI לכל פרויקט שבו רוצים לאמת את המשאבים.
  • resourcemanager.folders.get: ב-gcloud beta terraform vet יש צורך בישויות האב של התיקיות מה-API, כדי ליצור במדויק שמות נכסים מלאים ב-CAI אם המשאב שאותו רוצים לאמת כולל משאבים שקשורים לתיקיות.

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

כדי להשתמש בכלי הזה צריך ליצור ספריית מדיניות.

אימות המדיניות

1. יוצרים תוכנית ב-Terraform

gcloud beta terraform vet תואם ל-Terraform 0.12 וגרסאות חדשות יותר. הקלט של gcloud beta terraform vet צריך להיות terraform plan בקובץ JSON. כדי ליצור את קובץ ה-JSON אפשר להריץ את הפקודות הבאות בספריית Terraform:

terraform plan -out=tfplan.tfplan
terraform show -json ./tfplan.tfplan > ./tfplan.json

2. מריצים את gcloud beta terraform vet

ב-gcloud beta terraform vet אפשר לאמת את קובץ ה-JSON terraform plan בהתאם לספריית POLICY_LIBRARY_REPO של הארגון. לדוגמה:

git clone POLICY_LIBRARY_REPO POLICY_LIBRARY_DIR
gcloud beta terraform vet tfplan.json --policy-library=POLICY_LIBRARY_DIR

כשמריצים את הפקודה הזו, נתוני הפרויקט מאוחזרים ב-gcloud beta terraform vet באמצעות ממשקי ה-API שנדרשים לאימות מדויק של התוכנית. Google Cloud

דגלים

  • --policy-library=POLICY_LIBRARY_DIR – הספרייה שמכילה את ספריית המדיניות.
  • --project=PROJECT_ID – ב-gcloud beta terraform vet אפשר להשתמש בדגל האופציונלי --project. הדגל הזה מציין את פרויקט ברירת המחדל כשיוצרים את ישויות האב (מהיררכיית המשאבים של Google Cloud ) לכל משאב שלא הוגדר לו פרויקט מפורש.
  • --format=FORMAT – ברירת המחדל היא yaml. הפורמטים הנתמכים הם default, ‏json, ‏none, ‏text ו-yaml. לפרטים נוספים, אפשר להריץ את הפקודה ‎$gcloud topic formats‎.

קוד יציאה ופלט

  • אם כל האילוצים מאומתים, הפקודה תחזיר את קוד היציאה ולא יהיו הפרות.
  • אם יימצאו הפרות, gcloud beta terraform vet יחזיר את קוד היציאה 2 ותופיע רשימת הפרות. לדוגמה, פלט ה-JSON יכול להיראות כך:
[
  {
    "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:me@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:me@example.com",
        "resource": "//cloudresourcemanager.googleapis.com/projects/PROJECT_ID"
      }
    },
    "resource": "//cloudresourcemanager.googleapis.com/projects/PROJECT_ID",
    "severity": "high"
  }
]

דוגמה ל-CI/CD

סקריפט bash לשימוש ב-gcloud beta terraform vet בצינור עיבוד נתונים של CI/CD עשוי להיראות כך:

terraform plan -out=tfplan.tfplan
terraform show -json ./tfplan.tfplan > ./tfplan.json
git clone POLICY_LIBRARY_REPO POLICY_LIBRARY_DIR
VIOLATIONS=$(gcloud beta terraform vet tfplan.json --policy-library=POLICY_LIBRARY_DIR --format=json)
retVal=$?
if [ $retVal -eq 2 ]; then
  # Optional: parse the VIOLATIONS variable as json and check the severity level
  echo "$VIOLATIONS"
  echo "Violations found; not proceeding with terraform apply"
  exit 1
fi
if [ $retVal -ne 0]; then
  echo "Error during gcloud beta terraform vet; not proceeding with terraform apply"
  exit 1
fi

echo "No policy violations detected; proceeding with terraform apply"

terraform apply

מפתחים יכולים להשתמש ב-gcloud beta terraform vet גם בסביבה המקומית כדי לבדוק את השינויים ב-Terraform, לפני הרצת צינור עיבוד הנתונים של CI/CD.