שימוש במגבלות מדיניות של MITRE

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 אי אפשר להפעיל קונטיינרים עם הערך true של hostNetwork.
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 HostProcess
mitre-v2024-seccomp הערך של פרופיל Seccomp לא יכול להיות Unconfined.
mitre-v2024-selinux אי אפשר להגדיר את סוג SELinux או להגדיר אפשרות של משתמש או תפקיד SELinux בהתאמה אישית.
mitre-v2024-sysctls מאגרי תגים יכולים להגדיר רק sysctl שמופיעים בשדה allowedSysctls.

לפני שמתחילים

  1. מתקינים ומאתחלים את Google Cloud CLI, שמספק את הפקודות gcloud ו-kubectl שמשמשות בהוראות האלה. אם אתם משתמשים ב-Cloud Shell, ‏ Google Cloud CLI מותקן מראש.
  2. מתקינים את Policy Controller בגרסה ‎1.17.2 ואילך באשכול עם ספריית ברירת המחדל של תבניות אילוץ. בנוסף, צריך להפעיל תמיכה באילוצים שלמותיים כי החבילה הזו מכילה אילוצים כאלה.

הגדרת Policy Controller לאילוצים של הפניות

  1. שומרים את מניפסט ה-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"
    
  2. החלת המניפסט policycontroller-config.yaml:

    kubectl apply -f policycontroller-config.yaml
    

ביקורת של חבילת מדיניות MITRE

בעזרת Policy Controller אפשר לאכוף מדיניות באשכול Kubernetes. כדי לבדוק את עומסי העבודה ואת התאימות שלהם למדיניות MITRE שמפורטת בטבלה שלמעלה, אפשר לפרוס את האילוצים האלה במצב 'ביקורת' כדי לחשוף הפרות, וחשוב מכך, כדי לתת לעצמכם הזדמנות לתקן אותן לפני האכיפה באשכול Kubernetes.

אפשר להחיל את כללי המדיניות האלה עם spec.enforcementAction שמוגדר ל-dryrun באמצעות kubectl,‏ kpt או סנכרון תצורות.

kubectl

  1. (אופציונלי) מציגים בתצוגה מקדימה את אילוצי המדיניות באמצעות kubectl:

    kubectl kustomize https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/mitre-v2024
    
  2. מחילים את אילוצי המדיניות באמצעות 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
    
  3. מוודאים שאילוצי המדיניות הותקנו ובודקים אם יש הפרות בכל האשכול:

    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

  1. מתקינים ומגדירים את kpt. ההוראות האלה מתבססות על שימוש ב-kpt כדי להתאים אישית ולפרוס משאבי Kubernetes.

  2. מורידים את חבילת המדיניות של MITRE מ-GitHub באמצעות kpt:

    kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/mitre-v2024
    
  3. מריצים את הפונקציה set-enforcement-action של kpt כדי להגדיר את פעולת האכיפה של המדיניות לערך dryrun:

    kpt fn eval mitre-v2024 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 \
      -- enforcementAction=dryrun
    
  4. מאתחלים את ספריית העבודה באמצעות kpt, שיוצר משאב למעקב אחרי שינויים:

    cd mitre-v2024
    kpt live init
    
  5. מחילים את אילוצי המדיניות באמצעות kpt:

    kpt live apply
    
  6. מוודאים שאילוצי המדיניות הותקנו ובודקים אם יש הפרות בכל האשכול:

    kpt live status --output table --poll-until current
    

    הסטטוס CURRENT מאשר שההתקנה של האילוצים בוצעה בהצלחה.

סנכרון תצורות

  1. מתקינים ומגדירים את kpt. ההוראות האלה מתבססות על שימוש ב-kpt כדי להתאים אישית ולפרוס משאבי Kubernetes.

מפעילים שמשתמשים ב-סנכרון תצורות כדי לפרוס מדיניות באשכולות שלהם יכולים להשתמש בהוראות הבאות:

  1. עוברים לספריית הסנכרון של סנכרון תצורות:

    cd SYNC_ROOT_DIR
    

    כדי ליצור או להוסיף .gitignore עם resourcegroup.yaml:

    echo resourcegroup.yaml >> .gitignore
    

  2. יוצרים ספרייה ייעודית של policies:

    mkdir -p policies
    
  3. מורידים את חבילת המדיניות של MITRE מ-GitHub באמצעות kpt:

    kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/mitre-v2024 policies/mitre-v2024
    
  4. מריצים את הפונקציה set-enforcement-action של kpt כדי להגדיר את פעולת האכיפה של המדיניות לערך dryrun:

    kpt fn eval policies/mitre-v2024 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=dryrun
    
  5. (אופציונלי) מציגים בתצוגה מקדימה את אילוצי המדיניות שייווצרו:

    kpt live init policies/mitre-v2024
    kpt live apply --dry-run policies/mitre-v2024
    
  6. אם ספריית הסנכרון של סנכרון תצורות משתמשת ב-Kustomize, מוסיפים את policies/mitre-v2024 ל-kustomization.yaml הבסיסי. אחרת, מסירים את הקובץ policies/mitre-v2024/kustomization.yaml:

    rm SYNC_ROOT_DIR/policies/mitre-v2024/kustomization.yaml
    
  7. דחיפת השינויים למאגר סנכרון תצורות:

    git add SYNC_ROOT_DIR/policies/mitre-v2024
    git commit -m 'Adding MITRE policy audit enforcement'
    git push
    
  8. מאמתים את סטטוס ההתקנה:

    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

  1. משתמשים ב-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"}]'
    
  2. מוודאים שפעולת האכיפה של הגבלות המדיניות עודכנה:

    kubectl get constraint -l policycontroller.gke.io/bundleName=mitre-v2024
    

kpt

  1. מריצים את הפונקציה set-enforcement-action של kpt כדי להגדיר את פעולת האכיפה של המדיניות לערך warn:

    kpt fn eval -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn
    
  2. החלת האילוצים של מדיניות הארגון:

    kpt live apply
    

סנכרון תצורות

מפעילים שמשתמשים ב-סנכרון תצורות כדי לפרוס מדיניות באשכולות שלהם יכולים להשתמש בהוראות הבאות:

  1. עוברים לספריית הסנכרון של סנכרון תצורות:

    cd SYNC_ROOT_DIR
    
  2. מריצים את הפונקציה set-enforcement-action של kpt כדי להגדיר את פעולת האכיפה של המדיניות לערך warn:

    kpt fn eval policies/mitre-v2024 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn
    
  3. דחיפת השינויים למאגר סנכרון תצורות:

    git add SYNC_ROOT_DIR/policies/mitre-v2024
    git commit -m 'Adding MITRE policy bundle warn enforcement'
    git push
    
  4. מאמתים את סטטוס ההתקנה:

    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
    

סנכרון תצורות

מפעילים שמשתמשים ב-סנכרון תצורות כדי לפרוס מדיניות באשכולות שלהם יכולים להשתמש בהוראות הבאות:

  1. דחיפת השינויים למאגר סנכרון תצורות:

    git rm -r SYNC_ROOT_DIR/policies/mitre-v2024
    git commit -m 'Removing MITRE policies'
    git push
    
  2. בודקים את הסטטוס:

    nomos status
    

    האשכול אמור להציג סטטוס של SYNCED עם המשאבים שהוסרו.