במדריך הזה מוסבר איך לשפר את מצב האבטחה של האשכול והאפליקציה. נניח שאתם אדמינים של פלטפורמה בארגון שמנהל את האפליקציות של החנות הווירטואלית שלו באמצעות Cloud Service Mesh, חבילת כלים שעוזרת לכם לנטר ולנהל רשת Service mesh אמינה. אתם אחראים לוודא שהרשת והאפליקציות שלכם מאובטחות.
כדי למנוע טעויות בהגדרות ולאמת באופן אוטומטי את המדיניות של Cloud Service Mesh, אפשר להשתמש ב-Policy Controller וב-סנכרון תצורות. Policy Controller מאפשר לאכוף מדיניות שניתנת לתכנות מלא באשכולות. בנוסף, Policy Controller כולל ספריית ברירת מחדל של תבניות הגבלות שאפשר להשתמש בהן עם חבילת האבטחה של Cloud Service Mesh כדי לבדוק את התאימות של פרצות האבטחה ושיטות מומלצות ברשת. סנכרון תצורות מבצע התאמה רציפה בין מצב האשכולות לבין קבוצה מרכזית של קובצי תצורה דקלרטיביים של Kubernetes. שימוש משולב ב-Policy Controller וב-סנכרון תצורות מאפשר לכם לאכוף באופן רציף מגבלות על הגדרות המדיניות של Cloud Service Mesh.
בתרשים הבא מוצג סקירה כללית של אופן הפעולה של Cloud Service Mesh, Policy Controller ו-סנכרון תצורות יחד במדריך הזה כדי לנהל ולהגן על שער כניסה ועל אפליקציות לדוגמה של Online Boutique שבהן משתמשים במדריך הזה:
מטרות
- יוצרים אשכול Google Kubernetes Engine (GKE) ורושמים את האשכול בצי.
- מתקינים את Policy Controller, סנכרון תצורות ו-Cloud Service Mesh באשכול.
- הגדרת סנכרון תצורות לסנכרון של כמה מאגרי מידע
- כדאי ליישם שיטות מומלצות כדי לפרוס הגדרות, אפליקציות ומשאבי Istio באמצעות סנכרון תצורות.
- פריסת הגדרות של אשכולות, אפליקציות לדוגמה של Online Boutique ושער כניסה (ingress) באמצעות סנכרון תצורות.
- כדי לאכוף את השיטות המומלצות הבאות לאבטחה, אפשר להשתמש בחבילת המדיניות של 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 או יוצרים אותו.
תפקידים שנדרשים כדי לבחור או ליצור פרויקט
- Select a project: כדי לבחור פרויקט לא צריך תפקיד IAM ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
-
יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד Project Creator (יצירת פרויקטים) (
roles/resourcemanager.projectCreator), שכולל את ההרשאהresourcemanager.projects.create. איך מקצים תפקידים
הכנת הסביבה
בקטע הזה מכינים את הסביבה כדי שיהיה אפשר להתקין את Cloud Service Mesh, Policy Controller וסנכרון תצורות:
-
במסוף 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. Fleets הם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שאוחזר קודם.הפעולה הזו יכולה להימשך יותר מחמש דקות.
כדי לוודא שאשכול 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ראשון, מכיל את כל המשאבים שנדרשים לפריסת שער כניסה (ingress gateway) ולאבטחה הדרגתית שלו במהלך ההדרכה הזו. -
online-boutique, כRepoSyncשני, מכיל את כל המשאבים שנדרשים לפריסת אפליקציות Online Boutique ולאבטחה הדרגתית שלהן לאורך המדריך הזה.
התקנה של Policy Controller, סנכרון תצורות ו-Cloud Service Mesh מנוהל
אחרי שיצרתם ורשמתם את האשכול, אתם יכולים להתקין את Config Sync, 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 בצי.
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 ו-סנכרון תצורות מותקנים באשכול. לאחר מכן, סנכרון תצורות מתחיל לסנכרן את כל ההגדרות של ברירת המחדל
RootSyncעם האשכול שלכם. ההגדרות האלה מתקינות ומגדירות את הרכיבים העיקריים הבאים:האובייקטים
RepoSyncשמגדירים את אפליקציות Online Boutique ואת שער הכניסה מסונכרנים:מכיוון שלמנגנוני ההתאמה
RepoSyncנדרשות הרשאות נוספות כדי ליצור משאבי Istio, מוחלים על האשכול גםClusterRoleושני אובייקטים מסוגRoleBindingכדי להעניק את ההרשאות האלה:
כדי לוודא שההתקנה של Policy Controller ו-סנכרון תצורות בוצעה בהצלחה, בודקים את הסטטוס:
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 ושער כניסה לניהול תעבורת נתונים נכנסת (ingress).
מפעילים את אפליקציית הדוגמה Online Boutique ואת שער הכניסה.
הפקודה הבאה משתמשת ב-
sedכדי לעדכן את המניפסטacm-config.yamlכדי שסנכרון תצורות יפרוס את המשאבים שדרושים לפריסת שער הכניסה ואפליקציית הדוגמה.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השלב הזה יכול להימשך כמה דקות.
בודקים את סטטוס סנכרון התצורות ב-
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: SYNCEDמופיעstatus: RECONCILING, צריך להמתין כמה דקות ולהריץ את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}")כדי לוודא שאפליקציית Online Boutique נפרסה בהצלחה, נכנסים לכתובת ה-IP מהדפדפן:
echo http://${EXTERNAL_IP}
אכיפת כללי מדיניות לאבטחת הרשת
בקטעים הבאים, משתמשים ב-Policy Controller כדי לאכוף מדיניות מחבילת המדיניות של Cloud Service Mesh על ידי יצירת אילוצים.
אכיפה של החדרת שרתי proxy מסוג sidecar
בקטע הזה אוכפים מדיניות כדי לוודא שהזרקת sidecar אוטומטית מופעלת בכל עומסי העבודה ברשת.
כדי לאכוף את ההחדרה של פרוקסי מסוג sidecar, צריך להחיל אילוצים.
הפקודה הבאה משתמשת ב-
sedכדי לעדכן את המניפסטacm-config.yaml, כך שסנכרון תצורות יפרוס את המשאבים המשויכים.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ברשת יכיל את התווית הספציפית להזרקת שרת proxy מסוג sidecar של Cloud Service Mesh:
AsmSidecarInjectionConstraintשמונע מכלPodברשת לעקוף את הזרקת ה-sidecar של Istio proxy:
צופים בסטטוס של סנכרון תצורות עבור
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: SYNCEDמופיעstatus: RECONCILING, צריך להמתין כמה דקות ולהריץ את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:
צופים בסטטוס של סנכרון תצורות עבור
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. כדי למנוע מכל השירותים ברשת לקבל תנועה לא מוצפנת, צריך להגדיר מדיניות ברמת הרשת עם מצב mTLS שמוגדר ל-STRICT.PeerAuthenticationכשפורסים את המדיניות, מישור הבקרה מקצה באופן אוטומטי אישורי 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על כל הרשת:צופים בסטטוס של סנכרון תצורות עבור
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: SYNCEDמופיעstatus: RECONCILING, צריך להמתין כמה דקות ולהריץ את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מגדיר ישויות מקור גרנולריות (חוץ מ-'*'). רק שער הכניסה (ingress) במרחב השמותasm-ingressהוא חריג לכלל הזה, כדי לקבל את התעבורה מהמשתמשי קצה ולהפנות אותה לאפליקצייתfrontendשל Online Boutique.
צופים בסטטוס של סנכרון תצורות עבור
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:צופים בסטטוס של סנכרון תצורות עבור
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: SYNCEDמופיעstatus: RECONCILING, צריך להמתין כמה דקות ולהריץ את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שמאשרת שההגדרהAuthorizationPolicydefault deny חלה על כל הרשת.כדי לפתור את הבעיה, צריך לפרוס
AuthorizationPoliciesיותר גרנולרי במרחבי השמותasm-ingressו-onlineboutique.הפקודה הבאה משתמשת ב-
sedכדי לעדכן את המניפסטacm-config.yaml, כך שסנכרון תצורות יפרוס את המשאבים המשויכים.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: SYNCEDמופיעstatus: RECONCILING, צריך להמתין כמה דקות ולהריץ אתgcloud alpha anthos config sync repo describeשוב.כדי לראות רק את המידע של מאגר אחד, אפשר להשתמש בדגלים
--sync-nameו---sync-namespace. כדי לראות את המשאבים המנוהלים בפירוט, אפשר להוסיף את הדגל--managed-resources. מידע נוסף זמין במאמר בנושא הצגת סטטוס סנכרון ההגדרות בכמה אשכולות.עוברים שוב לאפליקציית Online Boutique מהדפדפן:
echo http://${EXTERNAL_IP}אם תמתינו כמה דקות, האתר אמור לפעול שוב כצפוי.
צפייה בסטטוס של תכונות האבטחה ב-GKE Enterprise
אפשר לראות את הסטטוס של תכונות האבטחה של GKE Enterprise, כולל מדיניות אימות והרשאה, ב Google Cloud מסוף.
נכנסים לדף GKE Enterprise Security במסוף Google Cloud .
מעבר אל GKE Enterprise Security
בסיכום המדיניות מוצג הסטטוס של אבטחת האפליקציות, כולל בקרת הגישה לשירותים (
AuthorizationPolicies) ו-mTLS.לוחצים על Policy Audit כדי לראות את סטטוסי המדיניות של עומסי העבודה עבור האשכול ושני מרחבי השמות (
asm-ingressו-onlineboutique).בכרטיסים בקרת גישה לשירות ו-מצב mTLS מוצגת סקירה כללית ברמה גבוהה.

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

עכשיו האשכול והרשת שלכם מאובטחים באמצעות Policy Controller וסנכרון תצורות.
הסרת המשאבים
כדי להימנע מחיובים בחשבון 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.