אבטחת רשתות וכללי מדיניות הרשאה

בדף הזה מוסבר איך ליצור כללי מדיניות הרשאה ב-Ambient Networking.

דרישות מוקדמות

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

  • אשכול GKE פעיל עם רשתות סביבתיות של Cloud Service Mesh.
  • מרחב שמות שרשום ל-Ambient Networking (לדוגמה, ambient-test) עם עומסי עבודה לדוגמה של לקוח ושרת.
  • הפעלה של Mutual TLS (mTLS) בין עומסי העבודה של הלקוח והשרת באמצעות GCPServerTLSPolicy (עם mtlsMode: Strict) ו-GCPClientTLSPolicy. כדי לחלץ את זהות ה-SPIFFE של הלקוח, כללי GCPAuthzPolicy מבוססי-זהות שתואמים ל-CLIENT_CERT_URI_SAN דורשים mTLS פעיל.

במאמר הכנת Ambient Networking ב-GKE מוסבר איך להגדיר את הסביבה.

מדיניות דחייה כברירת מחדל

כברירת מחדל, ה-API של מדיניות ההרשאות של GKE Ambient מאפשר את כל התנועה, אלא אם היא מוגבלת על ידי המדיניות, בהתאם להתנהגות הרגילה של NetworkPolicy ב-Kubernetes.

הפעולה DENY_BY_DEFAULT מאפשרת לשנות את פעולת ברירת המחדל הזו. כשמחילים את המדיניות הזו על מרחב שמות, היא חוסמת את כל התנועה לעומסי העבודה במרחב השמות הזה, אלא אם היא מותרת במפורש על ידי מדיניות ALLOW.

בדף הזה מוסבר איך להגדיר את DENY_BY_DEFAULT ב-Cloud Service Mesh ולהשתמש בו כדי ליצור מצב אבטחה כברירת מחדל לעומסי העבודה.

מגבלות

לפני שמחילים מדיניות DENY_BY_DEFAULT, חשוב לשים לב למגבלות הבאות:

  • אפשר ליצור רק מדיניות DENY_BY_DEFAULT אחת לכל מרחב שמות.
  • במדיניות עם הפעולה DENY_BY_DEFAULT אי אפשר להגדיר כללים.
  • אפשר להשתמש בפעולה הזו כדי להגדיר את matchLabels: {} כבסיס לכל מרחב השמות, כדי לטרגט את כל ה-Pods. אי אפשר להשתמש ב-DENY_BY_DEFAULT להגבלות לכל Pod.

הגדרת מדיניות הרשאה שדוחה כברירת מחדל

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

  1. יוצרים GCPAuthzPolicy עם הפעולה DENY_BY_DEFAULT ומחילים אותו על מרחב השמות.

    cat <<EOF > deny-by-default-policy.yaml && kubectl apply -f deny-by-default-policy.yaml
    apiVersion: networking.gke.io/v1
    kind: GCPAuthzPolicy
    metadata:
      name: deny-by-default-authz
      namespace: ambient-test
    spec:
      action: DENY_BY_DEFAULT
      enforcementLevel: L4
      targetRefs:
      - group: ""
        kind: Pod
        selector:
          matchLabels: {}
    EOF
    

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

     gcpauthzpolicy.networking.gke.io/deny-by-default-authz created
    

    כברירת מחדל, המדיניות הזו חוסמת את כל תעבורת הנתונים הנכנסת (מזרח-מערב ו-ingress) לעומסי העבודה במרחב השמות ambient-test. היא לא מגבילה את תעבורת הנתונים היוצאת שמקורה בעומסי עבודה במרחב השמות.

  2. כדי לאפשר תנועה באופן סלקטיבי, יוצרים ומחילים מדיניות ALLOW:

    cat <<EOF > allow-policy.yaml && kubectl apply -f allow-policy.yaml
    apiVersion: networking.gke.io/v1
    kind: GCPAuthzPolicy
    metadata:
      name: allow-client-to-server
      namespace: ambient-test
    spec:
      action: ALLOW
      enforcementLevel: L4
      targetRefs:
      - group: ""
        kind: Pod
        selector:
          matchLabels:
            app: server
      rules:
      - from:
          sources:
          - principals:
            - principalSelector: CLIENT_CERT_URI_SAN
              principal:
                type: Exact
                value: spiffe://PROJECT_ID.s3ns.svc.id.goog/ns/ambient-test/sa/client
    EOF
    

    מחליפים את PROJECT_ID במזהה הפרויקט.

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

  3. בודקים את הקישוריות מהלקוח לשרת. היא אמורה להצליח כי היא תואמת למדיניות ALLOW.

    kubectl exec -it deploy/client -n ambient-test -- /bin/curl -fsLS server.ambient-test.svc.cluster.local
    
  4. בודקים את הקישוריות מהשרת לעצמו (או לכל עומס עבודה אחר בלי מדיניות הרשאה מפורשת). הפעולה אמורה להיכשל בגלל המדיניות DENY_BY_DEFAULT.

    kubectl exec -it deploy/server -n ambient-test -- /bin/curl -fsLS server.ambient-test.svc.cluster.local
    

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

    curl: (52) Empty reply from server.
    

רישום ביומן

כשבקשה נדחית על ידי מדיניות הרשאה, שרת ה-proxy של הצומת כותב רשומה ביומן הגישה ב-Cloud Logging, בשם היומן gke-ambient-node-proxy-accesslog. הרשומה מכילה את השדה הבא ב-payload של ה-JSON:

  • jsonPayload.error_details: - rbac_access_denied_matched_policy[none]

אתם יכולים להשתמש ב-Logs Explorer במסוף Cloud de Confiance כדי להציג את הרשומות ביומן הגישה של החיבורים שנדחו:

resource.type="k8s_container"
logName="projects/PROJECT_ID/logs/gke-ambient-node-proxy-accesslog"
jsonPayload.error_details=~"rbac_access_denied"

מידע נוסף זמין במאמר אימות שהתנועה מאומתת ומורשית.

כללי מדיניות אבטחה של תעבורת נתונים יוצאת (egress)

כדי לבדוק ולשלוט בתנועה יוצאת מעומסי עבודה של Ambient Networking לנקודות קצה חיצוניות או לאינטרנט, אתם יכולים לנתב את התנועה היוצאת דרך Secure Web Proxy‏ (SWP).

הוראות להגדרת המשאבים GCPBackend ו-GCPEgressPolicy מופיעות במאמר ניתוב תעבורת נתונים יוצאת (egress) בסביבה דרך Secure Web Proxy.