שימוש באילוצים של מדיניות האבטחה ב-Cloud Service Mesh

‫Policy Controller כולל ספריית ברירת מחדל של תבניות הגבלות שאפשר להשתמש בהן עם חבילת האבטחה של Cloud Service Mesh כדי לבדוק את התאימות של נקודות החולשה באבטחת הרשת והשיטות המומלצות.

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

חבילת האילוצים הזו מתייחסת למדיניות בתחומים הבאים ואוכפת אותה:

  • אכיפת תעבורת mTLS ב-Cloud Service Mesh
  • שיטות מומלצות לשימוש ב-AuthorizationPolicy ב-Cloud Service Mesh
  • אכיפת אבטחת עומסי עבודה ב-Cloud Service Mesh

אילוצים של חבילת מדיניות ב-Cloud Service Mesh

שם המגבלה תיאור המגבלה מזהה הבקרה
asm-policy-v0.0.1-asm-ingressgateway-label אכיפת השימוש בתווית istio ingressgateway רק בפודים של ingressgateway 1.1.1
asm-policy-v0.0.1-asm-sidecar-injection לאכוף הזרקה של Istio Proxy Sidecar תמיד ל-pods של עומסי עבודה 1.1.2
asm-policy-v0.0.1-asm-authz-policy-mesh-default-deny אכיפה של דחייה כברירת מחדל ברמת הרשת באמצעות AuthorizationPolicy 1.2.1
asm-policy-v0.0.1-asm-authz-policy-normalization אכיפה של נורמליזציה של AuthorizationPolicy 1.2.2
asm-policy-v0.0.1-asm-authz-policy-safe-pattern אכיפה של תבניות בטוחות של AuthorizationPolicy 1.2.3
asm-policy-v0.0.1-asm-peer-authn-mesh-strict-mtls אכיפת strict mtls PeerAuthentication ברמת ה-mesh 1.3.1
asm-policy-v0.0.1-asm-peer-authn-strict-mtls אי אפשר להשתמש באפשרות Enforce all PeerAuthentications כדי לשנות את ההגדרה strict mtls 1.3.2
asm-policy-v0.0.1-asm-request-authn-prohibited-output-headers הגדרת האכיפה של jwtRules outputPayloadToHeader כך שלא יכיל כותרות ידועות של בקשות HTTP 1.4.1

פרופילים של חבילות

בחבילת מדיניות האבטחה של Cloud Service Mesh, אפשר להשתמש בשני פרופילים על סמך רמת ההקפדה. רמת ההקפדה הנמוכה כוללת פחות אילוצים, ולכן היא גמישה יותר. רמת קפדנות גבוהה כוללת יותר אילוצים, ולכן מספקת בקרה מאובטחת יותר על המדיניות.

רמת הקפדה נמוכה

פרופיל עם רמת חומרה נמוכה כולל את הגבלות המדיניות הבאות:

  • אפשר להשתמש בתווית istio:ingressgateway רק ב-Pods של שער הכניסה של Istio.

  • ב-AuthorizationPolicy, אפשר להשתמש בשדות hosts או notHosts רק אם בוחרים ב-Istio ingress gateway עם התווית istio:ingressgateway.

  • בשדה AuthorizationPolicy, כשמשתמשים בשדות methods או notMethods, הערכים חייבים להיות אותיות גדולות.

  • ב-AuthorizationPolicy, כשמשתמשים בשדה request.headers, הערכים לא יכולים להכיל רווחים.

  • ב-AuthorizationPolicy, כשמשתמשים בשדות paths או notPaths, הערכים צריכים להיות ערכים מנורמלים.

רמת קפדנות גבוהה

רמת ההקפדה הגבוהה כוללת את כל ההגבלות מרמת ההקפדה הנמוכה, וגם את ההגבלות הבאות:

  • אי אפשר להחיל את ההערה sidecar.istio.io/inject: false כדי לעקוף את הזרקת ה-proxy בכל הפודים של עומס העבודה.

  • רמת רשת AuthorizationPolicy שמגדירה כלל default deny נאכפת.

  • הערך של AuthorizationPolicy חייב להיות ALLOW-with-positive-matching או DENY-with-negative-match.

  • ב-AuthorizationPolicy, כשמשתמשים בשדות hosts או notHosts, הערכים צריכים להיות זוגות של <host-name> ו-<host-name>:*.

  • מופעלת רמת רשת PeerAuthentication שמגדירה mTLS מחמיר.

  • בכל PeerAuthentication ברשת, מצב ה-mTLS יכול להיות רק UNSET או STRICT, בהתאם לmTLS קפדני.

הגדרות החבילה

KPT setter תיאור
strictness-level פרופיל רמת ההקפדה של חבילת Cloud Service Mesh, האפשרויות הן Low או High (ברירת מחדל)

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

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

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

  1. שומרים את קובץ המניפסט הבא בפורמט YAML בשם policycontroller-config.yaml:

    apiVersion: config.gatekeeper.sh/v1alpha1
    kind: Config
    metadata:
      name: config
      namespace: "gatekeeper-system"
    spec:
      sync:
        syncOnly:
          - group: ""
            version: "v1"
            kind: "Namespace"
          - group: "security.istio.io"
            version: "v1beta1"
            kind: "AuthorizationPolicy"
          - group: "security.istio.io"
            version: "v1beta1"
            kind: "PeerAuthentication"
    

    קובץ המניפסט הזה מגדיר את Policy Controller כך שיעקוב אחרי סוגים ספציפיים של אובייקטים.

  2. החלת מניפסט policycontroller-config.yaml:

    kubectl apply -f policycontroller-config.yaml
    

ביקורת של חבילת מדיניות ב-Cloud Service Mesh

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

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

kubectl

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

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

    kubectl apply -k https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/asm-policy-v0.0.1
    

    הפלט שיתקבל:

    asmauthzpolicydefaultdeny.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-authz-policy-mesh-default-deny created
    asmauthzpolicynormalization.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-authz-policy-normalization created
    asmauthzpolicysafepattern.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-authz-policy-safe-pattern created
    asmingressgatewaylabel.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-ingressgateway-label created
    asmpeerauthnmeshstrictmtls.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-peer-authn-mesh-strict-mtls created
    asmpeerauthnstrictmtls.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-peer-authn-strict-mtls created
    asmrequestauthnprohibitedoutputheaders.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-request-authn-prohibited-output-headers created
    asmsidecarinjection.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-sidecar-injection created
    
  3. מוודאים שאילוצי המדיניות הותקנו ובודקים אם יש הפרות באשכול:

    kubectl get -k https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/asm-policy-v0.0.1
    

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

    NAME                                                                                                       ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmauthzpolicydefaultdeny.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-authz-policy-mesh-default-deny   dryrun               0
    
    NAME                                                                                                     ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmauthzpolicynormalization.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-authz-policy-normalization   dryrun               0
    
    NAME                                                                                                  ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmauthzpolicysafepattern.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-authz-policy-safe-pattern   dryrun               0
    
    NAME                                                                                          ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmingressgatewaylabel.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-ingressgateway-label   dryrun               0
    
    NAME                                                                                                     ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmpeerauthnmeshstrictmtls.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-peer-authn-mesh-strict-mtls   dryrun               0
    
    NAME                                                                                            ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmpeerauthnstrictmtls.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-peer-authn-strict-mtls   dryrun               0
    
    NAME                                                                                                                             ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmrequestauthnprohibitedoutputheaders.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-request-authn-prohibited-output-headers   dryrun               0
    
    NAME                                                                                    ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmsidecarinjection.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-sidecar-injection   dryrun               0
    

kpt

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

  2. מורידים את חבילת כללי מדיניות האבטחה של Cloud Service Mesh מ-GitHub באמצעות kpt:

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

    kpt fn eval asm-policy-v0.0.1 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 \
      -- enforcementAction=dryrun
    
  4. מריצים את פונקציית setter של kpt כדי להגדיר מדיניות אבטחה של Cloud Service Mesh בשדות ספציפיים:

    kpt fn eval asm-policy-v0.0.1 --image gcr.io/kpt-fn/apply-setters:v0.2.0 -- \
    strictness-level="Low"
    
  5. מאתחלים את ספריית העבודה באמצעות kpt, שיוצר משאב למעקב אחרי שינויים:

    cd asm-policy-v0.0.1
    kpt live init
    
  6. מחילים את אילוצי המדיניות באמצעות kpt:

    kpt live apply
    

    הפלט שיתקבל:

    asmauthzpolicydefaultdeny.constraints.gatekeeper.sh/asm-authz-policy-mesh-default-deny created
    asmauthzpolicynormalization.constraints.gatekeeper.sh/asm-authz-policy-normalization created
    asmauthzpolicysafepattern.constraints.gatekeeper.sh/asm-authz-policy-safe-pattern created
    asmingressgatewaylabel.constraints.gatekeeper.sh/asm-ingressgateway-label created
    asmpeerauthnmeshstrictmtls.constraints.gatekeeper.sh/asm-peer-authn-mesh-strict-mtls created
    asmpeerauthnstrictmtls.constraints.gatekeeper.sh/asm-peer-authn-strict-mtls created
    asmsidecarinjection.constraints.gatekeeper.sh/asm-sidecar-injection created
    7 resource(s) applied. 7 created, 0 unchanged, 0 configured, 0 failed
    
  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. מורידים את חבילת כללי מדיניות האבטחה של Cloud Service Mesh מ-GitHub באמצעות kpt:

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

    kpt fn eval policies/asm-policy-v0.0.1 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=dryrun
    
  5. מריצים את פונקציית setter של kpt כדי להגדיר מדיניות אבטחה של Cloud Service Mesh בשדות ספציפיים:

    kpt fn eval policies/asm-policy-v0.0.1 --image gcr.io/kpt-fn/apply-setters:v0.2.0 -- \
    strictness-level="Low"
    
  6. (אופציונלי) מציגים בתצוגה מקדימה את אילוצי המדיניות שייווצרו:

    kpt live init policies/asm-policy-v0.0.1
    kpt live apply --dry-run policies/asm-policy-v0.0.1
    

    הפלט שיתקבל:

    Dry-run strategy: client
    inventory update started
    inventory update finished
    apply phase started
    asmauthzpolicydefaultdeny.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-authz-policy-mesh-default-deny apply successful
    asmauthzpolicynormalization.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-authz-policy-normalization apply successful
    asmauthzpolicysafepattern.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-authz-policy-safe-pattern apply successful
    asmingressgatewaylabel.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-ingressgateway-label apply successful
    asmpeerauthnmeshstrictmtls.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-peer-authn-mesh-strict-mtls apply successful
    asmpeerauthnstrictmtls.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-peer-authn-strict-mtls apply successful
    asmrequestauthnprohibitedoutputheaders.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-request-authn-prohibited-output-headers apply successful
    asmsidecarinjection.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-sidecar-injection apply successful
    apply phase finished
    inventory update started
    inventory update finished
    apply result: 8 attempted, 8 successful, 0 skipped, 0 failed
    
  7. אם ספריית הסנכרון של סנכרון תצורות משתמשת ב-Kustomize, מוסיפים את policies/asm-policy-v0.0.1 ל-root kustomization.yaml. אחרת, מסירים את הקובץ policies/asm-policy-v0.0.1/kustomization.yaml:

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

    git add SYNC_ROOT_DIR/policies/asm-policy-v0.0.1
    git commit -m 'Adding ASM security policy 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=asm-policy-v0.0.1 -o json | jq -cC '.items[]| [.metadata.name,.status.totalViolations]'

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

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

שינוי פעולת האכיפה של חבילת כללי המדיניות של Cloud Service Mesh

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

kubectl

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

    kubectl get constraint -l policycontroller.gke.io/bundleName=asm-policy-v0.0.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=asm-policy-v0.0.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/asm-policy-v0.0.1 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn
    
  3. דחיפת השינויים למאגר סנכרון תצורות:

    git add SYNC_ROOT_DIR/policies/asm-policy-v0.0.1
    git commit -m 'Adding ASM security policy bundle warn enforcement'
    git push
    
  4. מאמתים את סטטוס ההתקנה:

    nomos status
    

    האשכול צריך להציג סטטוס של SYNCED עם המדיניות המותקנת.

בדיקת אכיפת המדיניות

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

cat <<EOF | kubectl apply -f -
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: non-compliant-authz-policy
spec:
  action: ALLOW
  rules:
  - to:
    - operation:
        methods: ["get"]
EOF

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

Warning: [asm-policy-v0.0.1-asm-authz-policy-normalization] in rules-to-operation, methods or notMethods must be uppercase
authorizationpolicy.security.istio.io/non-compliant-authz-policy created

הסרה של חבילת כללי מדיניות של Cloud Service Mesh

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

kubectl

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

    kubectl delete constraint -l policycontroller.gke.io/bundleName=asm-policy-v0.0.1
    

kpt

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

    kpt live destroy
    

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

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

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

    git rm -r SYNC_ROOT_DIR/policies/asm-policy-v0.0.1
    git commit -m 'Removing Cloud Service Mesh  policies'
    git push
    
  2. בודקים את הסטטוס:

    nomos status
    

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