במדריך הזה מוסבר איך להגדיר ולבדוק מדיניות של Binary Authorization שדורשת אימותים (attestations). סוג המדיניות הזה מאבטח את שרשרת אספקת התוכנה שמבוססת על קונטיינרים, על ידי הגדרת האנשים שיכולים לפרוס קובצי אימג' של קונטיינרים ב-Google Kubernetes Engine (GKE) וקובצי האימג' של הקונטיינרים שמותר ל-GKE לפרוס.
בזמן הפריסה, Binary Authorization משתמש בגורמים מאמתים כדי לאמת חתימות דיגיטליות באישורים. האישורים נוצרו על ידי חותמים כחלק מתהליך הבנייה.
במדריך הזה, אשכול GKE, האישורים והמאמתים ממוקמים כולם בפרויקט אחד. הגדרה של פרויקט יחיד שימושית בעיקר לבדיקה או להתנסות בשירות. דוגמה יותר מציאותית מופיעה במאמר בנושא הגדרות של כמה פרויקטים.
בשלבים הבאים מוסבר איך לבצע משימות במסוף Google Cloud ואיך לבצע משימות באמצעות פקודות gcloud. כדי לבצע את השלבים האלה באמצעות gcloud, אפשר לעיין במאמר תחילת העבודה עם Google Cloud CLI.
מטרות
במדריך הזה תלמדו איך:
- יצירת אשכול (GKE) עם Binary Authorization מופעל
- יוצרים גורם מאמת (attestor) שהמערכת לאכיפת Binary Authorization משתמשת בו כדי לאמת את החתימה על אימות (attestation)
- הגדרת מדיניות שדורשת אישור
- יצירת זוג מפתחות קריפטוגרפיים לחתימה על אישורים ולאימות שלהם בהמשך
- חתימה על תקציר של קובץ אימג' של קונטיינר ליצירת חתימה
- יצירת אישור באמצעות החתימה
- בדיקת המדיניות על ידי פריסת קובץ אימג' של קונטיינר ב-GKE
עלויות
במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:
כדי ליצור הערכת עלויות בהתאם לשימוש החזוי, אתם יכולים להשתמש במחשבון התמחור.
לפני שמתחילים
- נכנסים לחשבון Google Cloud . אנחנו ממליצים למשתמשים חדשים ב- Google Cloud ליצור חשבון כדי שיוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Container Registry, Artifact Analysis and Binary Authorization APIs, if any are not already enabled.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.-
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init -
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Container Registry, Artifact Analysis and Binary Authorization APIs, if any are not already enabled.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.-
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init - מתקינים את
kubectl.
הגדרת פרויקט ברירת מחדל
כדי להקל על הפעלת הפקודות הבאות, מאחסנים את מזהה הפרויקט Google Cloud במשתנה סביבה באופן הבא:
PROJECT_ID=PROJECT_ID
כאשר PROJECT_ID הוא שם הפרויקט.
אם פרויקט ברירת המחדל לא נבחר, צריך להגדיר אותו עכשיו:
gcloud config set project ${PROJECT_ID}
יצירת אשכול עם Binary Authorization מופעל
יצירת האשכול
עכשיו אפשר ליצור אשכול GKE עם Binary Authorization מופעל. בדוגמה הזו, יוצרים אשכול בשם test-cluster באזור GKE us-central1-a.
כדי ליצור את האשכול, פועלים לפי השלבים הבאים:
נכנסים לתפריט GKE במסוף Google Cloud .
לוחצים על Create Cluster (יצירת אשכול).
מזינים
test-clusterבשדה שם.בוחרים באפשרות Zonal (אזורי) באפשרויות של Location type (סוג המיקום).
בתפריט הנפתח Zone, בוחרים באפשרות
us-central1-a.בחלונית הניווט, בקטע Cluster (אשכול), לוחצים על Advanced settings (הגדרות מתקדמות).
בשורה Binary authorization לוחצים על edit Edit configuration.
בוחרים באפשרות Binary Authorization.
בוחרים באפשרות אכיפה בלבד ואז לוחצים על שמירה.
לוחצים על יצירה.
הגדרה של kubectl
צריך גם לעדכן את קובץ kubeconfig המקומי בהתקנה של kubectl. הפעולה הזו מספקת את פרטי הכניסה ופרטי נקודת הקצה שנדרשים כדי לגשת לאשכול ב-GKE.
כדי לעדכן את קובץ kubeconfig המקומי:
gcloud container clusters get-credentials \
--zone us-central1-a \
test-cluster
הצגת מדיניות ברירת המחדל
מדיניות ב-Binary Authorization היא קבוצה של כללים שקובעים את הפריסה של קובצי אימג' של קונטיינרים. אפשר להגדיר מדיניות אחת לכל פרויקט. כברירת מחדל, המדיניות מוגדרת כך שניתן לפרוס את כל קובצי האימג' של קונטיינרים.
כדי לראות את מדיניות ברירת המחדל, פועלים לפי השלבים הבאים:
נכנסים לדף Binary Authorization במסוף Google Cloud .
לוחצים על עריכת המדיניות.
בקטע Project Default Rule, מוצגת האפשרות Allow All Images.
לוחצים על שמירת המדיניות.
יצירת גורם מאמת
גורם מאמת (attestor) הוא רשות האימות שמשמשת את הכלי לאכיפת Binary Authorization בזמן הפריסה כדי להחליט אם לאפשר ל-GKE לפרוס את קובץ אימג' של קונטיינר החתום המתאים. הגורם המאמת (attestor) מכיל את המפתח הציבורי ובדרך כלל מנוהל על ידי אנשים שאחראים על אבטחת שרשרת אספקת התוכנה.
כדי ליצור מאמת, צריך:
- יצירת המאמת עצמו ב-Binary Authorization
- יצירה אוטומטית של הערה משויכת של מאשר בArtifact Analysis כדי לאחסן מטא-נתונים מהימנים של אישור שמשמשים בתהליך ההרשאה
במדריך הזה יש גורם מאמת (attestor) אחד בשם test-attestor. בתרחיש מהעולם האמיתי, יכולים להיות כל מספר של מאמתים, כשכל אחד מהם מייצג צד שמשתתף בתהליך ההרשאה של התמונה.
יצירת זוג מפתחות
ב-Binary Authorization משתמשים במפתחות קריפטוגרפיים כדי לאמת בצורה מאובטחת את הזהות של חותמים. כך מוודאים שאפשר לפרוס רק קובצי אימג' מורשים של קונטיינרים. זוג המפתחות מורכב ממפתח פרטי וממפתח ציבורי. החותם משתמש במפתח הפרטי כדי לחתום על ה-digest של קובץ אימג' של קונטיינר, וכך נוצרת חתימה שנשמרת באישור. המפתח הציבורי מאוחסן במאמת. בזמן הפריסה, הכלי לאכיפת Binary Authorization משתמש במפתח הציבורי של גורם מאמת (attestor) כדי לאמת את החתימה באימות (attestation) לפני שהוא מאפשר את פריסת הקונטיינר.
במדריך הזה נשתמש בפורמט Public-Key Infrastructure (X.509) (PKIX) למפתחות קריפטוגרפיים. במדריך הזה נעשה שימוש באלגוריתם חתימה דיגיטלית של עקומות אליפטיות (ECDSA) המומלץ כדי ליצור זוג מפתחות PKIX. אפשר גם להשתמש במפתחות RSA או PGP לחתימה. מידע נוסף על אלגוריתמים לחתימה זמין במאמר מטרות ואלגוריתמים של מפתחות.
המפתחות שנוצרים ומאוחסנים על ידי Cloud Key Management Service (Cloud KMS) תואמים ל-PKIX. מידע נוסף על שימוש במפתחות PKIX וב-Cloud KMS זמין במאמר יצירת מאמתים באמצעות CLI.
כדי ליצור זוג מפתחות PKIX:
יוצרים את המפתח הפרטי:
PRIVATE_KEY_FILE="/tmp/ec_private.pem" openssl ecparam -genkey -name prime256v1 -noout -out ${PRIVATE_KEY_FILE}מחילוץ המפתח הציבורי מהמפתח הפרטי:
PUBLIC_KEY_FILE="/tmp/ec_public.pem" openssl ec -in ${PRIVATE_KEY_FILE} -pubout -out ${PUBLIC_KEY_FILE}
יצירת גורם מאמת
עכשיו אפשר ליצור את מאמת ההצהרות עצמו ב-Binary Authorization ולשייך אליו את המפתח הציבורי שיצרתם.
כדי ליצור את המאמת:
חוזרים לדף Binary Authorization במסוף Google Cloud .
בכרטיסייה Attestors, לוחצים על Create.
ממלאים את השדות לפי ההנחיות הבאות:
מזינים
test-attestorבשדה Attestor name.מוודאים שהתיבה יצירת הערה של ניתוח ארטיפקט באופן אוטומטי מסומנת.
לוחצים על הוספת מפתח ציבורי של PKIX.
פותחים את
/tmp/ec_public.pemבכלי לעריכת טקסט. זהו קובץ המפתח הציבורי שיצרתם בשלב הקודם. מעתיקים את התוכן של הקובץ לתיבת הטקסט Public key material.לוחצים על
Elliptic Curve P-256 - SHA256 Digestבתפריט הנפתח אלגוריתם חתימה.לוחצים על סיום.
לוחצים על יצירה כדי ליצור את הגורם המאשר.
מאחסנים את מזהה המפתח הציבורי.
כדי להציג את מזהה המפתח הציבורי של הגורם המאשר אחרי שמוסיפים אותו לגורם המאשר, משתמשים בפונקציה
gcloud container binauthz attestors describe ${ATTESTOR_NAME}. כדי ליצור משתנה סביבה לאחסון מזהה המפתח הציבורי, מריצים את הפקודה הבאה:ATTESTOR_NAME=test-attestor PUBLIC_KEY_ID=$(gcloud container binauthz attestors describe ${ATTESTOR_NAME}\ --format='value(userOwnedGrafeasNote.publicKeys[0].id)')
הגדרת המדיניות
עכשיו אפשר להגדיר את המדיניות:
חוזרים לדף Binary Authorization במסוף Google Cloud .
בכרטיסייה מדיניות, לוחצים על עריכת המדיניות.
בוחרים באפשרות Allow Only Images That Have Been Approved By the Following Attestors (אפשר להעלות רק תמונות שאושרו על ידי הגורמים הבאים).
לוחצים על הוספת מאשרים.
לוחצים על הוספה לפי שם הפרויקט והמאשר.
מזינים PROJECT_ID בשדה Project name (שם הפרויקט).
מזינים
test-attestorבשדה Attestor name.לוחצים על הוספת מאשר אחד.
לוחצים על שמירת המדיניות.
מידע נוסף זמין במאמר בנושא הגדרת מדיניות באמצעות המסוף.
בדיקת המדיניות
כדי לבדוק את המדיניות שהגדרתם למעלה, נסו לפרוס קובץ אימג' לדוגמה של קונטיינר באשכול. המדיניות תחסום את הפריסה כי לא בוצעה האימות הנדרש.
במדריך הזה אפשר להשתמש בתמונות לדוגמה מ-Artifact Registry. התמונה מ-Artifact Registry נמצאת בנתיב us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0.
הנתיב מכיל תמונה ציבורית שנוצרה על ידי Google, שכוללת אפליקציית דוגמה עם הכיתוב Hello,
World!.
כדי לנסות לפרוס את האימג', מריצים את הפקודה הבאה:
kubectl run hello-server --image us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 --port 8080
עכשיו, מוודאים שהפריסה נחסמה על ידי Binary Authorization:
kubectl get pods
הפקודה מדפיסה את ההודעה הבאה, שמציינת שהתמונה לא נפרסה:
No resources found.
אפשר לקבל פרטים נוספים על הפריסה:
kubectl get event --template \
'{{range.items}}{{"\033[0;36m"}}{{.reason}}:{{"\033[0m"}}\{{.message}}{{"\n"}}{{end}}'
תופיע תגובה שדומה לתגובה הבאה:
FailedCreate: Error creating: pods POD_NAME is forbidden: admission webhook "imagepolicywebhook.image-policy.k8s.io" denied the request: Image IMAGE_NAME denied by Binary Authorization default admission rule. Image IMAGE_NAME denied by ATTESTOR_NAME: No attestations found
בפלט הזה:
- POD_NAME: שם ה-Pod.
- IMAGE_NAME: שם התמונה.
- ATTESTOR_NAME: השם של הגורם המאמת.
חשוב למחוק את הפריסה כדי להמשיך לשלב הבא:
kubectl delete deployment hello-server
יצירת אישור
אישור הוא מסמך דיגיטלי שנוצר על ידי חותם ומאשר של-GKE מותר לפרוס את קובץ האימג' של הקונטיינר המשויך. תהליך יצירת האישור נקרא לפעמים 'חתימה על תמונה'.
במדריך הזה יוצרים אישור לתמונות לדוגמה מ-Artifact Registry.
כדי ליצור אישור:
מגדירים משתנים שמאחסנים את נתיב המרשם ואת ה-digest של התמונה, ואת שם המאשר:
Artifact Registry
IMAGE_PATH="us-docker.pkg.dev/google-samples/containers/gke/hello-app" IMAGE_DIGEST="sha256:37e5287945774f27b418ce567cd77f4bbc9ef44a1bcd1a2312369f31f9cce567" ATTESTOR="test-attestor" IMAGE_TO_ATTEST=${IMAGE_PATH}@${IMAGE_DIGEST}יוצרים את המטען הייעודי (payload) של האימות:
Artifact Registry
gcloud container binauthz create-signature-payload \ --artifact-url=${IMAGE_PATH}@${IMAGE_DIGEST} > /tmp/generated_payload.jsonקובץ ה-JSON של ה-payload מכיל את הפרטים הבאים:
{ "critical": { "identity": { "docker-reference": "us-docker.pkg.dev/google-samples/containers/gke/hello-app" }, "image": { "docker-manifest-digest": "sha256:37e5287945774f27b418ce567cd77f4bbc9ef44a1bcd1a2312369f31f9cce567" }, "type": "Google cloud binauthz container signature" } }חותמים על מטען הייעודי (payload) באמצעות המפתח הפרטי של PKIX ומפיקים קובץ חתימה:
openssl dgst -sha256 -sign ${PRIVATE_KEY_FILE} /tmp/generated_payload.json > /tmp/ec_signatureקובץ החתימה הוא גרסה חתומה דיגיטלית של קובץ ה-JSON של המטען הייעודי (payload) שיצרתם למעלה.
יצירה ואימות של האישור:
gcloud container binauthz attestations create \ --project="${PROJECT_ID}" \ --artifact-url="${IMAGE_TO_ATTEST}" \ --attestor="projects/${PROJECT_ID}/attestors/${ATTESTOR_NAME}" \ --signature-file=/tmp/ec_signature \ --public-key-id="${PUBLIC_KEY_ID}" \ --validate
PUBLIC_KEY_IDהוא מזהה המפתח הציבורי שמצאתם בקטע יצירת זוג מפתחות PKIX שלמעלה.הדגל
validateבודק שאפשר לאמת את האישור על ידי המאשר שהגדרתם במדיניות.מוודאים שהאישור נוצר:
gcloud container binauthz attestations list \ --attestor=$ATTESTOR_NAME --attestor-project=$PROJECT_ID
מידע נוסף על יצירת אישורים זמין במאמר בנושא יצירת אישורים.
בדיקה מחדש של המדיניות
שוב, בודקים את המדיניות על ידי פריסת קובץ אימג' של קונטיינר לדוגמה באשכול.
הפעם, צריך לפרוס את התמונה באמצעות ה-digest ולא באמצעות תג כמו
1.0 או latest, כי Binary Authorization ישתמש ב-digest כדי לחפש אישורים. כאן, Binary Authorization מאפשר לפרוס את התמונה כי בוצע האימות הנדרש.
כדי לפרוס את האימג', מריצים את הפקודה הבאה:
kubectl run hello-server --image ${IMAGE_PATH}@${IMAGE_DIGEST} --port 8080
כדי לוודא שהתמונה נפרסה, מריצים את הפקודה הבאה:
kubectl get pods
הפקודה תציג הודעה דומה להודעה הבאה, שמציינת שהפריסה בוצעה בהצלחה:
NAME READY STATUS RESTARTS AGE hello-server-579859fb5b-h2k8s 1/1 Running 0 1m
כדי למחוק את ה-Pod, מריצים את הפקודה הבאה:
kubectl delete pod hello-server
הסרת המשאבים
כדי להימנע מחיובים בחשבון Google Cloud בגלל השימוש במשאבים שנעשה במסגרת המדריך הזה, אפשר למחוק את הפרויקט שמכיל את המשאבים או להשאיר את הפרויקט ולמחוק את המשאבים בנפרד.
מוחקים את האשכול שיצרתם ב-GKE:
gcloud container clusters delete \
--zone=us-central1-a \
test-cluster
המאמרים הבאים
- מידע נוסף על Binary Authorization
- מושגים מרכזיים שמשמשים ב-Binary Authorization
- משתמשים ב
built-by-cloud-buildגורם מאמת (attestor) כדי לפרוס רק קובצי אימג' שנוצרו על ידי Cloud Build. - איך משתמשים ב-image digests במניפסטים של Kubernetes
- הפעלה של מצב פרימטר לבדיקות כדי להשבית את האכיפה