בדף הזה מוסבר איך אפשר לאבטח פריסות של תמונות ב-Cloud Run וב-Google Kubernetes Engine באמצעות Cloud Build.
כך מגדירים את Binary Authorization כדי לבדוק הצהרות על build ולחסום פריסות של תמונות שלא נוצרו על ידי Cloud Build. התהליך הזה יכול לצמצם את הסיכון לפריסת תוכנות לא מורשות.
לפני שמתחילים
מפעילים את Cloud Build API, Binary Authorization API ו-Artifact Registry API, אם הם עדיין לא מופעלים.
תפקידים שנדרשים להפעלת ממשקי API
כדי להפעיל ממשקי API, נדרשת ההרשאה
serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד 'בעלים' (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד 'אדמין בממשק Service Usage' (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידיםכדי להשתמש בדוגמאות של שורת הפקודה במדריך הזה, צריך להתקין ולהגדיר את Google Cloud SDK.
שליטה בפריסות באמצעות Binary Authorization
מדיניות ב-Binary Authorization היא קבוצה של כללים ששולטים בפריסת תמונות. אתם יכולים להגדיר כלל שידרוש אישורים עם חתימה דיגיטלית.
Cloud Build יוצר וחותם על אישורים בזמן הבנייה. באמצעות built-by-cloud-build Binary Authorization, אפשר לאמת את ההצהרות ולפרוס רק קובצי אימג' שנוצרו על ידי Cloud Build.
כדי ליצור את built-by-cloud-build מאמת החתימה בפרויקט, מריצים build בפרויקט הזה.
כדי לאפשר פריסה רק של תמונות שנבנו על ידי Cloud Build, מבצעים את השלבים הבאים:
המסוף
נכנסים לדף Binary Authorization במסוף Google Cloud :
בכרטיסייה מדיניות, לוחצים על עריכת המדיניות.
בתיבת הדו-שיח Edit Policy (עריכת מדיניות), בוחרים באפשרות Allow only images that have been approved by all of the following attestors (אפשר להשתמש רק בתמונות שאושרו על ידי כל המאשרים הבאים).
לוחצים על הוספת מאשרים.
בתיבת הדו-שיח הוספת מאשרים:
- בוחרים באפשרות Add by project and attestor name ומבצעים את השלבים הבאים:
- בשדה Project name, מזינים את הפרויקט שבו מריצים את Cloud Build.
- לוחצים על השדה שם המאשר ורואים שהמאשר
built-by-cloud-buildזמין. - לחץ על
built-by-cloud-build.
אפשרות אחרת היא ללחוץ על הוספה לפי מזהה משאב של גורם מאמת (attestor). בשדה מזהה משאב המאמת, מזינים
projects/PROJECT_ID/attestors/built-by-cloud-buildמחליפים את
PROJECT_IDבפרויקט שבו מריצים את Cloud Build.
- בוחרים באפשרות Add by project and attestor name ומבצעים את השלבים הבאים:
לוחצים על הוספת מאמת אחד.
לוחצים על שמירת המדיניות.
gcloud
מייצאים את המדיניות הקיימת לקובץ באמצעות הפקודה הבאה:
gcloud container binauthz policy export > /tmp/policy.yamlעורכים את קובץ המדיניות.
עורכים אחד מהכללים הבאים:
defaultAdmissionRuleclusterAdmissionRulesistioServiceIdentityAdmissionRuleskubernetesServiceAccountAdmissionRules
אם עדיין לא קיים בלוק
requireAttestationsByבכלל, מוסיפים אותו.בבלוק
requireAttestationsBy, מוסיפיםprojects/PROJECT_ID/attestors/built-by-cloud-buildמחליפים את
PROJECT_IDבפרויקט שבו מריצים את Cloud Build.שומרים את קובץ המדיניות.
מייבאים את קובץ המדיניות.
gcloud container binauthz policy import /tmp/policy.yamlקובץ מדיניות לדוגמה שמכיל את ההפניה אל
built-by-cloud-build-attestor:defaultAdmissionRule: evaluationMode: REQUIRE_ATTESTATION enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG requireAttestationsBy: - projects/PROJECT_ID/attestors/built-by-cloud-build name: projects/PROJECT_ID/policyמחליפים את
PROJECT_IDבמזהה הפרויקט שבו מריצים את Cloud Build.
אפשר לראות שגיאות במדיניות בהודעות היומן של Binary Authorization עבור GKE או Cloud Run.
שימוש במצב פרימטר לבדיקות
במצב פרימטר לבדיקות, Binary Authorization בודק את התאימות למדיניות בלי לחסום את הפריסה בפועל. במקום זאת, הודעות הסטטוס של התאימות למדיניות נרשמות ב-Cloud Logging. אפשר להשתמש ביומנים האלה כדי לקבוע אם מדיניות החסימה פועלת בצורה תקינה וכדי לזהות תוצאות חיוביות שגויות.
כדי להפעיל הרצה יבשה:
המסוף
נכנסים לדף Binary Authorization במסוף Google Cloud .
לוחצים על עריכת המדיניות.
בכלל ברירת המחדל או בכלל ספציפי, בוחרים באפשרות מצב הרצה יבשה.
לוחצים על שמירת המדיניות.
gcloud
מייצאים את המדיניות של Binary Authorization לקובץ YAML:
gcloud container binauthz policy export > /tmp/policy.yamlבכלי לעריכת טקסט, מגדירים את
enforcementModeל-DRYRUN_AUDIT_LOG_ONLYושומרים את הקובץ.כדי לעדכן את המדיניות, מייבאים את הקובץ על ידי הפעלת הפקודה הבאה:
gcloud container binauthz policy import /tmp/policy.yaml
אפשר לראות שגיאות במדיניות בהודעות היומן של Binary Authorization ב-GKE או ב-Cloud Run
מגבלות
שירותי Cloud Build ו-Binary Authorization צריכים להיות באותו פרויקט. אם אתם מריצים את פלטפורמת הפריסה בפרויקט אחר, אתם צריכים להגדיר תפקידי IAM עבור הגדרה של כמה פרויקטים, ולהפנות לפרויקט Cloud Build כשמוסיפים את מאמת
built-by-cloud-buildב-Binary Authorization.Cloud Build לא יוצר אישורים כשמעבירים בדחיפה קובצי אימג' ל-Artifact Registry באמצעות שלב build מפורש
docker push. חשוב לוודא שאתם מעבירים בדחיפה ל-Artifact Registry באמצעות השדהimagesבשלב ה-build שלdocker build. מידע נוסף עלimagesזמין במאמר דרכים שונות לאחסון תמונות ב-Artifact Registry.צריך להשתמש בקובצי הגדרות נפרדים לבנייה עבור צינור הבנייה וצינור הפריסה. הסיבה לכך היא ש-Cloud Build יוצר אישורים רק אחרי שצינור ה-Build מסתיים בהצלחה. לאחר מכן, Binary Authorization יבדוק את האישור לפני פריסת התמונה.
הפעלת אישורים בבריכות פרטיות
כברירת מחדל, Cloud Build לא יוצר אישורים של Binary Authorization עבור build במאגרי build פרטיים. כדי ליצור אישורים, מוסיפים את האפשרות requestedVerifyOption: VERIFIED לקובץ הגדרות ה-build:
steps:
- name: 'gcr.io/cloud-builders/docker'
args: [ 'build', '-t', 'us-central1-docker.pkg.dev/$PROJECT_ID/quickstart-docker-repo/quickstart-image:tag1', '.' ]
images:
- 'us-central1-docker.pkg.dev/$PROJECT_ID/quickstart-docker-repo/quickstart-image:tag1'
options:
requestedVerifyOption: VERIFIED
אחרי שמוסיפים את requestedVerifyOption, Cloud Build מפעיל יצירת אישורים ומטא-נתונים של מקור לתמונה.
צפייה במטא-נתונים של גורם מאמת
גורם מאמת (attestor) נוצר בפעם הראשונה שמריצים build בפרויקט. מזהה המאשר הוא מהצורה projects/PROJECT_ID/attestors/built-by-cloud-build, כאשר PROJECT_ID הוא מזהה הפרויקט.
ניתן לבדוק את המטא-נתונים של גורם מאמת (attestor) הבנייה באמצעות הפקודה הבאה:
curl -X GET -H "Content-Type: application/json" \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
https://binaryauthorization.googleapis.com/v1beta1/projects/PROJECT_ID/attestors/built-by-cloud-build
מחליפים את PROJECT_ID בפרויקט שבו מריצים את Cloud Build.
הפלט מכיל מידע על הגורם המעיד ועל המפתחות הציבוריים התואמים. לדוגמה:
name": "projects/PROJECT_ID/attestors/built-by-cloud-build",
"userOwnedDrydockNote": {
"noteReference": "projects/PROJECT_ID/notes/built-by-cloud-build",
"publicKeys": [
{
"id": "//cloudkms.googleapis.com/v1/projects/verified-builder/locations/asia/keyRings/attestor/cryptoKeys/builtByGCB/cryptoKeyVersions/1",
"pkixPublicKey": {
"publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEMMvFxZLgIiWOLIXsaTkjTmOKcaK7\neIZrgpWHpHziTFGg8qyEI4S8O2/2wh1Eru7+sj0Sh1QxytN/KE5j3mTvYA==\n-----END PUBLIC KEY-----\n",
"signatureAlgorithm": "ECDSA_P256_SHA256"
}
},
...
}
],
"delegationServiceAccountEmail": "service-942118413832@gcp-binaryauthorization.iam.gserviceaccount.com"
},
"updateTime": "2021-09-24T15:26:44.808914Z",
"description": "Attestor autogenerated by build ID fab07092-30f4-4f70-caf7-4545cbc404d6"