שימוש באילוצי מדיניות של PCI-DSS v3.2.1

‫Policy Controller כולל ספרייה של תבניות הגבלות שניתן להשתמש בהן עם חבילת PCI-DSS v3.2.1 כדי להעריך את התאימות של משאבי האשכול לכמה היבטים של תקן אבטחת הנתונים בתעשיית כרטיסי התשלום (PCI-DSS) v3.2.1.

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

מגבלות של חבילת המדיניות PCI-DSS v3.2.1

שם המגבלה תיאור המגבלה מזהה הבקרה פרופיל
pci-dss-v3.2.1-resources-have-required-labels היא מבטיחה את הדרישות לחומת אש בכך שהיא מחייבת שכל האפליקציות יכללו תווית ספציפית. 1.1.4 רגילה
pci-dss-v3.2.1-apps-must-have-certain-set-of-annotations הדרישה שכל האפליקציות יכללו הערה ספציפית מבטיחה שהדרישות בנוגע לבקרה על הרשת יעמדו. ‫1.1.5, 2.4 רגילה
pci-dss-v3.2.1-require-default-deny-network-policies הדרישה היא שלכל מרחב שמות שמוגדר באשכול תהיה מדיניות ברירת מחדל של דחיית תעבורת נתונים יוצאת NetworkPolicy. ‫1.2, ‏ 1.3, ‏ 2.2.2 מורחב
pci-dss-v3.2.1-block-all-ingress מגביל את היצירה של אובייקטים מסוג Ingress. ‫1.2, 1.3 מורחב
pci-dss-v3.2.1-require-valid-network-ranges מגביל טווחי CIDR שמותרים לשימוש עם תעבורת נתונים נכנסת (ingress) ותעבורת נתונים יוצאת (egress). ‫1.2, 1.3.2 מורחב
pci-dss-v3.2.1-require-namespace-network-policies הדרישה היא שלכל מרחב שמות שמוגדר באשכול תהיה מדיניות NetworkPolicy. 1.2 רגילה
pci-dss-v3.2.1-enforce-managed-by-configmanagement-label נדרשת תווית app.kubernetes.io/managed-by= תקינה במשאבי RoleBinding. ‫1.2.2, 8.1.2 רגילה
pci-dss-v3.2.1-block-creation-with-default-serviceaccount מגביל את יצירת המשאבים באמצעות חשבון שירות שמוגדר כברירת מחדל. ‫2.1 רגילה
pci-dss-v3.2.1-restrict-default-namespace הגבלת השימוש בתרמילים במרחב השמות שמוגדר כברירת מחדל. ‫2.1 רגילה
pci-dss-v3.2.1-asm-peer-authn-strict-mtls אי אפשר להשתמש באפשרות 'החלת כל אימותי העמיתים' כדי לשנות את ההגדרות של mTLS מחמיר. ‫4.1 רגילה
pci-dss-v3.2.1-require-av-daemonset נדרש daemonset של אנטי-וירוס. ‫5.1.1, ‏ 5.3 רגילה
pci-dss-v3.2.1-enforce-config-management אכיפה של הנוכחות וההפעלה של סנכרון תצורות. ‫5.3, ‏ 6.1, ‏ 6.4 רגילה
pci-dss-v3.2.1-enforce-cloudarmor-backendconfig אכיפת תצורת Cloud Armor במשאבי BackendConfig. ‫6.5, ‏ 6.6 רגילה
pci-dss-v3.2.1-restrict-rbac-subjects מגביל את השימוש בשמות בנושאי RBAC לערכים מותרים. ‫8.1, ‏ 8.1.5 מורחב
pci-dss-v3.2.1-block-secrets-of-type-basic-auth מגבילה את השימוש בסודות מסוג basic-auth. ‫8.1.5, ‏ 8.2.3, ‏ 8.5 רגילה
pci-dss-v3.2.1-nodes-have-consistent-time השימוש ב-COS כתמונת מערכת ההפעלה מבטיח שהשעה בצמתים תהיה עקבית ונכונה. ‫10.4.1, ‏ 10.4.3 רגילה

הגבלות על חבילות רגילות לעומת חבילות מורחבות

חבילת PCI-DSS v3.2.1 מיישמת קבוצה של דרישות מדיניות כדי להשיג היבטים מסוימים של אמצעי הבקרה של PCI-DSS v3.2.1. בנוסף לשינוי בעומס העבודה כדי להתאים לדרישות של חבילת Standard, יש גם קבוצה אופציונלית של אילוצים מורחבים שדורשים התאמה אישית לסביבה שלכם.

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

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

הגדרת 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: "apps"
            version: "v1"
            kind: "DaemonSet"
          - group: "networking.k8s.io"
            version: "v1"
            kind: "NetworkPolicy"
    
  2. החלת מניפסט policycontroller-config.yaml:

    kubectl apply -f policycontroller-config.yaml
    

הגדרת עומס העבודה של האשכול בהתאם לתקן PCI-DSS v3.2.1

חבילה רגילה

  1. כל האפליקציות (ReplicaSet,‏ Deployment,‏ StatefulSet ו-DaemonSet) חייבות לכלול pci-dss-firewall-audit label עם הסכימה של pci-dss-[0-9]{4}q[1-4].
  2. כל האפליקציות (ReplicaSet, ‏ Deployment, ‏ StatefulSet, ‏ DaemonSet) צריכות לכלול הערת network-controls/date עם הסכימה של YYYY-MM-DD.
  3. לכל namespace שמוגדר באשכול חייב להיות NetworkPolicy.
  4. השימוש ב-סנכרון תצורות עבור configmanagement.gke.io נדרש כברירת מחדל, אבל אפשר להתאים אישית את הערכים המותרים של app.kubernetes.io/managed-by באילוץ pci-dss-v3.2.1-enforce-managed-by-configmanagement-label.
  5. אי אפשר ליצור משאבים באמצעות חשבון השירות שמוגדר כברירת מחדל.
  6. אי אפשר להשתמש ב-namespace כברירת מחדל ל-pods.
  7. אם משתמשים ב-Cloud Service Mesh, ‏ PeerAuthentication ב-ASM חייב להשתמש ב-mTLS מחמיר spec.mtls.mode: STRICT.
  8. נדרש פתרון אנטי-וירוס. ברירת המחדל היא הנוכחות של daemonset בשם clamav ב-pci-dss-av namespace, אבל אפשר להתאים אישית את השם ואת מרחב השמות של daemonset בהגדרת האילוץ pci-dss-v3.2.1-require-av-daemonset.
  9. נדרשת נוכחות והפעלה של סנכרון תצורות.
  10. צריך להגדיר את כל BackendConfig ל-CloudArmor.
  11. אסור להשתמש בסודות מסוג basic-auth.
  12. כל הצמתים צריכים להשתמש ב-מערכת הפעלה שמותאמת לקונטיינרים של Google בתור קובץ האימג' שלהם כדי לשמור על עקביות בזמן.

חבילה מורחבת (אופציונלית, נדרשת התאמה אישית)

  1. לכל namespace שמוגדר באשכול יש דחייה NetworkPolicy כברירת מחדל לתעבורת נתונים יוצאת (egress), ואפשר לציין חריגים מותרים ב-pci-dss-v3.2.1-require-namespace-network-policies.
  2. אפשר ליצור רק אובייקטים מותרים של Ingress (סוגים Ingress, Gateway ו-Service של NodePort ו-LoadBalancer). אפשר לציין אותם ב-pci-dss-v3.2.1-block-all-ingress.
  3. אפשר להשתמש רק בטווחים מורשים של כתובות IP ל-Ingress ול-Express. אפשר לציין אותם ב-pci-dss-v3.2.1-require-valid-network-ranges.
  4. אפשר להשתמש רק בנושאים מורשים בכריכות RBAC, ואפשר לציין את שמות הדומיינים ב-pci-dss-v3.2.1-restrict-rbac-subjects.

ביקורת של חבילת המדיניות PCI-DSS v3.2.1

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

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

kubectl

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

    kubectl kustomize https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/pci-dss-v3.2.1
    
  2. מחילים את אילוצי המדיניות באמצעות kubectl:

    kubectl apply -k https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/pci-dss-v3.2.1
    

    הפלט שיתקבל:

    asmpeerauthnstrictmtls.constraints.gatekeeper.sh/pci-dss-v3.2.1-asm-peer-authn-strict-mtls created
    k8sblockcreationwithdefaultserviceaccount.constraints.gatekeeper.sh/pci-dss-v3.2.1-block-creation-with-default-serviceaccount created
    k8sblockobjectsoftype.constraints.gatekeeper.sh/pci-dss-v3.2.1-block-secrets-of-type-basic-auth created
    k8senforcecloudarmorbackendconfig.constraints.gatekeeper.sh/pci-dss-v3.2.1-enforce-cloudarmor-backendconfig created
    k8senforceconfigmanagement.constraints.gatekeeper.sh/pci-dss-v3.2.1-enforce-config-management created
    k8srequirecosnodeimage.constraints.gatekeeper.sh/pci-dss-v3.2.1-nodes-have-consistent-time created
    k8srequiredaemonsets.constraints.gatekeeper.sh/pci-dss-v3.2.1-require-av-daemonset created
    k8srequirenamespacenetworkpolicies.constraints.gatekeeper.sh/pci-dss-v3.2.1-require-namespace-network-policies created
    k8srequiredannotations.constraints.gatekeeper.sh/pci-dss-v3.2.1-apps-must-have-certain-set-of-annotations created
    k8srequiredlabels.constraints.gatekeeper.sh/pci-dss-v3.2.1-enforce-managed-by-configmanagement-label created
    k8srequiredlabels.constraints.gatekeeper.sh/pci-dss-v3.2.1-resources-have-required-labels created
    k8srestrictnamespaces.constraints.gatekeeper.sh/pci-dss-v3.2.1-restrict-default-namespace created
    
  3. מוודאים שאילוצי המדיניות הותקנו ובודקים אם יש הפרות באשכול:

    kubectl get -k https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/pci-dss-v3.2.1
    

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

    NAME                                                                                         ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmpeerauthnstrictmtls.constraints.gatekeeper.sh/pci-dss-v3.2.1-asm-peer-authn-strict-mtls   dryrun               0
    
    NAME                                                                                                                            ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8sblockcreationwithdefaultserviceaccount.constraints.gatekeeper.sh/pci-dss-v3.2.1-block-creation-with-default-serviceaccount   dryrun               0
    
    NAME                                                                                              ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8sblockobjectsoftype.constraints.gatekeeper.sh/pci-dss-v3.2.1-block-secrets-of-type-basic-auth   dryrun               0
    
    NAME                                                                                                          ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8senforcecloudarmorbackendconfig.constraints.gatekeeper.sh/pci-dss-v3.2.1-enforce-cloudarmor-backendconfig   dryrun               0
    
    NAME                                                                                            ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8senforceconfigmanagement.constraints.gatekeeper.sh/pci-dss-v3.2.1-enforce-config-management   dryrun               0
    
    NAME                                                                                         ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srequirecosnodeimage.constraints.gatekeeper.sh/pci-dss-v3.2.1-nodes-have-consistent-time   dryrun               0
    
    NAME                                                                                 ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srequiredaemonsets.constraints.gatekeeper.sh/pci-dss-v3.2.1-require-av-daemonset   dryrun               0
    
    NAME                                                                                                             ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srequirenamespacenetworkpolicies.constraints.gatekeeper.sh/pci-dss-v3.2.1-require-namespace-network-policies   dryrun               0
    
    NAME                                                                                                        ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srequiredannotations.constraints.gatekeeper.sh/pci-dss-v3.2.1-apps-must-have-certain-set-of-annotations   dryrun               0
    
    NAME                                                                                                   ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srequiredlabels.constraints.gatekeeper.sh/pci-dss-v3.2.1-enforce-managed-by-configmanagement-label   dryrun               0
    k8srequiredlabels.constraints.gatekeeper.sh/pci-dss-v3.2.1-resources-have-required-labels              dryrun               0
    
    NAME                                                                                        ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srestrictnamespaces.constraints.gatekeeper.sh/pci-dss-v3.2.1-restrict-default-namespace   dryrun               0
    

kpt

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

  2. מורידים את חבילת המדיניות PCI-DSS v3.2.1 מ-GitHub באמצעות kpt:

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

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

    cd pci-dss-v3.2.1
    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. מורידים את חבילת המדיניות PCI-DSS v3.2.1 מ-GitHub באמצעות kpt:

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

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

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

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

    git add SYNC_ROOT_DIR/policies/pci-dss-v3.2.1
    git commit -m 'Adding PCI-DSS v3.2.1 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=pci-dss-v3.2.1 -o json | jq -cC '.items[]| [.metadata.name,.status.totalViolations]'

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

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

שינוי פעולת האכיפה של חבילת המדיניות PCI-DSS v3.2.1

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

kubectl

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

    kubectl get constraint -l policycontroller.gke.io/bundleName=pci-dss-v3.2.1 -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=pci-dss-v3.2.1
    

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

    git add SYNC_ROOT_DIR/policies/pci-dss-v3.2.1
    git commit -m 'Adding PCI-DSS v3.2.1 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: [pci-dss-v3.2.1-restrict-default-namespace] <default> namespace is restricted
pod/wp-non-compliant created

הסרת חבילת מדיניות PCI-DSS v3.2.1

במקרה הצורך, אפשר להסיר את חבילת המדיניות PCI-DSS v3.2.1 מהאשכול.

kubectl

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

    kubectl delete constraint -l policycontroller.gke.io/bundleName=pci-dss-v3.2.1
    

kpt

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

    kpt live destroy
    

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

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

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

    git rm -r SYNC_ROOT_DIR/policies/pci-dss-v3.2.1
    git commit -m 'Removing PCI-DSS v3.2.1 policies'
    git push
    
  2. בודקים את הסטטוס:

    nomos status
    

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