במדריך הזה נסביר איך לשפר את מצב האבטחה של האשכול ושל האפליקציה. נניח שאתם אדמינים של פלטפורמה בארגון שמנהל את האפליקציות של החנות הווירטואלית שלו באמצעות Cloud Service Mesh, חבילת כלים שעוזרת לכם לנטר ולנהל רשת שירותים אמינה. אתם אחראים לוודא שרשת ה-Mesh והאפליקציות שלכם מאובטחות.
כדי למנוע הגדרות שגויות ולאמת באופן אוטומטי את כללי המדיניות של Cloud Service Mesh, אתם יכולים להשתמש ב-Policy Controller וב-Config Sync. בעזרת Policy Controller אפשר לאכוף באשכולות כללי מדיניות שניתנים לתכנות באופן מלא. בנוסף, Policy Controller כולל ספריית ברירת מחדל של תבניות אילוצים, שאפשר להשתמש בהן עם חבילת האבטחה של Cloud Service Mesh כדי לבדוק את התאימות של נקודות החולשה באבטחה של רשת ה-Mesh ואת השיטות המומלצות. סנכרון תצורות מבצע התאמה רציפה בין מצב האשכולות לבין קבוצה מרכזית של קובצי תצורה הצהרתית של Kubernetes. השימוש ב-Policy Controller ובסנכרון תצורות ביחד מאפשר לכם לאכוף באופן רציף אילוצים על הגדרות המדיניות של Cloud Service Mesh.
בתרשים הבא מוצגת סקירה כללית של האופן שבו Cloud Service Mesh, Policy Controller ו-סנכרון תצורות פועלים יחד במדריך הזה כדי לנהל ולהגן על שער כניסה ועל האפליקציות לדוגמה של Online Boutique שבהן אתם משתמשים במדריך הזה:
מטרות
- יוצרים אשכול Google Kubernetes Engine (GKE) ורושמים את האשכול בצי.
- התקנת Policy Controller, Config Sync ו-Cloud Service Mesh באשכול.
- מגדירים את Config Sync כך שיסנכרן כמה מאגרים.
- כדאי ליישם שיטות מומלצות כדי לפרוס הגדרות, אפליקציות ומשאבי Istio באמצעות סנכרון תצורות.
- פריסת הגדרות אשכול, האפליקציות לדוגמה של Online Boutique ושער כניסה באמצעות Config Sync.
- כדי לאכוף את השיטות המומלצות הבאות לאבטחה, אפשר להשתמש בחבילת המדיניות של Cloud Service Mesh ב-Policy Controller:
- מוודאים שלכל עומסי העבודה ברשת יש הזרקה אוטומטית של sidecar.
- הצפנה של כל התנועה ברשת.
- לוודא שלכל עומסי העבודה ברשת יש בקרת גישה פרטנית.
עלויות
במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:
- GKE.
- GKE Enterprise. The billing for GKE Enterprise includes billing for the Cloud Service Mesh, Config Sync, and Policy Controller.
כדי ליצור הערכת עלויות בהתאם לשימוש החזוי, אתם יכולים להשתמש במחשבון התמחור.
כשמסיימים את המשימות שמתוארות במסמך הזה אפשר למחוק את המשאבים שיצרתם כדי להימנע מחיובים נוספים. מידע נוסף זמין בקטע הסרת המשאבים.
לפני שמתחילים
-
בדף לבחירת הפרויקט במסוף Google Cloud , בוחרים פרויקט ב- Google Cloud או יוצרים אותו.
תפקידים שנדרשים כדי לבחור או ליצור פרויקט
- בחירת פרויקט: כדי לבחור פרויקט לא נדרש תפקיד IAM ספציפי – אתם יכולים לבחור כל פרויקט שקיבלתם בו תפקיד.
-
יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד "יצירת פרויקטים" (
roles/resourcemanager.projectCreator), שכולל את ההרשאהresourcemanager.projects.create. איך מקצים תפקידים
הכנת הסביבה
בקטע הזה מכינים את הסביבה כדי שתוכלו להתקין את Cloud Service Mesh, Policy Controller ו-Config Sync:
-
במסוף Google Cloud , מפעילים את Cloud Shell.
משדרגים לגרסה העדכנית של Google Cloud CLI:
gcloud components updateכדי לאחסן את הקבצים שאתם יוצרים במדריך הזה, צרו ספרייה:
mkdir ~/asm-acm-tutorial-dirכדי לפשט את שאר המדריך, יוצרים את משתני הסביבה הבאים:
PROJECT_ID=PROJECT_ID gcloud config set project $PROJECT_ID CLUSTER=asm-acm-tutorial CLUSTER_ZONE=us-east4-a MEMBERSHIP=asm-acm-tutorial PROJECT_NUMBER=$(gcloud projects describe ${PROJECT_ID} --format='get(projectNumber)')מחליפים את
PROJECT_IDבמזהה הפרויקט שבו רוצים להשתמש במדריך הזה.אם מתבקשים לאשר את Cloud Shell, לוחצים על Authorize כדי להשלים את הפעולה.
מפעילים את ממשקי ה-API שנדרשים למדריך הזה:
gcloud
gcloud services enable \ mesh.googleapis.com \ anthos.googleapis.comConfig Connector
המדריך הזה כולל משאבים של Config Connector. אתם יכולים להשתמש במקורות המידע האלה כדי לבצע את אותן המשימות שאתם מבצעים בכרטיסייה
gcloud. כדי להשתמש במשאבים האלה, מתקינים את Config Connector ומחילים את המשאבים באופן שהכי מתאים לסביבה שלכם.משתמשים במניפסט
Servicesהבא:apiVersion: serviceusage.cnrm.cloud.google.com/v1beta1 kind: Service metadata: annotations: cnrm.cloud.google.com/deletion-policy: "abandon" cnrm.cloud.google.com/disable-dependent-services: "false" name: mesh.googleapis.com spec: resourceID: mesh.googleapis.com projectRef: external: PROJECT_ID --- apiVersion: serviceusage.cnrm.cloud.google.com/v1beta1 kind: Service metadata: annotations: cnrm.cloud.google.com/deletion-policy: "abandon" cnrm.cloud.google.com/disable-dependent-services: "false" name: anthos.googleapis.com spec: resourceID: anthos.googleapis.com projectRef: external: PROJECT_IDהפעולה הזו יכולה להימשך יותר מדקה.
הגדרת אשכול GKE
בקטע הזה יוצרים אשכול GKE ורושמים אותו ב-Fleet.Google Cloud הוא מושג שמתייחס לארגון לוגי של אשכולות ומשאבים אחרים, שמאפשר להשתמש ביכולות של כמה אשכולות ולנהל אותן, ולהחיל כללי מדיניות עקביים בכל המערכות.
האשכול שיוצרים בקטע הזה הוא האשכול שבו מתקינים את Cloud Service Mesh, את Policy Controller ואת סנכרון תצורות. זה גם האשכול שבו פורסים את האפליקציות לדוגמה של Online Boutique.
כדי להגדיר את האשכול:
יוצרים אשכול GKE:
gcloud
gcloud container clusters create ${CLUSTER} \ --zone ${CLUSTER_ZONE} \ --machine-type=e2-standard-4 \ --num-nodes 4 \ --workload-pool ${PROJECT_ID}.svc.id.goog \ --labels mesh_id=proj-${PROJECT_NUMBER}Config Connector
משתמשים במניפסטים הבאים של
ContainerClusterו-ContainerNodePool:apiVersion: container.cnrm.cloud.google.com/v1beta1 kind: ContainerNodePool metadata: annotations: cnrm.cloud.google.com/project-id: PROJECT_ID name: asm-acm-tutorial spec: clusterRef: name: asm-acm-tutorial location: us-east4-a nodeConfig: machineType: e2-standard-4 nodeCount: 4 --- apiVersion: container.cnrm.cloud.google.com/v1beta1 kind: ContainerCluster metadata: annotations: cnrm.cloud.google.com/project-id: PROJECT_ID cnrm.cloud.google.com/remove-default-node-pool: "true" labels: mesh_id: proj-PROJECT_NUMBER name: asm-acm-tutorial spec: location: us-east4-a initialNodeCount: 1 workloadIdentityConfig: workloadPool: PROJECT_ID.svc.id.googמחליפים את
PROJECT_NUMBERבערך של משתנה הסביבהPROJECT_NUMBERשאוחזר קודם.הפעולה הזו יכולה להימשך יותר מ-5 דקות.
כדי לוודא שאשכול GKE נוצר בהצלחה, מתארים את הסטטוס שלו:
gcloud container clusters list \ --zone ${CLUSTER_ZONE} \ --project ${PROJECT_ID}הפלט אמור להיראות כך:
NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS asm-acm-tutorial us-east4-a 1.23.12-gke.100 35.186.179.30 e2-standard-4 1.23.12-gke.100 3 RUNNINGמתחברים לאשכול GKE:
gcloud container clusters get-credentials ${CLUSTER} \ --zone ${CLUSTER_ZONE} \ --project ${PROJECT_ID}רישום האשכול ב-Fleet:
gcloud
gcloud container fleet memberships register ${MEMBERSHIP} \ --project ${PROJECT_ID} \ --gke-cluster ${CLUSTER_ZONE}/${CLUSTER} \ --enable-workload-identityהפלט אמור להיראות כך:
kubeconfig entry generated for asm-acm-tutorial. Waiting for membership to be created...done. Created a new membership [projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial] for the cluster [asm-acm-tutorial] Generating the Connect Agent manifest... Deploying the Connect Agent on cluster [asm-acm-tutorial] in namespace [gke-connect]... Deployed the Connect Agent on cluster [asm-acm-tutorial] in namespace [gke-connect]. Finished registering the cluster [asm-acm-tutorial] with the Fleet.Config Connector
משתמשים במניפסט הבא של
GKEHubMembership:apiVersion: gkehub.cnrm.cloud.google.com/v1beta1 kind: GKEHubMembership metadata: annotations: cnrm.cloud.google.com/project-id: PROJECT_ID name: asm-acm-tutorial spec: location: global authority: issuer: https://container.googleapis.com/v1/projects/PROJECT_ID/locations/us-east4-a/clusters/asm-acm-tutorial endpoint: gkeCluster: resourceRef: name: asm-acm-tutorialכדי לוודא שהרישום של אשכול GKE יתבצע בהצלחה, צריך לתאר את הסטטוס שלו:
gcloud container fleet memberships listהפלט אמור להיראות כך:
NAME EXTERNAL_ID LOCATION asm-acm-tutorial 0e12258c-8831-4d81-b5c0-5e7099a468cc global
עיון במאגרים
בקטע ההתקנה הבא, מחילים קובץ מניפסט acm-config.yaml. קובץ המניפסט הזה מגדיר את האשכול לסנכרון מהתיקייה asm-acm-tutorial במאגר הדוגמה. התיקייה הזו מכילה את כל קובצי התצורה שצריך כדי להשלים את שאר המדריך.
כדי לפשט את המדריך, תשתמשו בפקודות sed כדי לעדכן את acm-config.yaml. בעזרת קובץ acm-config.yaml, סנכרון תצורות פורס את המניפסטים שנדרשים לכל שלב במדריך הזה.
עדכון של קובץ יחיד עוזר לכם להתמקד במושגים ובזרימה של אבטחת האשכולות, הרשת והאפליקציות, בלי שתצטרכו לבצע שוב ושוב מניפולציות בקבצים ולהריץ שוב ושוב פקודות git.
כדי להשתמש ביכולת של Config Sync לסנכרן כמה מאגרים, צריך להשתמש במשאבים הבאים:
-
root-sync, כמאגרRootSync, מכיל את כל ההגדרות באשכול, כוללRepoSyncs,Constraints,ClusterRole,RoleBindingsומשאבים שנכללים במרחבי שמות מסוימים של המערכת, כמוistio-system. -
ingress-gateway, בתורRepoSyncראשון, מכיל את כל המשאבים שצריך כדי לפרוס שער כניסה ולאבטח אותו בהדרגה לאורך המדריך הזה. online-boutique, בתורRepoSyncשני, מכיל את כל המשאבים שצריך כדי לפרוס את האפליקציות של Online Boutique ולאבטח אותן בהדרגה במהלך המדריך הזה.
התקנה של Policy Controller, סנכרון תצורות ו-Cloud Service Mesh מנוהל
אחרי שיצרתם ורשמתם את האשכול, אתם יכולים להתקין בו את סנכרון תצורות, את Policy Controller ואת Cloud Service Mesh, ולהגדיר אותו כך שיסתנכרן עם ההגדרות של ברירת המחדל של RootSync:
מפעילים את האופרטור
ConfigManagement, שמנהל את סנכרון תצורות ואת Policy Controller:gcloud
gcloud beta container fleet config-management enableConfig Connector
משתמשים במניפסט
GKEHubFeatureהבא:apiVersion: gkehub.cnrm.cloud.google.com/v1beta1 kind: GKEHubFeature metadata: name: configmanagement spec: projectRef: external: PROJECT_ID location: global resourceID: configmanagementמפעילים את Cloud Service Mesh ב-fleet.
gcloud
gcloud container fleet mesh enableConfig Connector
משתמשים במניפסט
GKEHubFeatureהבא:apiVersion: gkehub.cnrm.cloud.google.com/v1beta1 kind: GKEHubFeature metadata: name: servicemesh spec: projectRef: external: PROJECT_ID location: global resourceID: servicemeshמפעילים את הניהול האוטומטי של Cloud Service Mesh כדי לאפשר ל-Google להחיל את ההגדרה המומלצת של Cloud Service Mesh מנוהל:
gcloud
gcloud container fleet mesh update \ --management automatic \ --memberships ${MEMBERSHIP}Config Connector
משתמשים במניפסט
GKEHubFeatureMembershipהבא:apiVersion: gkehub.cnrm.cloud.google.com/v1beta1 kind: GKEHubFeatureMembership metadata: name: servicemesh-membership spec: projectRef: external: PROJECT_ID location: global membershipRef: name: asm-acm-tutorial featureRef: name: servicemesh mesh: management: MANAGEMENT_AUTOMATICמפעילים את סנכרון תצורות ואת Policy Controller:
gcloud
שומרים את המניפסט הבא בתור
acm-config.yamlבספרייה~/asm-acm-tutorial-dir:applySpecVersion: 1 spec: configSync: enabled: true policyDir: asm-acm-tutorial/root-sync/init secretType: none sourceFormat: unstructured syncRepo: https://github.com/GoogleCloudPlatform/anthos-config-management-samples syncBranch: main policyController: enabled: true referentialRulesEnabled: true templateLibraryInstalled: trueלמידע נוסף על שדות התצורה של Google Cloud CLI, קראו את המאמר שדות המפרט של gcloud apply.
מחילים את הקובץ:
gcloud beta container fleet config-management apply \ --membership ${MEMBERSHIP} \ --config ~/asm-acm-tutorial-dir/acm-config.yamlConfig Connector
משתמשים במניפסט
GKEHubFeatureMembershipהבא:apiVersion: gkehub.cnrm.cloud.google.com/v1beta1 kind: GKEHubFeatureMembership metadata: name: configmanagement-membership spec: projectRef: external: PROJECT_ID location: global membershipRef: name: asm-acm-tutorial featureRef: name: configmanagement configmanagement: configSync: sourceFormat: unstructured git: policyDir: asm-acm-tutorial/root-sync/init secretType: none syncBranch: main syncRepo: https://github.com/GoogleCloudPlatform/anthos-config-management-samples policyController: enabled: true referentialRulesEnabled: true templateLibraryInstalled: truePolicy Controller ו-סנכרון תצורות מותקנים באשכול. לאחר מכן, Config Sync מתחיל לסנכרן את כל ההגדרות של ברירת המחדל
RootSyncעם האשכול שלכם. ההגדרות האלה מתקינות ומגדירות את רכיבי המפתח הבאים:האובייקטים של
RepoSyncשמגדירים את האפליקציות של Online Boutique ואת שער הכניסה מסונכרנים:מכיוון שלרכיבי ההתאמה
RepoSyncנדרשות הרשאות נוספות כדי ליצור משאבי Istio, מוחלים על האשכול גם אובייקטClusterRoleושני אובייקטים מסוגRoleBindingכדי להעניק את ההרשאות האלה:
כדי לוודא שההתקנה של Policy Controller ו-Config Sync בוצעה בהצלחה, בודקים את הסטטוס:
gcloud beta container fleet config-management statusהפלט אמור להיראות כך:
Name: asm-acm-tutorial Status: SYNCED Last_Synced_Token: 4b3384d Sync_Branch: main Last_Synced_Time: 2022-05-04T21:32:58Z Policy_Controller: INSTALLEDאם מופיע הערך
PENDINGאוNOT_INSTALLEDבשורותStatusאוPolicy_Controller, צריך להמתין כמה דקות ולהריץ שוב אתgcloud beta container fleet config-management status.כדי לוודא שההתקנה של Cloud Service Mesh בוצעה בהצלחה, מתארים את הסטטוס שלה:
gcloud container fleet mesh describeהפלט אמור להיראות כך:
createTime: '2022-09-13T23:12:56.477042921Z' membershipSpecs: projects/PROJECT_NUMBER/locations/global/memberships/asm-acm-tutorial: mesh: management: MANAGEMENT_AUTOMATIC membershipStates: projects/PROJECT_NUMBER/locations/global/memberships/asm-acm-tutorial: servicemesh: controlPlaneManagement: details: - code: REVISION_READY details: 'Ready: asm-managed' state: ACTIVE dataPlaneManagement: details: - code: OK details: Service is running. state: ACTIVE state: code: OK description: |- Revision(s) ready for use: asm-managed. All Canonical Services have been reconciled successfully. updateTime: '2022-09-14T00:19:10.571552206Z' name: projects/PROJECT_ID/locations/global/features/servicemesh resourceState: state: ACTIVE spec: {} state: state: {} updateTime: '2022-09-14T00:19:14.135113118Z'אם במקום
state.code: OKמופיעstate.code: ERROR, צריך להמתין כמה דקות ולהריץ אתgcloud container fleet mesh describeשוב. לפני שממשיכים במדריך, צריך לוודא שבשדהservicemesh.controlPlaneManagement.details.codeמופיע הערךREVISION_READY.
פריסת שער כניסה ואפליקציה לדוגמה
בקטע הזה נסביר איך פורסים את האפליקציה לדוגמה Online Boutique ושער כניסה כדי לנהל את תנועת הכניסה.
פורסים את אפליקציית הדוגמה Online Boutique ואת שער הכניסה.
הפקודה הבאה משתמשת ב-
sedכדי לעדכן את המניפסט שלacm-config.yaml, כדי שסנכרון תצורות יפרוס את המשאבים שצריך לפרוס את שער ה-Ingress ואת האפליקציה לדוגמה.sed -i "s,root-sync/init,root-sync/deployments,g" ~/asm-acm-tutorial-dir/acm-config.yaml gcloud beta container fleet config-management apply \ --membership ${MEMBERSHIP} \ --config ~/asm-acm-tutorial-dir/acm-config.yamlהערה: השלב הזה יכול להימשך כמה דקות.
בודקים את סטטוס Config Sync עבור
RootSyncושניRepoSyncs:gcloud alpha anthos config sync repo describeהפלט אמור להיראות כך:
getting 3 RepoSync and RootSync from projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial [ { "clusters": [ "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial" ], "commit": "95a30c052566357afb9db3d7f6153d9c0f219c03", "errors": [], "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/deployments@main", "status": "SYNCED" }, { "clusters": [ "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial" ], "commit": "95a30c052566357afb9db3d7f6153d9c0f219c03", "errors": [], "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/ingress-gateway/deployments@main", "status": "SYNCED" }, { "clusters": [ "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial" ], "commit": "95a30c052566357afb9db3d7f6153d9c0f219c03", "errors": [], "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/online-boutique/deployments@main", "status": "SYNCED" } ]אם מופיע
status: RECONCILINGבמקוםstatus: SYNCED, מחכים כמה דקות ומריצים שוב אתgcloud alpha anthos config sync repo describe.כדי לראות רק את המידע של מאגר אחד, אפשר להשתמש בדגלים
--sync-nameו---sync-namespace. כדי לראות את המשאבים המנוהלים בפירוט, מוסיפים את הדגל--managed-resources. מידע נוסף זמין במאמר בנושא הצגת סטטוס סנכרון ההגדרות בכמה אשכולות.ממתינים עד שכתובת ה-IP הציבורית של שער הכניסה תוקצה:
until kubectl -n asm-ingress get svc asm-ingressgateway -o jsonpath='{.status.loadBalancer}' | grep "ingress"; do : ; doneמקבלים את כתובת ה-IP הציבורית של שער הכניסה:
EXTERNAL_IP=$(kubectl get svc asm-ingressgateway -n asm-ingress -o jsonpath="{.status.loadBalancer.ingress[*].ip}")נכנסים לכתובת ה-IP מהדפדפן כדי לוודא שהאפליקציה Online Boutique נפרסה בהצלחה:
echo http://${EXTERNAL_IP}
אכיפת כללי מדיניות לאבטחת הרשת
בקטעים הבאים תשתמשו ב-Policy Controller כדי לאכוף כללי מדיניות מחבילת המדיניות של Cloud Service Mesh באמצעות יצירת אילוצים.
אכיפת החדרת קובצי עזר חיצוניים
בקטע הזה אוכפים כללי מדיניות כדי לוודא שבכל עומסי העבודה ברשת מופעלת החדרת sidecar אוטומטית.
כדי לאכוף החדרת פרוקסי sidecar, צריך להחיל אילוצים.
הפקודה הבאה משתמשת ב-
sedכדי לעדכן את המניפסטacm-config.yamlכדי ש-Config Sync יפרוס את המשאבים המשויכים.sed -i "s,root-sync/deployments,root-sync/enforce-sidecar-injection,g" ~/asm-acm-tutorial-dir/acm-config.yaml gcloud beta container fleet config-management apply \ --membership ${MEMBERSHIP} \ --config ~/asm-acm-tutorial-dir/acm-config.yamlהפקודה הקודמת פורסת את המשאבים הבאים:
K8sRequiredLabelsConstraintשמחייב שכלNamespaceברשת יכיל את תווית ההזרקה הספציפית של קובץ העזר החיצוני של Cloud Service Mesh:
AsmSidecarInjectionConstraintשאוסר על כלPodברשת לעקוף את הזרקת ה-sidecar של Istio proxy:
צפייה בסטטוס של Config Sync ב-
RootSync:gcloud alpha anthos config sync repo describe \ --sync-name root-sync \ --sync-namespace config-management-systemהפלט אמור להיראות כך:
getting 1 RepoSync and RootSync from projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial [ { "clusters": [ "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial" ], "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884", "errors": [], "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/enforce-sidecar-injection@main", "status": "SYNCED" } ]אם מופיע
status: RECONCILINGבמקוםstatus: SYNCED, מחכים כמה דקות ומריצים שוב אתgcloud alpha anthos config sync repo describe.מוודאים שנוצרו
Constraints:kubectl get constraintsיכול להיות שיעברו כמה דקות עד ש-Policy Controller יעריך את האילוצים האלה. אם לא מופיעים ערכים בעמודה
TOTAL-VIOLATIONS, צריך לחכות ולהריץ שוב את הפקודהkubectl get constraints.הפלט אמור להיראות כך:
NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS podsidecarinjectionannotation.constraints.gatekeeper.sh/pod-sidecar-injection-annotation deny 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8srequiredlabels.constraints.gatekeeper.sh/namespace-sidecar-injection-label deny 0מכיוון שהגדרנו בצורה נכונה את
Namespacesו-Pods, יש0TOTAL-VIOLATIONSעבורConstraintsאלה.כדי לראות את
Constraintsבפעולה, נסו ליצורNamespaceבאשכול בליlabelאוannotation:kubectl create namespace testהפלט דומה לשגיאה הבאה:
Error from server (Forbidden): admission webhook "validation.gatekeeper.sh" denied the request: [namespace-sidecar-injection-label] you must provide labels: {"istio-injection"}
אכיפת הצפנת תנועה
בקטע הזה אוכפים כללי מדיניות כדי לוודא שכל התנועה ברשת מוצפנת.
כדי לאכוף הצפנה של תנועת הנתונים, צריך להחיל אילוצים.
הפקודה הבאה משתמשת ב-
sedכדי לעדכן את המניפסט שלacm-config.yaml, כדי שסנכרון ההגדרות יפרוס את המשאבים המשויכים.sed -i "s,root-sync/enforce-sidecar-injection,root-sync/enforce-strict-mtls,g" ~/asm-acm-tutorial-dir/acm-config.yaml gcloud beta container fleet config-management apply \ --membership ${MEMBERSHIP} \ --config ~/asm-acm-tutorial-dir/acm-config.yamlהפקודה הקודמת פורסת את המשאבים הבאים:
AsmPeerAuthnMeshStrictMtlsConstraintשאוכף את מדיניות ה-mTLS ברמת הרשתPeerAuthenticationבמרחב השמותistio-system:אילוץ הפניה
Configבמרחב השמותgatekeeper-system. האילוץ הרפרנציאלי הזה מאפשר ל-AsmPeerAuthnMeshStrictMtlsConstraintלהפנות לאובייקט אחר בהגדרה שלו (לדוגמה, חיפוש שלPeerAuthenticationכלשהו ב-istio-systemNamespace):
DestinationRuleTLSEnabledConstraintשאוסר על השבתת TLS לכל המארחים וקבוצות המשנה של המארחים ב-IstioDestinationRules:AsmPeerAuthnStrictMtlsConstraintשאוכפת שכלPeerAuthenticationsלא יכולים להחליף אתSTRICTmTLS:
צפייה בסטטוס של Config Sync ב-
RootSync:gcloud alpha anthos config sync repo describe \ --sync-name root-sync \ --sync-namespace config-management-systemהפלט אמור להיראות כך:
getting 1 RepoSync and RootSync from projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial [ { "clusters": [ "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial" ], "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884", "errors": [], "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/enforce-strict-mtls@main", "status": "SYNCED" } ]אם במקום
status: SYNCEDמופיעstatus: RECONCILING, צריך להמתין כמה דקות ולהריץ אתgcloud alpha anthos config sync repo describeשוב.כדי לקבל מידע נוסף על ההפרה
PeerAuthentication, מריצים את הפקודה הבאה:kubectl get asmpeerauthnmeshstrictmtls.constraints.gatekeeper.sh/mesh-level-strict-mtls -ojsonpath='{.status.violations}' | jqהפלט אמור להיראות כך:
[ { "enforcementAction": "deny", "group": "constraints.gatekeeper.sh", "kind": "AsmPeerAuthnMeshStrictMtls", "message": "Root namespace <istio-system> does not have a strict mTLS PeerAuthentication", "name": "mesh-level-strict-mtls", "version": "v1beta1" } ]כדי לפתור את הבעיה, צריך לפרוס
PeerAuthenticationב-istio-system. כדי למנוע מכל השירותים ברשת לקבל תנועה לא מוצפנת, צריך להגדיר מדיניותPeerAuthenticationברמת הרשת עם מצב mTLS שמוגדר ל-STRICT. כשפורסים את המדיניות, מישור הבקרה מקצה באופן אוטומטי אישורי TLS כדי שעומסי העבודה יוכלו לאמת זה את זה.הפקודה הבאה משתמשת ב-
sedכדי לעדכן את המניפסט שלacm-config.yaml, כדי שסנכרון תצורות יפרוס את המשאבים המשויכים.sed -i "s,root-sync/enforce-strict-mtls,root-sync/fix-strict-mtls,g" ~/asm-acm-tutorial-dir/acm-config.yaml gcloud beta container fleet config-management apply \ --membership ${MEMBERSHIP} \ --config ~/asm-acm-tutorial-dir/acm-config.yamlהפקודה הקודמת פורסת את
STRICTmTLSPeerAuthenticationהבא במרחב השמותistio-system. הפקודה הזו מחילה mTLSSTRICTעל כל הרשת:צופים בסטטוס של Config Sync עבור
RootSync:gcloud alpha anthos config sync repo describe \ --sync-name root-sync \ --sync-namespace config-management-systemהפלט אמור להיראות כך:
getting 1 RepoSync and RootSync from projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial [ { "clusters": [ "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial" ], "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884", "errors": [], "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/fix-strict-mtls@main", "status": "SYNCED" } ]אם מופיע
status: RECONCILINGבמקוםstatus: SYNCED, מחכים כמה דקות ומריצים שוב אתgcloud alpha anthos config sync repo describe.מוודאים שנוצרו
Constraints:kubectl get constraintsשימו לב: יכול להיות שיעברו כמה דקות עד ש-Policy Controller יתחיל להעריך את ה-
Constraintsהאלה. ממתינים ומריצים שוב את הפקודהkubectl get constraintsעד שמקבלים ערכים בעמודהTOTAL-VIOLATIONSלכל שורה.הפלט אמור להיראות כך:
NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8srequiredlabels.constraints.gatekeeper.sh/namespace-sidecar-injection-label deny 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS asmpeerauthnmeshstrictmtls.constraints.gatekeeper.sh/mesh-level-strict-mtls deny 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS destinationruletlsenabled.constraints.gatekeeper.sh/destination-rule-tls-enabled deny 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS asmpeerauthnstrictmtls.constraints.gatekeeper.sh/peerauthentication-strict-mtls deny 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS asmsidecarinjection.constraints.gatekeeper.sh/pod-sidecar-injection-annotation deny 0
אכיפה של בקרת גישה מפורטת
בקטע הזה תאכפו כללי מדיניות כדי לוודא שלכל עומסי העבודה ברשת יש בקרת גישה מפורטת.
כדי לאכוף בקרת גישה פרטנית, צריך להחיל אילוצים.
הפקודה הבאה משתמשת ב-
sedכדי לעדכן את המניפסטacm-config.yamlכדי ש-סנכרון תצורות יפרוס את המשאבים המשויכים.sed -i "s,root-sync/fix-strict-mtls,root-sync/enforce-authorization-policies,g" ~/asm-acm-tutorial-dir/acm-config.yaml gcloud beta container fleet config-management apply \ --membership ${MEMBERSHIP} \ --config ~/asm-acm-tutorial-dir/acm-config.yamlהפקודה הקודמת פורסת את המשאבים הבאים:
AsmAuthzPolicyDefaultDenyConstraintשמחיל אתAuthorizationPolicyברירת המחדל של דחיית בקשות ברמת הרשתistio-systemבמרחב השמות:AsmAuthzPolicyEnforceSourcePrincipalsConstraintשמבטיח שכלAuthorizationPoliciesמגדיר חשבונות משתמשים מפורטים של מקור (מלבד "*"). רק שער הכניסה במרחב השמותasm-ingressהוא חריג לכלל הזה, כדי לקבל את התנועה ממשתמשי הקצה ולהפנות אותה לאפליקצייתfrontendשל Online Boutique.
צפייה בסטטוס של Config Sync ב-
RootSync:gcloud alpha anthos config sync repo describe \ --sync-name root-sync \ --sync-namespace config-management-systemהפלט אמור להיראות כך:
getting 1 RepoSync and RootSync from projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial [ { "clusters": [ "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial" ], "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884", "errors": [], "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/enforce-authorization-policies@main", "status": "SYNCED" } ]אם במקום
status: SYNCEDמופיעstatus: RECONCILING, צריך להמתין כמה דקות ולהריץ אתgcloud alpha anthos config sync repo describeשוב.מריצים את הפקודה הבאה כדי לקבל מידע נוסף על ההפרה המשויכת:
kubectl get asmauthzpolicydefaultdeny.constraints.gatekeeper.sh/default-deny-authorization-policies -ojsonpath='{.status.violations}' | jqהפלט אמור להיראות כך:
[ { "enforcementAction": "deny", "group": "constraints.gatekeeper.sh", "kind": "AsmAuthzPolicyDefaultDeny", "message": "Root namespace <istio-system> does not have a default deny AuthorizationPolicy", "name": "default-deny-authorization-policies", "version": "v1beta1" } ]כדי לפתור את הבעיה, פורסים את
AuthorizationPolicyבמרחב השמותistio-system.הפקודה הבאה משתמשת ב-
sedכדי לעדכן את המניפסטacm-config.yamlכדי ש-סנכרון תצורות יפרוס את המשאבים המשויכים.sed -i "s,root-sync/enforce-authorization-policies,root-sync/fix-default-deny-authorization-policy,g" ~/asm-acm-tutorial-dir/acm-config.yaml gcloud beta container fleet config-management apply \ --membership ${MEMBERSHIP} \ --config ~/asm-acm-tutorial-dir/acm-config.yamlהפקודה הקודמת פורסת את מדיניות
AuthorizationPolicyהבאה לדחיית כל התעבורה במרחב השמותistio-system:צופים בסטטוס של Config Sync עבור
RootSync:gcloud alpha anthos config sync repo describe \ --sync-name root-sync \ --sync-namespace config-management-systemהפלט אמור להיראות כך:
getting 1 RepoSync and RootSync from projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial [ { "clusters": [ "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial" ], "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884", "errors": [], "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/fix-default-deny-authorization-policy@main", "status": "SYNCED" } ]אם מופיע
status: RECONCILINGבמקוםstatus: SYNCED, מחכים כמה דקות ומריצים שוב אתgcloud alpha anthos config sync repo describe.מוודאים שנוצרו
Constraints:kubectl get constraintsשימו לב: יכול להיות שיעברו כמה דקות עד ש-Policy Controller יתחיל להעריך את ה-
Constraintsהאלה. ממתינים ומריצים שוב את הפקודהkubectl get constraintsעד שמקבלים ערכים בעמודהTOTAL-VIOLATIONSלכל שורה.הפלט אמור להיראות כך:
NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS asmsidecarinjection.constraints.gatekeeper.sh/pod-sidecar-injection-annotation deny 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8srequiredlabels.constraints.gatekeeper.sh/namespace-sidecar-injection-label deny 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS asmauthzpolicydefaultdeny.constraints.gatekeeper.sh/default-deny-authorization-policies deny 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS asmpeerauthnmeshstrictmtls.constraints.gatekeeper.sh/mesh-level-strict-mtls deny 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS destinationruletlsenabled.constraints.gatekeeper.sh/destination-rule-tls-enabled deny 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS asmpeerauthnstrictmtls.constraints.gatekeeper.sh/peerauthentication-strict-mtls deny 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS asmauthzpolicyenforcesourceprincipals.constraints.gatekeeper.sh/authz-source-principals-not-all deny 0נכנסים לאפליקציה Online Boutique מהדפדפן:
echo http://${EXTERNAL_IP}אמורה להופיע השגיאה
RBAC: access denied, שמאשרת שכלל ברירת המחדל לדחייהAuthorizationPolicyחל על כל הרשת.כדי לפתור את הבעיה, צריך לפרוס
AuthorizationPoliciesיותר גרנולריות בasm-ingressובמרחבי השמותonlineboutique.הפקודה הבאה משתמשת ב-
sedכדי לעדכן את המניפסטacm-config.yaml, כדי ש-Config Sync יפרוס את המשאבים המשויכים.sed -i "s,root-sync/fix-default-deny-authorization-policy,root-sync/deploy-authorization-policies,g" ~/asm-acm-tutorial-dir/acm-config.yaml gcloud beta container fleet config-management apply \ --membership ${MEMBERSHIP} \ --config ~/asm-acm-tutorial-dir/acm-config.yamlהפקודה הקודמת פורסת את המשאבים הבאים:
AuthorizationPolicyבמרחב השמותasm-ingress:AuthorizationPolicyלכל אפליקציה במרחב השמותonlineboutique. הנה דוגמה לאפליקציהcartservice:
ServiceAccountאחד לכל אפליקציה במרחבי השמותasm-ingressו-onlineboutiqueכדי שלכל אפליקציה תהיה זהות ייחודית שמוערכת בתורprincipalב-AuthorizationPolicies. הנה דוגמה לאפליקצייתcartservice:
בודקים את סטטוס סנכרון תצורות עבור
RootSyncושניRepoSyncs:gcloud alpha anthos config sync repo describeהפלט אמור להיראות כך:
getting 3 RepoSync and RootSync from projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial [ { "clusters": [ "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial" ], "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884", "errors": [], "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/deploy-authorization-policies@main", "status": "SYNCED" }, { "clusters": [ "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial" ], "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884", "errors": [], "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/ingress-gateway/authorization-policies@main", "status": "SYNCED" }, { "clusters": [ "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial" ], "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884", "errors": [], "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/online-boutique/authorization-policies@main", "status": "SYNCED" } ]אם מופיע
status: RECONCILINGבמקוםstatus: SYNCED, מחכים כמה דקות ומריצים שוב אתgcloud alpha anthos config sync repo describe.כדי לראות רק את המידע של מאגר אחד, אפשר להשתמש בדגלים
--sync-nameו---sync-namespace. כדי לראות את המשאבים המנוהלים בפירוט, אפשר להוסיף את הדגל--managed-resources. מידע נוסף זמין במאמר בנושא הצגת סטטוס סנכרון ההגדרות בכמה אשכולות.נכנסים שוב לאפליקציה Online Boutique מהדפדפן:
echo http://${EXTERNAL_IP}אם תחכו כמה דקות, האתר אמור לפעול שוב כצפוי.
צפייה בסטטוס של תכונות האבטחה ב-GKE Enterprise
במסוף Google Cloud אפשר לראות את הסטטוס של תכונות האבטחה של GKE Enterprise, כולל מדיניות האימות וההרשאה.
נכנסים לדף GKE Enterprise Security במסוף Google Cloud .
סיכום המדיניות מציג את הסטטוס של אבטחת האפליקציה, כולל בקרת גישה לשירות (
AuthorizationPolicies) ו-mTLS.לוחצים על Policy Audit כדי לראות את סטטוס המדיניות של עומסי העבודה עבור האשכול ושני מרחבי השמות (
asm-ingressו-onlineboutique).הכרטיסים Service access control ו-mTLS status מספקים סקירה כללית ברמה גבוהה.

ברשימה Workloads מוצגים הסטטוסים של בקרת הגישה לשירות ושל mTLS לכל עומס עבודה.

עכשיו האשכול ורשת השירותים מאובטחים באמצעות Policy Controller ו-Config Sync.
הסרת המשאבים
כדי להימנע מחיובים בחשבון Google Cloud בגלל השימוש במשאבים שנעשה במסגרת המדריך הזה, אפשר למחוק את הפרויקט שמכיל את המשאבים או להשאיר את הפרויקט ולמחוק את המשאבים הנפרדים.
מחיקת הפרויקט
כדי למחוק Google Cloud פרויקט:
gcloud projects delete PROJECT_ID
מחיקת משאבים בודדים
כדי למחוק את המשאבים הבודדים:
מבטלים את הרישום של האשכול ב-Fleet:
gcloud
gcloud container fleet memberships unregister ${CLUSTER} \ --project=${PROJECT_ID} \ --gke-cluster=${CLUSTER_ZONE}/${CLUSTER}הפלט אמור להיראות כך:
kubeconfig entry generated for asm-acm-tutorial. Waiting for membership to be deleted...done. Deleting membership CR in the cluster...done. Deleting namespace [gke-connect] in the cluster...done.Config Connector
kubectl delete -f ~/asm-acm-tutorial-dir/fleet-membership.yamlמוחקים את האשכול:
gcloud
gcloud container clusters delete ${CLUSTER} \ --zone ${CLUSTER_ZONE}כשמתבקשים, לוחצים על
y. הפקודה הזו יכולה להימשך יותר מחמש דקות.הפלט אמור להיראות כך:
Deleting cluster asm-acm-tutorial...done. Deleted [https://container.googleapis.com/v1/projects/PROJECT_ID/zones/us-east4-a/clusters/asm-acm-tutorial].Config Connector
kubectl delete -f ~/asm-acm-tutorial-dir/container-cluster.yamlמוחקים את הקבצים שיצרתם:
rm -r ~/asm-acm-tutorial-dir
המאמרים הבאים
- שיטות מומלצות לאבטחה של Cloud Service Mesh
- מידע נוסף על חבילת המדיניות של Cloud Service Mesh
- ספריית תבניות האילוצים של Policy Controller.
- כדאי להעמיק את הקריאה ולהכיר דוגמאות לארכיטקטורות, תרשימים ושיטות מומלצות בנושאי Google Cloud. כל אלה זמינים במרכז הארכיטקטורה של Cloud.