ב-Policy Controller יש ספריית ברירת מחדל של תבניות אילוצים שאפשר להשתמש בהן עם חבילת מדיניות האבטחה של Pod כדי להשיג רבות מאותן ההגנות כמו מדיניות האבטחה של Pod (PSP) ב-Kubernetes, עם היכולת הנוספת לבדוק את המדיניות לפני האכיפה שלה ולהחריג את הכיסוי של משאבים ספציפיים.
בדף הזה מוסבר איך להחיל חבילת מדיניות באופן ידני. אפשרות אחרת היא להחיל חבילות מדיניות ישירות.
הדף הזה מיועד לאדמינים ולמפעילים בתחום ה-IT שרוצים לוודא שכל המשאבים שפועלים בפלטפורמת הענן עומדים בדרישות התאימות של הארגון. כדי לעשות את זה, הם יכולים לספק ולתחזק אוטומציה לביקורת או לאכיפה. מידע נוסף על תפקידים נפוצים ועל דוגמאות למשימות שאנחנו מתייחסים אליהן בתוכן של Google Cloud , זמין במאמר תפקידים נפוצים של משתמשים ומשימות ב-GKE.
החבילה כוללת את האילוצים האלה שמספקים פרמטרים שמופקים ממדיניות האבטחה של Kubernetes Pod (PSP) שמות השדות (מזהי הבקרה):
| שם המגבלה | תיאור המגבלה | מזהה אמצעי הבקרה |
|---|---|---|
| psp-v2022-psp-allow-privilege-escalation | הגבלת ההסלמה להרשאות root | allowPrivilegeEscalation |
| psp-v2022-psp-apparmor | פרופיל AppArmor שמשמש קונטיינרים | הערות |
| psp-v2022-psp-capabilities | יכולות של Linux | allowedCapabilities, requiredDropCapabilities |
| psp-v2022-flexvolume-drivers | אישור של מנהלי התקנים ספציפיים של FlexVolume | allowedFlexVolumes |
| psp-v2022-psp-forbidden-sysctls | פרופיל sysctl שמשמש קונטיינרים | forbiddenSysctls |
| psp-v2022-psp-fsgroup | הקצאת FSGroup בבעלות נפחי ה-Pod | fsGroup |
| psp-v2022-psp-host-filesystem | שימוש במערכת הקבצים של המארח | allowedHostPaths |
| psp-v2022-psp-host-namespace | שימוש במרחבי שמות של מארחים | hostPID, hostIPC |
| psp-v2022-psp-host-network-ports | שימוש ביציאות וברשתות של המארח | hostNetwork, hostPorts |
| psp-v2022-psp-privileged-container | הפעלה של קונטיינרים עם הרשאות | בעלת הרשאות |
| psp-v2022-psp-proc-mount | סוגי Proc Mount המותרים עבור הקונטיינר | allowedProcMountTypes |
| psp-v2022-psp-readonlyrootfilesystem | דרישה לשימוש במערכת קבצים בסיסית לקריאה בלבד | readOnlyRootFilesystem |
| psp-v2022-psp-seccomp | פרופיל ה-seccomp שבו נעשה שימוש בקונטיינרים | הערות |
| psp-v2022-psp-selinux-v2 | ההקשר של SELinux בקונטיינר | seLinux |
| psp-v2022-psp-pods-allowed-user-ranges | מזהי המשתמשים והקבוצות של המאגר | runAsUser, runAsGroup, supplementalGroups, fsGroup |
| psp-v2022-psp-volume-types | שימוש בסוגי נפח | כרכים |
לפני שמתחילים
- מתקינים ומאתחלים את Google Cloud CLI, שמספק את הפקודות
gcloudו-kubectlשמשמשות בהוראות האלה. אם אתם משתמשים ב-Cloud Shell, Google Cloud CLI מותקן מראש. - מתקינים את Policy Controller באשכול עם ספריית ברירת המחדל של תבניות אילוצים.
ביקורת של חבילת מדיניות בנושא מדיניות אבטחה של Pod
בעזרת Policy Controller אפשר לאכוף מדיניות באשכול Kubernetes. כדי לבדוק את עומסי העבודה ואת התאימות שלהם להמלצות של Google לגבי שיטות מומלצות שמפורטות בטבלה שלמעלה, אפשר לפרוס את האילוצים האלה במצב 'ביקורת' כדי לזהות הפרות, וחשוב מכך, כדי לתקן אותן לפני האכיפה באשכול Kubernetes.
אפשר להחיל את כללי המדיניות האלה עם spec.enforcementAction שמוגדר כ-dryrun באמצעות kubectl, kpt או סנכרון תצורות.
kubectl
(אופציונלי) מציגים בתצוגה מקדימה את האילוצים של המדיניות באמצעות kubectl:
kubectl kustomize https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/psp-v2022
מחילים את אילוצי המדיניות באמצעות kubectl:
kubectl apply -k https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/psp-v2022
הפלט שיתקבל:
k8spspallowprivilegeescalationcontainer.constraints.gatekeeper.sh/psp-v2022-psp-allow-privilege-escalation created k8spspallowedusers.constraints.gatekeeper.sh/psp-v2022-psp-pods-allowed-user-ranges created k8spspapparmor.constraints.gatekeeper.sh/psp-v2022-psp-apparmor created k8spspcapabilities.constraints.gatekeeper.sh/psp-v2022-psp-capabilities created k8spspfsgroup.constraints.gatekeeper.sh/psp-v2022-psp-fsgroup created k8spspflexvolumes.constraints.gatekeeper.sh/psp-v2022-psp-flexvolume-drivers created k8spspforbiddensysctls.constraints.gatekeeper.sh/psp-v2022-psp-forbidden-sysctls created k8spsphostfilesystem.constraints.gatekeeper.sh/psp-v2022-psp-host-filesystem created k8spsphostnamespace.constraints.gatekeeper.sh/psp-v2022-psp-host-namespace created k8spsphostnetworkingports.constraints.gatekeeper.sh/psp-v2022-psp-host-network-ports created k8spspprivilegedcontainer.constraints.gatekeeper.sh/psp-v2022-psp-privileged-container created k8spspprocmount.constraints.gatekeeper.sh/psp-v2022-psp-proc-mount created k8spspreadonlyrootfilesystem.constraints.gatekeeper.sh/psp-v2022-psp-readonlyrootfilesystem created k8spspselinuxv2.constraints.gatekeeper.sh/psp-v2022-psp-selinux-v2 created k8spspseccomp.constraints.gatekeeper.sh/psp-v2022-psp-seccomp created k8spspvolumetypes.constraints.gatekeeper.sh/psp-v2022-psp-volume-types created
מוודאים שאילוצי המדיניות הותקנו ובודקים אם יש הפרות באשכול:
kubectl get -k https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/psp-v2022
הפלט אמור להיראות כך:
NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspallowprivilegeescalationcontainer.constraints.gatekeeper.sh/psp-v2022-psp-allow-privilege-escalation dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspallowedusers.constraints.gatekeeper.sh/psp-v2022-psp-pods-allowed-user-ranges dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspapparmor.constraints.gatekeeper.sh/psp-v2022-psp-apparmor 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspcapabilities.constraints.gatekeeper.sh/psp-v2022-psp-capabilities dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspfsgroup.constraints.gatekeeper.sh/psp-v2022-psp-fsgroup 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspflexvolumes.constraints.gatekeeper.sh/psp-v2022-psp-flexvolume-drivers 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspforbiddensysctls.constraints.gatekeeper.sh/psp-v2022-psp-forbidden-sysctls 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spsphostfilesystem.constraints.gatekeeper.sh/psp-v2022-psp-host-filesystem 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spsphostnamespace.constraints.gatekeeper.sh/psp-v2022-psp-host-namespace dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spsphostnetworkingports.constraints.gatekeeper.sh/psp-v2022-psp-host-network-ports dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspprivilegedcontainer.constraints.gatekeeper.sh/psp-v2022-psp-privileged-container dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspprocmount.constraints.gatekeeper.sh/psp-v2022-psp-proc-mount 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspreadonlyrootfilesystem.constraints.gatekeeper.sh/psp-v2022-psp-readonlyrootfilesystem 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspselinuxv2.constraints.gatekeeper.sh/psp-v2022-psp-selinux-v2 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspseccomp.constraints.gatekeeper.sh/psp-v2022-psp-seccomp dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspvolumetypes.constraints.gatekeeper.sh/psp-v2022-psp-volume-types 0
(אופציונלי) משנים את שם השדה של ה-PSP
parametersבקובצי האילוצים לפי הצורך בסביבת האשכול. פרטים נוספים זמינים בקישור לשם השדה הספציפי של ספק שירותי התשלום בטבלה שלמעלה. לדוגמה, ב-psp-host-network-ports:parameters: hostNetwork: true min: 80 max: 9000
kpt
מתקינים ומגדירים את kpt. ההוראות האלה מתבססות על kpt כדי להתאים אישית ולפרוס משאבי Kubernetes.
מורידים את חבילת המדיניות של Pod Security Policy (PSP) v2022 מ-GitHub באמצעות kpt:
kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/psp-v2022
מריצים את הפונקציה
set-enforcement-actionkpt כדי להגדיר את פעולת האכיפה של המדיניות לערךdryrun:kpt fn eval psp-v2022 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 \ -- enforcementAction=dryrun
מאתחלים את ספריית העבודה באמצעות kpt, שיוצר משאב למעקב אחרי שינויים:
cd psp-v2022 kpt live init
(אופציונלי) משנים את שם השדה של ה-PSP
parametersבקובצי האילוצים לפי הצורך בסביבת האשכול. פרטים נוספים זמינים בקישור לשם השדה הספציפי של ספק שירותי התשלום בטבלה שלמעלה. לדוגמה, ב-psp-host-network-ports:parameters: hostNetwork: true min: 80 max: 9000
מחילים את אילוצי המדיניות באמצעות 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
מורידים את חבילת המדיניות של Pod Security Policy (PSP) v2022 מ-GitHub באמצעות kpt:
kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/psp-v2022 policies/psp-v2022
מריצים את הפונקציה
set-enforcement-actionkpt כדי להגדיר את פעולת האכיפה של המדיניות לערךdryrun:kpt fn eval policies/psp-v2022 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=dryrun
(אופציונלי) משנים את שם השדה של ה-PSP
parametersבקובצי האילוצים לפי הצורך בסביבת האשכול. פרטים נוספים זמינים בקישור לשם השדה הספציפי של ספק שירותי התשלום בטבלה שלמעלה. לדוגמה, ב-psp-host-network-ports:parameters: hostNetwork: true min: 80 max: 9000
(אופציונלי) מציגים בתצוגה מקדימה את אילוצי המדיניות שייווצרו:
kpt live init policies/psp-v2022 kpt live apply --dry-run policies/psp-v2022
הפלט שיתקבל:
Dry-run strategy: client inventory update started inventory update finished apply phase started k8spspallowprivilegeescalationcontainer.constraints.gatekeeper.sh/psp-v2022-psp-allow-privilege-escalation apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspallowedusers.constraints.gatekeeper.sh/psp-v2022-psp-pods-allowed-user-ranges apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspapparmor.constraints.gatekeeper.sh/psp-v2022-psp-apparmor apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspcapabilities.constraints.gatekeeper.sh/psp-v2022-psp-capabilities apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspfsgroup.constraints.gatekeeper.sh/psp-v2022-psp-fsgroup apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspflexvolumes.constraints.gatekeeper.sh/psp-v2022-psp-flexvolume-drivers apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspforbiddensysctls.constraints.gatekeeper.sh/psp-v2022-psp-forbidden-sysctls apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spsphostfilesystem.constraints.gatekeeper.sh/psp-v2022-psp-host-filesystem apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spsphostnamespace.constraints.gatekeeper.sh/psp-v2022-psp-host-namespace apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spsphostnetworkingports.constraints.gatekeeper.sh/psp-v2022-psp-host-network-ports apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspprivilegedcontainer.constraints.gatekeeper.sh/psp-v2022-psp-privileged-container apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspprocmount.constraints.gatekeeper.sh/psp-v2022-psp-proc-mount apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspreadonlyrootfilesystem.constraints.gatekeeper.sh/psp-v2022-psp-readonlyrootfilesystem apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspselinuxv2.constraints.gatekeeper.sh/psp-v2022-psp-selinux-v2 apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspseccomp.constraints.gatekeeper.sh/psp-v2022-psp-seccomp apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspvolumetypes.constraints.gatekeeper.sh/psp-v2022-psp-volume-types apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) apply phase finished inventory update started inventory update finished apply result: 16 attempted, 0 successful, 16 skipped, 0 failed
אם ספריית הסנכרון של סנכרון תצורות משתמשת ב-Kustomize, מוסיפים את
policies/psp-v2022ל-rootkustomization.yaml. אחרת, מסירים את הקובץpolicies/psp-v2022/kustomization.yaml:rm SYNC_ROOT_DIR/policies/psp-v2022/kustomization.yaml
דחיפת השינויים למאגר סנכרון תצורות:
git add SYNC_ROOT_DIR/policies/psp-v2022 git commit -m 'Adding Pod Security 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=psp-v2022 -o json | jq -cC '.items[]| [.metadata.name,.status.totalViolations]'
אם יש הפרות, אפשר לראות רשימה של הודעות ההפרה לכל אילוץ באמצעות הפקודה:
kubectl get constraint -l policycontroller.gke.io/bundleName=psp-v2022 -o json | jq -C '.items[]| select(.status.totalViolations>0)| [.metadata.name,.status.violations[]?]'
שינוי פעולת האכיפה של חבילת המדיניות של Pod Security Policy
אחרי שבודקים את הפרות המדיניות באשכול, אפשר לשנות את מצב האכיפה כך שבקרת הכניסה תפעל warn או אפילו deny תחסום החלה של משאב שלא עומד בדרישות על האשכול.
kubectl
משתמשים ב-kubectl כדי להגדיר את פעולת האכיפה של כללי המדיניות ל-
warn:kubectl get constraint -l policycontroller.gke.io/bundleName=psp-v2022 -o name | xargs -I {} kubectl patch {} --type='json' -p='[{"op":"replace","path":"/spec/enforcementAction","value":"warn"}]'מוודאים שפעולת האכיפה של הגבלות המדיניות עודכנה:
kubectl get constraint -l policycontroller.gke.io/bundleName=psp-v2022
kpt
מריצים את הפונקציה
set-enforcement-actionkpt כדי להגדיר את פעולת האכיפה של המדיניות לערך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-actionkpt כדי להגדיר את פעולת האכיפה של המדיניות לערךwarn:kpt fn eval policies/psp-v2022 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn
דחיפת השינויים למאגר סנכרון תצורות:
git add SYNC_ROOT_DIR/policies/psp-v2022 git commit -m 'Adding Pod Security Policy 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: [psp-v2022-psp-pods-allowed-user-ranges] Container wordpress is attempting to run without a required securityContext/fsGroup. Allowed fsGroup: {"ranges": [{"max": 200, "min": 100}], "rule": "MustRunAs"}
Warning: [psp-v2022-psp-pods-allowed-user-ranges] Container wordpress is attempting to run without a required securityContext/runAsGroup. Allowed runAsGroup: {"ranges": [{"max": 200, "min": 100}], "rule": "MustRunAs"}
Warning: [psp-v2022-psp-pods-allowed-user-ranges] Container wordpress is attempting to run without a required securityContext/runAsUser
Warning: [psp-v2022-psp-pods-allowed-user-ranges] Container wordpress is attempting to run without a required securityContext/supplementalGroups. Allowed supplementalGroups: {"ranges": [{"max": 200, "min": 100}], "rule": "MustRunAs"}
Warning: [psp-v2022-psp-allow-privilege-escalation] Privilege escalation container is not allowed: wordpress
Warning: [psp-v2022-psp-seccomp] Seccomp profile 'not configured' is not allowed for container 'wordpress'. Found at: no explicit profile found. Allowed profiles: {"RuntimeDefault", "docker/default", "runtime/default"}
Warning: [psp-v2022-psp-capabilities] container <wordpress> is not dropping all required capabilities. Container must drop all of ["must_drop"] or "ALL"
Warning: [psp-v2022-psp-readonlyrootfilesystem] only read-only root filesystem container is allowed: wordpress
pod/wp-non-compliant created
הסרת חבילת מדיניות של Pod Security Policy
במקרה הצורך, אפשר להסיר את חבילת המדיניות של Pod Security Policy מהאשכול.
kubectl
משתמשים ב-kubectl כדי להסיר את כללי המדיניות:
kubectl delete constraint -l policycontroller.gke.io/bundleName=psp-v2022
kpt
מסירים את כללי המדיניות:
kpt live destroy
סנכרון תצורות
מפעילים שמשתמשים ב-סנכרון תצורות כדי לפרוס מדיניות באשכולות שלהם יכולים להשתמש בהוראות הבאות:
דחיפת השינויים למאגר סנכרון תצורות:
git rm -r SYNC_ROOT_DIR/policies/psp-v2022 git commit -m 'Removing PSP policies' git push
בודקים את הסטטוס:
nomos status
האשכול אמור להציג סטטוס של
SYNCEDעם המשאבים שהוסרו.