במסמך הזה מוסבר איך להגדיר Binary Authorization לאשכולות מקומיים שנוצרו כחלק מ-Google Distributed Cloud. בהמשך נסביר איך להגדיר מדיניות לדוגמה של Binary Authorization.
לפני שמתחילים
מוודאים שהאשכולות שלכם הם בגרסה נתמכת של Google Distributed Cloud. Binary Authorization תומך בסביבות הבאות.
Bare metal
Google Distributed Cloud 1.14 או 1.15. בגרסה 1.16 ואילך, אפשר להגדיר את Binary Authorization במהלך יצירה או עדכון של אשכול.
VMware
Distributed Cloud for VMware (Google Distributed Cloud) מגרסה 1.4 ואילך.
שירות Binary Authorization משתמש בכתובת IP חיצונית שאפשר לגשת אליה דרך חיבור אינטרנט רגיל. מגדירים את כללי חומת האש עבור HTTPS כדי לאפשר לאשכול המשתמשים גישה לנקודת הקצה
binaryauthorization.googleapis.com.Bare metal
VMware
אם רוצים להשתמש ביומני ביקורת של Cloud כדי להציג רשומות ביומן הביקורת, כולל רשומות מ-Binary Authorization עבור אשכולות מחוץ ל- Google Cloud, צריך להגדיר את יומני הביקורת של Cloud בהגדרות האשכול.
Bare metal
מגדירים יומני ביקורת בענן ב-Google Distributed Cloud.
VMware
מגדירים יומני ביקורת בענן ב-Google Distributed Cloud.
צריך להפעיל את Binary Authorization API באופן הבא:
עוברים אל Google Cloud המסוף.
ברשימה הנפתחת של הפרויקטים, בוחרים את פרויקט המארח של ה-Fleet. אפשר למצוא את זה בקטע
gkeConnectבקובץ ההגדרות של אשכול המשתמשים. זהו Google Cloud הפרויקט שמקשר את אשכול המשתמשים אל Google Cloud.
הגדרת Binary Authorization
בקטע הזה מוסבר איך להגדיר Binary Authorization באשכול המקומי.
ציון משתני סביבה להתקנה
כדי לציין את משתני הסביבה:
שימוש ב-Workload Identity
מציינים את פרויקט המארח של ה-Fleet:
export PROJECT_ID=PROJECT_IDמגדירים את מזהה החברות ב-Fleet למזהה האשכול:
מזהה החברות מופיע בעמודה
NAMEכשמריצים את הפקודהgcloud container fleet memberships list.export MEMBERSHIP_ID=CLUSTER_NAME
שימוש במפתח של חשבון שירות
מציינים את פרויקט המארח של ה-Fleet:
export PROJECT_ID=PROJECT_IDמחליפים את PROJECT_ID ב Google Cloud project בקטע
gkeConnectבקובץ התצורה של אשכול המשתמשים.מציינים את הנתיב של קובץ ה-kubeconfig של אשכול המשתמשים:
export KUBECONFIG=PATHמחליפים את PATH בנתיב של קובץ ה-kubeconfig של אשכול המשתמשים.
בוחרים שם לחשבון השירות של ה-API לגישה ל-Binary Authorization:
export SA_NAME=SERVICE_ACCOUNT_NAMEמחליפים את SERVICE_ACCOUNT_NAME בשם של חשבון השירות שרוצים. מודול Binary Authorization משתמש בחשבון השירות הזה כדי לגשת אל Binary Authorization API.
מציינים את הנתיב לקובץ המפתח של חשבון השירות שהורדתם בהמשך המדריך הזה:
export SA_JSON_PATH=SA_KEY_FILE_PATHמחליפים את SA_KEY_FILE_PATH בנתיב של קובץ מפתח ה-JSON של חשבון השירות.
התקנת מודול Binary Authorization באשכול המשתמשים
כדי להתקין את מודול Binary Authorization:
שימוש ב-Workload Identity
בעזרת Workload Identity ב-Fleet, עומסי העבודה באשכול יכולים לעבור אימות ב-Google בלי שתצטרכו להוריד, להחליף באופן ידני ולנהל באופן כללי Google Cloud מפתחות של חשבונות שירות. במאמר הסבר על Fleet Workload Identity אפשר לקרוא מידע נוסף על אופן הפעולה של Fleet Workload Identity ועל היתרונות של השימוש בו.
מקצים את התפקיד
binaryauthorization.policyEvaluatorלחשבון השירות של Kubernetes בפרויקט המארח של הצי:gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member="serviceAccount:${PROJECT_ID}.svc.id.goog[binauthz-system/binauthz-admin]" \ --role="roles/binaryauthorization.policyEvaluator"יוצרים ספריית עבודה:
יוצרים ספרייה בשם
binauthz.עוברים לספרייה.
מורידים את הקובץ
manifest-wi-0.2.6.yaml.tmpl, שמשמש להתקנת מודול Binary Authorization באשכול המשתמשים:Bare metal
gcloud storage cp gs://anthos-baremetal-release/binauthz/manifest-wi-0.2.6.yaml.tmpl .VMware
gcloud storage cp gs://gke-on-prem-release/binauthz/manifest-wi-0.2.6.yaml.tmpl .מחליפים את משתני הסביבה בתבנית:
envsubst < manifest-wi-0.2.6.yaml.tmpl > manifest-0.2.6.yamlמתקינים את מודול Binary Authorization באשכול המשתמשים:
kubectl apply -f manifest-0.2.6.yamlמוודאים שהפריסה נוצרה:
kubectl get pod --namespace binauthz-systemה-Pod
binauthz-module-deployment-*מופיע ברשימה עםStatusמתוךRunningו-1/1 Pods ready, כמו בדוגמה הבאה:NAME READY STATUS RESTARTS AGE binauthz-module-deployment-5fddf9594f-qjprz 1/1 Running 0 11s
שימוש במפתח של חשבון שירות
מגדירים את פרויקט ברירת המחדל ל-Google Cloud CLI:
gcloud config set project ${PROJECT_ID}יוצרים חשבון שירות לגישה ל-Binary Authorization API:
gcloud iam service-accounts create ${SA_NAME}מקצים את התפקיד
binaryauthorization.policyEvaluatorלחשבון השירות של ממשק Binary Authorization API בפרויקט המארח של הצי:gcloud projects add-iam-policy-binding ${PROJECT_ID}\ --member="serviceAccount:${SA_NAME}@${PROJECT_ID}.iam.gserviceaccount.com" \ --role="roles/binaryauthorization.policyEvaluator"יוצרים ספריית עבודה:
יוצרים ספרייה בשם
binauthz.עוברים לספרייה.
מורידים את הקובץ
manifest-0.2.6.yaml, שמשמש להתקנת מודול Binary Authorization באשכול המשתמשים:Bare metal
gcloud storage cp gs://anthos-baremetal-release/binauthz/manifest-0.2.6.yaml .VMware
gcloud storage cp gs://gke-on-prem-release/binauthz/manifest-0.2.6.yaml .יוצרים קובץ YAML למרחב השמות
binauthz-system.מעתיקים את הקוד הבא לקובץ שנקרא
namespace.yaml:apiVersion: v1 kind: Namespace metadata: labels: control-plane: binauthz-controller name: binauthz-systemיוצרים את מרחב השמות באשכול המשתמשים:
kubectl apply -f namespace.yamlהפלט אמור להיראות כך:
namespace/binauthz-system createdמורידים קובץ מפתח בפורמט JSON לחשבון השירות:
gcloud iam service-accounts keys create ${SA_JSON_PATH} --iam-account ${SA_NAME}@${PROJECT_ID}.iam.gserviceaccount.comשומרים את המפתח של חשבון השירות כסוד של Kubernetes באשכול המשתמשים:
kubectl --namespace binauthz-system create secret generic binauthz-sa --from-file=key.json=${SA_JSON_PATH}מתקינים את מודול Binary Authorization באשכול המשתמשים:
kubectl apply -f manifest-0.2.6.yamlמוודאים שהפריסה נוצרה:
kubectl get pod --namespace binauthz-systemה-Pod
binauthz-module-deployment-*מופיע ברשימה עםStatusמתוךRunningו-1/1 Pods ready, כמו בדוגמה הבאה:NAME READY STATUS RESTARTS AGE binauthz-module-deployment-5fddf9594f-qjprz 1/1 Running 0 11s
הגדרה ושימוש במדיניות של Binary Authorization
בקטע הזה נסביר איך להגדיר מדיניות של Binary Authorization לשימוש באשכולות מקומיים.
בכל דוגמה, מגדירים את המדיניות ואז מנסים לפרוס קובץ אימג' של קונטיינר באשכול כדי לבדוק אותה.
אישור גישה לכולן
בקטע הזה מוצג מקרה של הצלחה. אתם מגדירים את מדיניות Binary Authorization כך שקובץ אימג' של קונטיינר יעמוד בדרישות המדיניות וייפרס.
ב- Google Cloud, מבצעים את הפעולות הבאות:
המסוף
במסוף Google Cloud , עוברים לדף Binary Authorization.
חשוב לבחור את מזהה הפרויקט של מארח הצי.
לוחצים על עריכת המדיניות.
בקטע Project default rule, בוחרים באפשרות Allow all images.
לוחצים על שמירת המדיניות.
gcloud
מגדירים את
PROJECT_IDלפרויקט של מארח ה-Fleet. מזהה הפרויקט מופיע בשדהgkeConnectבקובץ ההגדרה של אשכול המשתמשים.export PROJECT_ID=PROJECT_IDמגדירים את פרויקט ברירת המחדל Google Cloud .
gcloud config set project ${PROJECT_ID}מייצאים את קובץ ה-YAML של המדיניות למערכת המקומית:
gcloud container binauthz policy export > policy.yamlקובץ ה-YAML אמור להיראות כך:
defaultAdmissionRule: enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG evaluationMode: ALWAYS_ALLOW globalPolicyEvaluationMode: ENABLE name: projects/<var>PROJECT_ID</var>/policyעריכה של
policy.yaml.מגדירים את
evaluationModeלהיותALWAYS_ALLOW.אם יש
requireAttestationsByblock בקובץ, מוחקים את ה-block הזה.שומרים את הקובץ.
כדי לייבא את
policy.yaml:gcloud container binauthz policy import policy.yaml
כדי להוסיף תמונה שפטורה מהכללים לרשימת ההיתרים, מוסיפים את השורה הבאה לקובץ המדיניות:
admissionWhitelistPatterns: - namePattern: EXEMPT_IMAGE_PATH
מחליפים את EXEMPT_IMAGE_PATH בנתיב לתמונה שרוצים להחריג. כדי להחריג תמונות נוספות, מוסיפים עוד רשומות של - namePattern. מידע נוסף על admissionWhitelistPatterns
בתחנת העבודה של האדמין, מבצעים את הפעולות הבאות:
יוצרים קובץ מניפסט בשביל Pod.
שומרים את הטקסט הבא בקובץ בשם
pod.yaml:apiVersion: v1 kind: Pod metadata: name: test-pod spec: containers: - name: test-container image: us-docker.pkg.dev/google-samples/containers/gke/hello-app@sha256:c62ead5b8c15c231f9e786250b07909daf6c266d0fcddd93fea882eb722c3be4יוצרים את הפוד:
kubectl apply -f pod.yamlרואים שה-Pod נפרס בהצלחה.
מוחקים את ה-Pod:
kubectl delete -f pod.yaml
השבתה של הכול
בקטע הזה מוצג מקרה של כשל. בקטע הזה מגדירים את מדיניות ברירת המחדל כך שלא תהיה אפשרות לפרוס את קובץ אימג' של קונטיינר.
ב Google Cloud מבצעים את הפעולות הבאות:
המסוף
במסוף Google Cloud , עוברים לדף Binary Authorization.
מוודאים שבחרתם את פרויקט המארח של ה-Fleet.
לוחצים על עריכת המדיניות.
בקטע Project default rule, בוחרים באפשרות Disallow all images.
לוחצים על שמירת המדיניות.
gcloud
מגדירים את
PROJECT_IDלמזהה פרויקט המארח של הצי.export PROJECT_ID=PROJECT_IDמגדירים את פרויקט ברירת המחדל Google Cloud .
gcloud config set project ${PROJECT_ID}מייצאים את קובץ ה-YAML של המדיניות:
gcloud container binauthz policy export > policy.yamlעריכה של
policy.yaml.מגדירים את
evaluationModeלהיותALWAYS_DENY.אם יש
requireAttestationsByblock בקובץ, מוחקים את ה-block הזה.שומרים את הקובץ.
כדי לייבא את
policy.yaml:gcloud container binauthz policy import policy.yaml
בתחנת העבודה של האדמין, מבצעים את הפעולות הבאות:
יוצרים קובץ מניפסט בשביל Pod.
שומרים את הטקסט הבא בקובץ בשם
pod.yaml:apiVersion: v1 kind: Pod metadata: name: test-pod spec: containers: - name: test-container image: us-docker.pkg.dev/google-samples/containers/gke/hello-app@sha256:c62ead5b8c15c231f9e786250b07909daf6c266d0fcddd93fea882eb722c3be4יוצרים את הפוד:
kubectl apply -f pod.yamlאתם רואים שהפריסה של ה-Pod נחסמה. הפלט אמור להיראות כך:
Error from server (VIOLATES_POLICY): error when creating "pod.yaml": admission webhook "binaryauthorization.googleapis.com" denied the request: Denied by default admission rule. Overridden by evaluation mode
קבלת מזהה המשאב של אשכול המשתמשים
בקטע הזה מוסבר איך להרכיב את מזהה משאב האשכול עבור אשכול המשתמשים. במדיניות של Binary Authorization, אפשר ליצור כללים ספציפיים לאשכול. אתם משייכים את הכללים האלה למזהה משאב ספציפי לאשכול, שמבוסס על מזהה האשכול.
כך מקבלים את מזהה המשאב:
המסוף
במסוףGoogle Cloud , עוברים לדף Clusters של GKE.
בוחרים את מזהה פרויקט המארח של ה-Fleet עבור האשכולות. מזהה הפרויקט מופיע בקטע
gkeConnectבקובץ ההגדרות של אשכול המשתמשים.ברשימת האשכולות, מחפשים את מזהה האשכול בעמודה שם.
כדי ליצור את מזהה המשאב, מוסיפים את הקידומת
global.למזהה האשכול, כך שמזהה המשאב יהיה בפורמט הבא:global.CLUSTER_ID.
gcloud
משתמשים ב-SSH כדי להתחבר לתחנת העבודה של האדמין.
בתחנת העבודה של האדמין, מריצים את הפקודה הבאה:
kubectl get membership -o yamlמקבלים את מזהה האשכול מהשדה
spec.owner.idשל הפלט. פלט לדוגמה:apiVersion: v1 items: - apiVersion: hub.gke.io/v1 kind: Membership ... spec: owner: id: //gkehub.googleapis.com/projects/PROJECT_NUMBER/locations/global/memberships/my-cluster-idבדוגמת הפלט, מזהה האשכול הוא
my-cluster-id.כדי ליצור את מזהה המשאב, מוסיפים את הקידומת
global.למזהה האשכול. בדוגמה, מזהה המשאב הואglobal.my-cluster-id.
משתמשים במזהה המשאב הזה כשמגדירים כללים ספציפיים לאשכול. איך מגדירים כללים ספציפיים לאשכול באמצעות מסוףGoogle Cloud או ה-CLI של gcloud
עדכון מדיניות הכשל
אפשר להגדיר את ה-webhook של Binary Authorization ל-fail open או ל-fail close.
Fail close
כדי לעדכן את מדיניות הכשל כך שהיא תהיה 'כשל בסגירה':
עורכים את הקובץ manifest-0.2.6.yaml ומגדירים את failurePolicy ל-
Failמפעילים מחדש את ה-webhook:
kubectl apply -f manifest-0.2.6.yamlהפלט אמור להיראות כך:
serviceaccount/binauthz-admin unchanged role.rbac.authorization.k8s.io/binauthz-role configured clusterrole.rbac.authorization.k8s.io/binauthz-role configured rolebinding.rbac.authorization.k8s.io/binauthz-rolebinding unchanged clusterrolebinding.rbac.authorization.k8s.io/binauthz-rolebinding unchanged secret/binauthz-tls unchanged service/binauthz unchanged deployment.apps/binauthz-module-deployment unchanged validatingwebhookconfiguration.admissionregistration.k8s.io/binauthz-validating-webhook-configuration configured
שגיאת Fail Open
כדי לעדכן את מדיניות הכשל כך שתאפשר גישה:
עורכים את הקובץ manifest-0.2.6.yaml ומגדירים את failurePolicy ל-
Ignoreמפעילים מחדש את ה-webhook:
kubectl apply -f manifest-0.2.6.yamlהפלט אמור להיראות כך:
serviceaccount/binauthz-admin unchanged role.rbac.authorization.k8s.io/binauthz-role configured clusterrole.rbac.authorization.k8s.io/binauthz-role configured rolebinding.rbac.authorization.k8s.io/binauthz-rolebinding unchanged clusterrolebinding.rbac.authorization.k8s.io/binauthz-rolebinding unchanged secret/binauthz-tls unchanged service/binauthz unchanged deployment.apps/binauthz-module-deployment unchanged validatingwebhookconfiguration.admissionregistration.k8s.io/binauthz-validating-webhook-configuration configured
מידע נוסף על מדיניות בנושא כשלים ב-webhook
הסרת המשאבים
בדוגמת הקוד הבאה אפשר לראות איך משביתים את ה-webhook:
kubectl delete ValidatingWebhookConfiguration/binauthz-validating-webhook-configurationבדוגמת הקוד הבאה אפשר לראות איך מפעילים מחדש את ה-webhook:
kubectl apply -f manifest-0.2.6.yamlבדוגמת הקוד הבאה אפשר לראות איך מוחקים את כל המשאבים שקשורים ל-Binary Authorization:
kubectl delete -f manifest-0.2.6.yaml kubectl delete namespace binauthz-system
המאמרים הבאים
- כדי לבדוק את התאימות למדיניות בזמן יצירת ה-Pod בלי לחסום את היצירה שלו, אפשר לעיין במאמר בנושא הפעלת הרצה יבשה.
- כדי לאלץ יצירה של Pod שהאוכף של Binary Authorization היה חוסם אחרת, אפשר לעיין במאמר בנושא שימוש ב-breakglass.
- משתמשים ב
built-by-cloud-buildגורם מאמת (attestor) כדי לפרוס רק קובצי אימג' שנוצרו על ידי Cloud Build. - כדי להטמיע מדיניות Binary Authorization שמבוססת על מאמת, אפשר לעיין במאמרים הבאים:
- מגדירים מדיניות באמצעות Google Cloud המסוף או כלי שורת הפקודה. מגדירים את כלל ברירת המחדל או כלל ספציפי לאשכול כדי לדרוש אישורים.
- יוצרים מאמת באמצעות מסוףGoogle Cloud או כלי שורת הפקודה.
- יצירת אישור
- כדי לראות אירועים ביומן שקשורים ל-Binary Authorization ב-Distributed Cloud, אפשר לעיין במאמר בנושא הצגת אירועים ביומני הביקורת של Cloud.
- מעקב אחרי מדדים.