הגדרת אבטחת תעבורה

כדי לאבטח את תעבורת הנתונים בין שירותים ב-Cloud Service Mesh באמצעות ממשקי ה-API של Istio, אתם יכולים לאכוף Mutual TLS ‏ (mTLS) מחמיר. בעומסי עבודה של Kubernetes, ‏mTLS אוטומטי מופעל כברירת מחדל: שרתי proxy של קובצי עזר חיצוניים בצד הלקוח שולחים באופן אוטומטי תעבורת נתונים של mTLS לקובצי עזר חיצוניים, אבל שירותי היעד עדיין מקבלים גם טקסט פשוט וגם בקשות מוצפנות.

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

הפעלת Mutual TLS לכל מרחב שמות

כדי להפעיל mTLS לכל עומסי העבודה במרחב שמות מסוים, משתמשים במדיניות אימות ברמת מרחב השמות. מציינים את מרחב השמות שהיא חלה עליו בקטע metadata.

kubectl apply -f - <<EOF
apiVersion: "security.istio.io/v1beta1"
kind: "PeerAuthentication"
metadata:
  name: "AUTH_POLICY_NAME"
  namespace: "NAMESPACE"
spec:
  mtls:
    mode: STRICT
EOF

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

peerauthentication.security.istio.io/AUTH_POLICY_NAME created

הפעלת פרוטוקול TLS הדדי (mTLS) לכל עומס עבודה

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

  1. מחילים מדיניות אימות על עומס עבודה ספציפי במרחב השמות:

    cat <<EOF | kubectl apply -n NAMESPACE -f -
    apiVersion: "security.istio.io/v1beta1"
    kind: "PeerAuthentication"
    metadata:
      name: "AUTH_POLICY_NAME"
      namespace: "NAMESPACE"
    spec:
      selector:
        matchLabels:
          app: WORKLOAD
      mtls:
        mode: STRICT
    EOF
    

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

    peerauthentication.security.istio.io/AUTH_POLICY_NAME created
  2. מגדירים כלל תואם ליעד:

    cat <<EOF | kubectl apply -n NAMESPACE -f -
    apiVersion: "networking.istio.io/v1alpha3"
    kind: "DestinationRule"
    metadata:
      name: "DEST_RULE_NAME"
    spec:
      host: "WORKLOAD.NAMESPACE.svc.cluster.local"
      trafficPolicy:
        tls:
          mode: ISTIO_MUTUAL
    EOF
    

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

    destinationrule.networking.istio.io/WORKLOAD created

אכיפת mTLS בכל הרשת

כדי למנוע מכל השירותים ברשת לקבל תנועה בטקסט פשוט, מגדירים מדיניות PeerAuthentication ברמת הרשת, כשמצב mTLS מוגדר ל-STRICT (ברירת המחדל היא PERMISSIVE). למדיניות PeerAuthentication ברמת הרשת לא צריך להיות בורר, וצריך להחיל אותה במרחב השמות הבסיסי, istio-system. כשפורסים את המדיניות, מישור הבקרה מקצה באופן אוטומטי אישורי TLS כדי שעומסי העבודה יוכלו לאמת זה את זה.

כדי לאכוף mTLS בכל הרשת:

kubectl apply -f - <<EOF
apiVersion: "security.istio.io/v1beta1"
kind: "PeerAuthentication"
metadata:
  name: "AUTH_POLICY_NAME"
  namespace: "istio-system"
spec:
  mtls:
    mode: STRICT
EOF

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

peerauthentication.security.istio.io/AUTH_POLICY_NAME created

השבתת mTLS ל-CSM מנוהל

ב-Cloud Service Mesh אין תמיכה בערך mtls.mode: DISABLE במשאב PeerAuthentication.

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

סקירה כללית של המושגים

  1. בצד השרת: משתמשים במשאב PeerAuthentication כדי להגדיר את ערך ברירת המחדל של שרת ה-Proxy בצד השרת.
  2. גישה בצד הלקוח: משתמשים במשאב DestinationRule כדי להורות במפורש לשרתי ה-proxy בצד הלקוח להשתמש בטקסט פשוט בזמן התקשורת עם השרת הספציפי הזה.

דוגמאות

שלב 1: הגדרת PeerAuthentication

בדוגמה הזו נשתמש במדיניות ברירת המחדל PERMISSIVE, ולכן לא צריך להגדיר את המדיניות באופן מפורש.

שלב 2: הגדרת DestinationRule בצד הלקוח

ההגדרה הזו מורה ללקוחות להשתמש בטקסט פשוט כשהם קוראים ל-httpbin.

apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: "DEST_RULE_NAME"
  namespace: sample-namespace
spec:
  host: "WORKLOAD.NAMESPACE.svc.cluster.local"
  trafficPolicy:
    tls:
      mode: DISABLE

חיפוש ומחיקה של כללי מדיניות של PeerAuthentication

כדי להציג רשימה של כל כללי המדיניות של PeerAuthentication ב-Service mesh:

kubectl get peerauthentication --all-namespaces

אם יש מדיניות PeerAuthentication בתוקף, אפשר למחוק אותה באמצעות kubectl delete:

kubectl delete peerauthentication -n NAMESPACE AUTH_POLICY_NAME

המאמרים הבאים