לפני שמתחילים
התקנת Google Cloud CLI
כדי שתוכלו להשתמש ב-gcloud beta terraform vet תחילה עליכם להתקין את Google Cloud CLI:
מתקינים את Google Cloud CLI אבל מדלגים על הפקודה
gcloud init.מריצים את הפקודות הבאות כדי להתקין את הרכיב terraform-tools:
gcloud components update gcloud components install terraform-toolsמריצים את הפקודה הבאה כדי לוודא שה-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.