ל-Policy Controller יש ספרייה של תבניות הגבלות שניתן להשתמש בהן עם חבילת המדיניות של MITRE כדי להעריך את התאימות של משאבי האשכול להיבטים מסוימים של מאגר הידע של MITRE בנושא טקטיקות וטכניקות של יריבים, על סמך תצפיות בעולם האמיתי.
בדף הזה מוסבר איך להחיל חבילת מדיניות באופן ידני. אפשרות אחרת היא להחיל חבילות מדיניות ישירות.
מגבלות של חבילת מדיניות MITRE
| שם המגבלה | תיאור המגבלה |
|---|---|
| mitre-v2024-apparmor | הגבלת הפרופיל AppArmor ב-Pods.
|
| mitre-v2024-block-all-ingress | מגביל את היצירה של אובייקטים מסוג Ingress. |
| mitre-v2024-cronjob-restrict-repos | מגבילה את תמונות הקונטיינרים של CronJob לרשימת repos מותרת.
|
| mitre-v2024-no-anonymous | האפשרות הזו לא מאפשרת לשייך משאבי ClusterRole ו-Role למשתמש system:anonymous ולקבוצה system:unauthenticated.
|
| mitre-v2024-host-namespaces-host-pid-ipc | אי אפשר להריץ קונטיינרים עם הערך true של hostPID או hostIPC.
|
| mitre-v2024-host-namespaces-hostnetwork | אי אפשר להפעיל קונטיינרים עם hostNetwork שמוגדר כ-true.
|
| mitre-v2024-host-ports | HostPorts צריך לאסור את השימוש בהם, או לפחות להגביל אותו לרשימה ידועה.
|
| mitre-v2024-no-secrets-as-env-vars | מגביל את השימוש בסודות כמשתני סביבה בהגדרות של קונטיינרים. |
| mitre-v2024-privileged-containers | הגבלת מאגרי תגים עם הערך true שהוגדר למשתנה securityContext.privileged.
|
| mitre-v2024-proc-mount-type | מסכות ברירת המחדל /proc מצמצמות את שטח ההתקפה, והן נדרשות.
|
| mitre-v2024-require-binauthz | נדרש Binary Authorization Validating Admission Webhook. |
| mitre-v2024-require-namespace-networkpolicy | הדרישה היא שלכל מרחב שמות שמוגדר באשכול תהיה מדיניות NetworkPolicy. |
| mitre-v2024-restrict-admission-controller | מגבילה את השימוש בבקרי קבלה דינמיים וב-webhooks. |
| mitre-v2024-restrict-automountserviceaccounttoken | מגביל את השימוש בטוקנים של חשבונות שירות. |
| mitre-v2024-restrict-capabilities | אסור להוסיף יכולות מעבר לאלה שמפורטות. |
| mitre-v2024-restrict-cluster-admin-role | הגבלת השימוש בתפקיד cluster-admin.
|
| mitre-v2024-restrict-hostpath-volumes | מגבילה את השימוש בכרכים של HostPath.
|
| mitre-v2024-restrict-kubernetes-dashboard-namespace | מגבילה את השימוש במרחב השמות kubernetes-dashboard.
|
| mitre-v2024-restrict-pods-exec | הגבלת השימוש ב-pods/exec ב-Roles וב-ClusterRoles.
|
| mitre-v2024-restrict-rbac-subjects | מגביל את השימוש בשמות בנושאי RBAC לערכים מותרים. |
| mitre-v2024-restrict-repos | המדיניות הזו מגבילה את תמונות הקונטיינרים לרשימה מותרת של repos.
|
| mitre-v2024-restrict-role-secrets | מגבילה את השימוש בסודות ב-Roles וב-ClusterRoles.
|
| mitre-v2024-restrict-windows-hostprocess | הגבלת ההפעלה של מארחים של Windows בתהליכי קונטיינרים או פודים |
| mitre-v2024-seccomp | הערך של פרופיל Seccomp לא יכול להיות Unconfined.
|
| mitre-v2024-selinux | אי אפשר להגדיר את סוג SELinux או להגדיר אפשרות מותאמת אישית של משתמש או תפקיד ב-SELinux. |
| mitre-v2024-sysctls | מאגרי תגים יכולים להגדיר רק sysctls שמופיעים בשדה allowedSysctls.
|
לפני שמתחילים
- מתקינים ומאתחלים את Google Cloud CLI, שמספק את הפקודות
gcloudו-kubectlשמשמשות בהוראות האלה. אם אתם משתמשים ב-Cloud Shell, Google Cloud CLI מותקן מראש. - מתקינים את Policy Controller גרסה 1.17.2 ואילך באשכול עם ספריית ברירת המחדל של תבניות אילוץ. בנוסף, צריך להפעיל תמיכה באילוצים שלמותיים כי החבילה הזו מכילה אילוצים כאלה.
הגדרת Policy Controller לאילוצים של הפניות
שומרים את מניפסט ה-YAML הבא בקובץ בשם
policycontroller-config.yaml. קובץ המניפסט מגדיר את Policy Controller כך שיעקוב אחרי סוגים ספציפיים של אובייקטים.apiVersion: config.gatekeeper.sh/v1alpha1 kind: Config metadata: name: config namespace: "gatekeeper-system" spec: sync: syncOnly: - group: "networking.k8s.io" version: "v1" kind: "NetworkPolicy" - group: "admissionregistration.k8s.io" version: "v1" kind: "ValidatingWebhookConfiguration"החלת מניפסט
policycontroller-config.yaml:kubectl apply -f policycontroller-config.yaml
ביקורת של חבילת מדיניות MITRE
בעזרת Policy Controller אפשר לאכוף מדיניות באשכול Kubernetes. כדי לעזור לבדוק את עומסי העבודה ואת התאימות שלהם למדיניות MITRE שמפורטת בטבלה שלמעלה, אפשר לפרוס את האילוצים האלה במצב 'ביקורת' כדי לגלות הפרות, וחשוב מכך, כדי לתת לעצמכם הזדמנות לתקן אותן לפני האכיפה באשכול Kubernetes.
אפשר להחיל את כללי המדיניות האלה עם spec.enforcementAction שמוגדר כ-dryrun באמצעות kubectl, kpt או סנכרון תצורות.
kubectl
(אופציונלי) מציגים בתצוגה מקדימה את האילוצים של המדיניות באמצעות kubectl:
kubectl kustomize https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/mitre-v2024
מחילים את אילוצי המדיניות באמצעות kubectl:
kubectl apply -k https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/mitre-v2024
הפלט שיתקבל:
k8sallowedrepos.constraints.gatekeeper.sh/mitre-v2024-restrict-repos created k8sblockallingress.constraints.gatekeeper.sh/mitre-v2024-block-all-ingress created k8scronjoballowedrepos.constraints.gatekeeper.sh/mitre-v2024-cronjob-restrict-repos created k8sdisallowanonymous.constraints.gatekeeper.sh/mitre-v2024-no-anonymous created k8snoenvvarsecrets.constraints.gatekeeper.sh/mitre-v2024-no-secrets-as-env-vars created k8spspapparmor.constraints.gatekeeper.sh/mitre-v2024-apparmor created k8spspcapabilities.constraints.gatekeeper.sh/mitre-v2024-restrict-capabilities created k8spspforbiddensysctls.constraints.gatekeeper.sh/mitre-v2024-sysctls created k8spsphostfilesystem.constraints.gatekeeper.sh/mitre-v2024-restrict-hostpath-volumes created k8spsphostnamespace.constraints.gatekeeper.sh/mitre-v2024-host-namespaces-host-pid-ipc created k8spsphostnetworkingports.constraints.gatekeeper.sh/mitre-v2024-host-namespaces-hostnetwork created k8spsphostnetworkingports.constraints.gatekeeper.sh/mitre-v2024-host-ports created k8spspprivilegedcontainer.constraints.gatekeeper.sh/mitre-v2024-privileged-containers created k8spspprocmount.constraints.gatekeeper.sh/mitre-v2024-proc-mount-type created k8spspselinuxv2.constraints.gatekeeper.sh/mitre-v2024-selinux created k8spspseccomp.constraints.gatekeeper.sh/mitre-v2024-seccomp created k8spspwindowshostprocess.constraints.gatekeeper.sh/mitre-v2024-restrict-windows-hostprocess created k8srequirebinauthz.constraints.gatekeeper.sh/mitre-v2024-require-binauthz created k8srequirenamespacenetworkpolicies.constraints.gatekeeper.sh/mitre-v2024-require-namespace-networkpolicy created k8srestrictadmissioncontroller.constraints.gatekeeper.sh/mitre-v2024-restrict-admission-controller created k8srestrictautomountserviceaccounttokens.constraints.gatekeeper.sh/mitre-v2024-restrict-automountserviceaccounttoken created k8srestrictnamespaces.constraints.gatekeeper.sh/mitre-v2024-restrict-kubernetes-dashboard-namespace created k8srestrictrbacsubjects.constraints.gatekeeper.sh/mitre-v2024-restrict-rbac-subjects created k8srestrictrolebindings.constraints.gatekeeper.sh/mitre-v2024-restrict-cluster-admin-role created k8srestrictrolerules.constraints.gatekeeper.sh/mitre-v2024-restrict-pods-exec created k8srestrictrolerules.constraints.gatekeeper.sh/mitre-v2024-restrict-role-secrets created
מוודאים שאילוצי המדיניות הותקנו ובודקים אם יש הפרות באשכול:
kubectl get constraints -l policycontroller.gke.io/bundleName=mitre-v2024
הפלט אמור להיראות כך:
NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8sallowedrepos.constraints.gatekeeper.sh/mitre-v2024-restrict-repos dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8sblockallingress.constraints.gatekeeper.sh/mitre-v2024-block-all-ingress dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8scronjoballowedrepos.constraints.gatekeeper.sh/mitre-v2024-cronjob-restrict-repos dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8sdisallowanonymous.constraints.gatekeeper.sh/mitre-v2024-no-anonymous dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8snoenvvarsecrets.constraints.gatekeeper.sh/mitre-v2024-no-secrets-as-env-vars dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspapparmor.constraints.gatekeeper.sh/mitre-v2024-apparmor dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspcapabilities.constraints.gatekeeper.sh/mitre-v2024-restrict-capabilities dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspforbiddensysctls.constraints.gatekeeper.sh/mitre-v2024-sysctls dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spsphostfilesystem.constraints.gatekeeper.sh/mitre-v2024-restrict-hostpath-volumes dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spsphostnamespace.constraints.gatekeeper.sh/mitre-v2024-host-namespaces-host-pid-ipc dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spsphostnetworkingports.constraints.gatekeeper.sh/mitre-v2024-host-namespaces-hostnetwork dryrun 0 k8spsphostnetworkingports.constraints.gatekeeper.sh/mitre-v2024-host-ports dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspprivilegedcontainer.constraints.gatekeeper.sh/mitre-v2024-privileged-containers dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspprocmount.constraints.gatekeeper.sh/mitre-v2024-proc-mount-type dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspseccomp.constraints.gatekeeper.sh/mitre-v2024-seccomp dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspselinuxv2.constraints.gatekeeper.sh/mitre-v2024-selinux dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspwindowshostprocess.constraints.gatekeeper.sh/mitre-v2024-restrict-windows-hostprocess dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8srequirebinauthz.constraints.gatekeeper.sh/mitre-v2024-require-binauthz dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8srequirenamespacenetworkpolicies.constraints.gatekeeper.sh/mitre-v2024-require-namespace-networkpolicy dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8srestrictadmissioncontroller.constraints.gatekeeper.sh/mitre-v2024-restrict-admission-controller dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8srestrictautomountserviceaccounttokens.constraints.gatekeeper.sh/mitre-v2024-restrict-automountserviceaccounttoken dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8srestrictnamespaces.constraints.gatekeeper.sh/mitre-v2024-restrict-kubernetes-dashboard-namespace dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8srestrictrbacsubjects.constraints.gatekeeper.sh/mitre-v2024-restrict-rbac-subjects dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8srestrictrolebindings.constraints.gatekeeper.sh/mitre-v2024-restrict-cluster-admin-role dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8srestrictrolerules.constraints.gatekeeper.sh/mitre-v2024-restrict-pods-exec dryrun 0 k8srestrictrolerules.constraints.gatekeeper.sh/mitre-v2024-restrict-role-secrets dryrun 0
kpt
מתקינים ומגדירים את kpt. ההוראות האלה מתבססות על kpt כדי להתאים אישית ולפרוס משאבי Kubernetes.
מורידים את חבילת המדיניות של MITRE מ-GitHub באמצעות kpt:
kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/mitre-v2024
מריצים את הפונקציה
set-enforcement-actionשל kpt כדי להגדיר את פעולת האכיפה של המדיניות לערךdryrun:kpt fn eval mitre-v2024 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 \ -- enforcementAction=dryrun
מאתחלים את ספריית העבודה באמצעות kpt, שיוצר משאב למעקב אחרי שינויים:
cd mitre-v2024 kpt live init
מחילים את אילוצי המדיניות באמצעות kpt:
kpt live apply
מוודאים שאילוצי המדיניות הותקנו ובודקים אם יש הפרות באשכול:
kpt live status --output table --poll-until current
הסטטוס
CURRENTמאשר שההתקנה של האילוצים בוצעה בהצלחה.
סנכרון תצורות
- מתקינים ומגדירים את kpt. ההוראות האלה מתבססות על kpt כדי להתאים אישית ולפרוס משאבי Kubernetes.
מפעילים שמשתמשים ב-סנכרון תצורות כדי לפרוס מדיניות באשכולות שלהם יכולים להשתמש בהוראות הבאות:
עוברים לספריית הסנכרון של סנכרון תצורות:
cd SYNC_ROOT_DIR
כדי ליצור או להוסיף
.gitignoreבאמצעותresourcegroup.yaml:echo resourcegroup.yaml >> .gitignore
יוצרים ספרייה ייעודית של
policies:mkdir -p policies
מורידים את חבילת המדיניות של MITRE מ-GitHub באמצעות kpt:
kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/mitre-v2024 policies/mitre-v2024
מריצים את הפונקציה
set-enforcement-actionשל kpt כדי להגדיר את פעולת האכיפה של המדיניות לערךdryrun:kpt fn eval policies/mitre-v2024 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=dryrun
(אופציונלי) מציגים בתצוגה מקדימה את אילוצי המדיניות שייווצרו:
kpt live init policies/mitre-v2024 kpt live apply --dry-run policies/mitre-v2024
אם ספריית הסנכרון של סנכרון תצורות משתמשת ב-Kustomize, מוסיפים את
policies/mitre-v2024ל-rootkustomization.yaml. אחרת, מסירים את הקובץpolicies/mitre-v2024/kustomization.yaml:rm SYNC_ROOT_DIR/policies/mitre-v2024/kustomization.yaml
דחיפת השינויים למאגר סנכרון תצורות:
git add SYNC_ROOT_DIR/policies/mitre-v2024 git commit -m 'Adding MITRE policy audit enforcement' git push
מאמתים את סטטוס ההתקנה:
watch gcloud beta container fleet config-management status --project PROJECT_ID
הסטטוס
SYNCEDמאשר שהמדיניות הותקנה.
הצגת הפרות מדיניות
אחרי שמתקינים את מגבלות המדיניות במצב ביקורת, אפשר לראות את ההפרות באשכול בממשק המשתמש באמצעות לוח הבקרה של Policy Controller.
אפשר גם להשתמש בפקודה kubectl כדי לראות את ההפרות באשכול:
kubectl get constraint -l policycontroller.gke.io/bundleName=mitre-v2024 -o json | jq -cC '.items[]| [.metadata.name,.status.totalViolations]'
אם יש הפרות, אפשר לראות רשימה של הודעות ההפרה לכל אילוץ באמצעות הפקודה:
kubectl get constraint -l policycontroller.gke.io/bundleName=mitre-v2024 -o json | jq -C '.items[]| select(.status.totalViolations>0)| [.metadata.name,.status.violations[]?]'
שינוי פעולת האכיפה של חבילת מדיניות MITRE
אחרי שבודקים את הפרות המדיניות באשכול, אפשר לשנות את מצב האכיפה כך שבקרת הכניסה תפעל warn או אפילו deny תחסום החלה של משאב שלא עומד בדרישות על האשכול.
kubectl
משתמשים ב-kubectl כדי להגדיר את פעולת האכיפה של כללי המדיניות ל-
warn:kubectl get constraint -l policycontroller.gke.io/bundleName=mitre-v2024 -o name | xargs -I {} kubectl patch {} --type='json' -p='[{"op":"replace","path":"/spec/enforcementAction","value":"warn"}]'מוודאים שפעולת האכיפה של הגבלות המדיניות עודכנה:
kubectl get constraint -l policycontroller.gke.io/bundleName=mitre-v2024
kpt
מריצים את הפונקציה
set-enforcement-actionשל kpt כדי להגדיר את פעולת האכיפה של המדיניות לערךwarn:kpt fn eval -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn
החלת אילוצי המדיניות:
kpt live apply
סנכרון תצורות
מפעילים שמשתמשים ב-סנכרון תצורות כדי לפרוס מדיניות באשכולות שלהם יכולים להשתמש בהוראות הבאות:
עוברים לספריית הסנכרון של סנכרון תצורות:
cd SYNC_ROOT_DIR
מריצים את הפונקציה
set-enforcement-actionשל kpt כדי להגדיר את פעולת האכיפה של המדיניות לערךwarn:kpt fn eval policies/mitre-v2024 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn
דחיפת השינויים למאגר סנכרון תצורות:
git add SYNC_ROOT_DIR/policies/mitre-v2024 git commit -m 'Adding MITRE policy bundle warn enforcement' git push
מאמתים את סטטוס ההתקנה:
nomos status
האשכול צריך להציג סטטוס של
SYNCEDעם המדיניות המותקנת.
בדיקת אכיפת המדיניות
יוצרים באשכול משאב שלא עומד בדרישות באמצעות הפקודה הבאה:
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
namespace: default
name: wp-non-compliant
labels:
app: wordpress
spec:
containers:
- image: wordpress
name: wordpress
ports:
- containerPort: 80
name: wordpress
EOF
בקרת הכניסה צריכה להפיק אזהרה עם רשימה של הפרות המדיניות שמתרחשות במשאב הזה, כמו בדוגמה הבאה:
Warning: [mitre-v2024-restrict-repos] container <wordpress> has an invalid image repo <wordpress>, allowed repos are ["gcr.io/gke-release/", "gcr.io/anthos-baremetal-release/", "gcr.io/gke-on-prem-release/", "gcr.io/gke-multi-cloud-release/", "gcr.io/config-management-release/", "gcr.io/kubebuilder/", "gcr.io/gkeconnect/", "gke.gcr.io/"] pod/wp-non-compliant created
הסרת חבילת מדיניות של MITRE
במקרה הצורך, אפשר להסיר את חבילת המדיניות של MITRE מהאשכול.
kubectl
משתמשים ב-kubectl כדי להסיר את כללי המדיניות:
kubectl delete constraint -l policycontroller.gke.io/bundleName=mitre-v2024
kpt
מסירים את כללי המדיניות:
kpt live destroy
סנכרון תצורות
מפעילים שמשתמשים ב-סנכרון תצורות כדי לפרוס מדיניות באשכולות שלהם יכולים להשתמש בהוראות הבאות:
דחיפת השינויים למאגר סנכרון תצורות:
git rm -r SYNC_ROOT_DIR/policies/mitre-v2024 git commit -m 'Removing MITRE policies' git push
בודקים את הסטטוס:
nomos status
האשכול אמור להציג סטטוס של
SYNCEDעם המשאבים שהוסרו.