שימוש באילוצים של מדיניות בסיסית בנושא תקני אבטחת Pod

‫Policy Controller מגיע עם ספריית ברירת מחדל של תבניות אילוצים שאפשר להשתמש בהן עם חבילת הבסיס של תקני אבטחת ה-Pod. החבילה הזו מאפשרת לכם להשיג הרבה מאותם אמצעי הגנה כמו מדיניות הבסיס של תקני האבטחה של Kubernetes Pod (PSS), עם אפשרות לבדוק את המדיניות לפני שמפעילים אותה ולכלול כיסוי של משאבים ספציפיים.

בדף הזה מוסבר איך להחיל חבילת מדיניות באופן ידני. אפשרות אחרת היא להחיל חבילות מדיניות ישירות.

הדף הזה מיועד לאדמינים ולמפעילים בתחום ה-IT שרוצים לוודא שכל המשאבים שפועלים בפלטפורמת הענן עומדים בדרישות התאימות של הארגון. כדי לעשות את זה, הם יכולים לספק ולתחזק אוטומציה לביקורת או לאכיפה. מידע נוסף על תפקידים נפוצים ועל דוגמאות למשימות שאנחנו מתייחסים אליהן בתוכן של Google Cloud , זמין במאמר תפקידים נפוצים של משתמשים ומשימות ב-GKE.

מגבלות של חבילת מדיניות בסיסית של תקני אבטחת Pod

שם המגבלה תיאור המגבלה שם הבקרה
pss-baseline-v2022-hostprocess שימוש ב-Windows HostProcess HostProcess
pss-baseline-v2022-host-namespaces-hostnetwork שימוש ברשת המארח מרחבי שמות של מארחים
pss-baseline-v2022-host-namespaces-host-pid-ipc שימוש במרחבי שמות של מארחים
pss-baseline-v2022-privileged-containers הפעלה של קונטיינרים עם הרשאות קונטיינרים עם הרשאות מיוחדות
pss-baseline-v2022-capabilities יכולות של Linux יכולות
pss-baseline-v2022-hostpath-volumes שימוש במערכת הקבצים של המארח כרכים של HostPath
pss-baseline-v2022-host-ports שימוש ביציאות של המארח יציאות של המארח (ניתנות להגדרה)
pss-baseline-v2022-apparmor פרופיל AppArmor שמשמש קונטיינרים AppArmor
pss-baseline-v2022-selinux ההקשר של SELinux בקונטיינר SELinux
pss-baseline-v2022-proc-mount-type סוגי Proc Mount המותרים עבור הקונטיינר ‫/proc סוג ההרכבה
pss-baseline-v2022-seccomp פרופיל ה-seccomp שבו נעשה שימוש בקונטיינרים Seccomp
pss-baseline-v2022-sysctls פרופיל sysctl שמשמש קונטיינרים ‫Sysctls

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

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

ביקורת של חבילת המדיניות Baseline של תקני אבטחת Pod

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

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

kubectl

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

    kubectl kustomize https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/pss-baseline-v2022
    
  2. מחילים את אילוצי המדיניות באמצעות kubectl:

    kubectl apply -k https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/pss-baseline-v2022
    

    הפלט שיתקבל:

    k8spspapparmor.constraints.gatekeeper.sh/pss-baseline-v2022-apparmor created
    k8spspcapabilities.constraints.gatekeeper.sh/pss-baseline-v2022-capabilities created
    k8spsphostfilesystem.constraints.gatekeeper.sh/pss-baseline-v2022-hostpath-volumes created
    k8spsphostnamespace.constraints.gatekeeper.sh/pss-baseline-v2022-host-namespaces-host-pid-ipc created
    k8spsphostnetworkingports.constraints.gatekeeper.sh/pss-baseline-v2022-host-namespaces-hostnetwork created
    k8spsphostnetworkingports.constraints.gatekeeper.sh/pss-baseline-v2022-host-ports created
    k8spspprivilegedcontainer.constraints.gatekeeper.sh/pss-baseline-v2022-privileged-containers created
    k8spspprocmount.constraints.gatekeeper.sh/pss-baseline-v2022-proc-mount-type created
    k8spspselinuxv2.constraints.gatekeeper.sh/pss-baseline-v2022-selinux created
    k8spspseccomp.constraints.gatekeeper.sh/pss-baseline-v2022-seccomp created
    k8spspforbiddensysctls.constraints.gatekeeper.sh/pss-baseline-v2022-sysctls created
    
  3. מוודאים שאילוצי המדיניות הותקנו ובודקים אם יש הפרות באשכול:

    kubectl get -k https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/pss-baseline-v2022
    

    הפלט אמור להיראות כך:

    NAME                                                                   ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spspapparmor.constraints.gatekeeper.sh/pss-baseline-v2022-apparmor                        0
    
    NAME                                                                           ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spspcapabilities.constraints.gatekeeper.sh/pss-baseline-v2022-capabilities   dryrun               0
    
    NAME                                                                                 ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spsphostfilesystem.constraints.gatekeeper.sh/pss-baseline-v2022-hostpath-volumes                        0
    
    NAME                                                                                            ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spsphostnamespace.constraints.gatekeeper.sh/pss-baseline-v2022-host-namespaces-host-pid-ipc   dryrun               0
    
    NAME                                                                                                 ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spsphostnetworkingports.constraints.gatekeeper.sh/pss-baseline-v2022-host-namespaces-hostnetwork   dryrun               0
    k8spsphostnetworkingports.constraints.gatekeeper.sh/pss-baseline-v2022-host-ports                    dryrun               0
    
    NAME                                                                                           ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spspprivilegedcontainer.constraints.gatekeeper.sh/pss-baseline-v2022-privileged-containers   dryrun               0
    
    NAME                                                                           ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spspprocmount.constraints.gatekeeper.sh/pss-baseline-v2022-proc-mount-type                        0
    
    NAME                                                                   ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spspselinuxv2.constraints.gatekeeper.sh/pss-baseline-v2022-selinux                        0
    
    NAME                                                                 ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spspseccomp.constraints.gatekeeper.sh/pss-baseline-v2022-seccomp   dryrun               0
    
    NAME                                                                          ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spspforbiddensysctls.constraints.gatekeeper.sh/pss-baseline-v2022-sysctls   dryrun               0
    
  4. (אופציונלי) משנים את המגבלה pss-baseline-v2022-host-ports כך שתכלול רשימה מינימלית של יציאות מוגבלות ידועות עבור סביבת האשכול:

    parameters:
      # A minimum restricted known list can be implemented here.
      min: 0
      max: 0
    

kpt

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

  2. מורידים את חבילת המדיניות Pod Security Standards (PSS) Baseline v2022 מ-GitHub באמצעות kpt:

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

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

    cd pss-baseline-v2022
    kpt live init
    
  5. (אופציונלי) משנים את קובץ האילוצים pss-baseline-v2022-host-ports כדי לכלול רשימה מינימלית של יציאות מוגבלות ידועות עבור סביבת האשכול:

    parameters:
      # A minimum restricted known list can be implemented here.
      min: 0
      max: 0
    
  6. מחילים את אילוצי המדיניות באמצעות kpt:

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

    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. מורידים את חבילת המדיניות Pod Security Standards (PSS) Baseline v2022 מ-GitHub באמצעות kpt:

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

    kpt fn eval policies/pss-baseline-v2022 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=dryrun
    
  5. (אופציונלי) משנים את קובץ האילוצים pss-baseline-v2022-host-ports כדי לכלול רשימה מינימלית של יציאות מוגבלות ידועות עבור סביבת האשכול:

    parameters:
      # A minimum restricted known list can be implemented here.
      min: 0
      max: 0
    
  6. (אופציונלי) מציגים בתצוגה מקדימה את אילוצי המדיניות שייווצרו:

    kpt live init policies/pss-baseline-v2022
    kpt live apply --dry-run policies/pss-baseline-v2022
    

    הפלט שיתקבל:

    Dry-run strategy: client
    inventory update started
    inventory update finished
    apply phase started
    k8spspapparmor.constraints.gatekeeper.sh/pss-baseline-v2022-apparmor apply successful
    k8spspcapabilities.constraints.gatekeeper.sh/pss-baseline-v2022-capabilities apply successful
    k8spsphostfilesystem.constraints.gatekeeper.sh/pss-baseline-v2022-hostpath-volumes apply successful
    k8spsphostnamespace.constraints.gatekeeper.sh/pss-baseline-v2022-host-namespaces-host-pid-ipc apply successful
    k8spsphostnetworkingports.constraints.gatekeeper.sh/pss-baseline-v2022-host-namespaces-hostnetwork apply successful
    k8spsphostnetworkingports.constraints.gatekeeper.sh/pss-baseline-v2022-host-ports apply successful
    k8spspprivilegedcontainer.constraints.gatekeeper.sh/pss-baseline-v2022-privileged-containers apply successful
    k8spspprocmount.constraints.gatekeeper.sh/pss-baseline-v2022-proc-mount-type apply successful
    k8spspselinuxv2.constraints.gatekeeper.sh/pss-baseline-v2022-selinux apply successful
    k8spspseccomp.constraints.gatekeeper.sh/pss-baseline-v2022-seccomp apply successful
    apply phase finished
    inventory update started
    inventory update finished
    apply result: 10 attempted, 10 successful, 0 skipped, 0 failed
    
  7. אם ספריית הסנכרון של סנכרון תצורות משתמשת ב-Kustomize, מוסיפים את policies/pss-baseline-v2022 ל-root kustomization.yaml. אחרת, מסירים את הקובץ policies/pss-baseline-v2022/kustomization.yaml:

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

    git add SYNC_ROOT_DIR/pss-baseline-v2022
    git commit -m 'Adding Pod Security Standards Baseline audit enforcement'
    git push
    
  9. מאמתים את סטטוס ההתקנה:

    watch gcloud beta container fleet config-management status --project PROJECT_ID
    

    הסטטוס SYNCED מאשר שהמדיניות הותקנה.

הצגת הפרות מדיניות

אחרי שמתקינים את מגבלות המדיניות במצב ביקורת, אפשר לראות את ההפרות באשכול בממשק המשתמש באמצעות לוח הבקרה של Policy Controller.

אפשר גם להשתמש בפקודה kubectl כדי לראות את ההפרות באשכול:

kubectl get constraint -l policycontroller.gke.io/bundleName=pss-baseline-v2022 -o json | jq -cC '.items[]| [.metadata.name,.status.totalViolations]'

אם יש הפרות, אפשר לראות רשימה של הודעות ההפרה לכל אילוץ באמצעות הפקודה:

kubectl get constraint -l policycontroller.gke.io/bundleName=pss-baseline-v2022 -o json | jq -C '.items[]| select(.status.totalViolations>0)| [.metadata.name,.status.violations[]?]'

שינוי פעולת האכיפה של חבילת המדיניות של תקני האבטחה של Pod

אחרי שבודקים את הפרות המדיניות באשכול, אפשר לשנות את מצב האכיפה כך שבקרת הכניסה תפעל warn או אפילו deny תחסום החלה של משאב שלא עומד בדרישות על האשכול.

kubectl

  1. משתמשים ב-kubectl כדי להגדיר את פעולת האכיפה של כללי המדיניות ל-warn:

    kubectl get constraint -l policycontroller.gke.io/bundleName=pss-baseline-v2022 -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=pss-baseline-v2022
    

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/pss-baseline-v2022 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn
    
  3. דחיפת השינויים למאגר סנכרון תצורות:

    git add SYNC_ROOT_DIR/policies/pss-baseline-v2022
    git commit -m 'Adding Pod Security Standards Baseline 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
        hostPort: 80
        name: wordpress
EOF

בקרת הכניסה צריכה להפיק אזהרה עם רשימה של הפרות המדיניות שמתרחשות במשאב הזה, כמו בדוגמה הבאה:

Warning:  [pss-baseline-v2022-host-ports] The specified hostNetwork and hostPort are not allowed, pod: wp-non-compliant. Allowed values: {"max": 0, "min": 0}
pod/wp-non-compliant created

הסרת חבילת מדיניות של תקנים בסיסיים לאבטחת Pod

במקרה הצורך, אפשר להסיר את חבילת המדיניות של תקני האבטחה של Pod מהאשכול.

kubectl

  • משתמשים ב-kubectl כדי להסיר את כללי המדיניות:

    kubectl delete constraint -l policycontroller.gke.io/bundleName=pss-baseline-v2022
    

kpt

  • מסירים את כללי המדיניות:

    kpt live destroy
    

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

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

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

    git rm -r SYNC_ROOT_DIR/policies/pss-baseline-v2022
    git commit -m 'Removing Pod Security Standards Baseline policies'
    git push
    
  2. בודקים את הסטטוס:

    nomos status
    

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