אבטחת שירותי Kubernetes באמצעות Istio

המדריך הזה מיועד למשתמשים ולמנהלים של Kubernetes שרוצים להשתמש ב-Istio service mesh כדי לפרוס בצורה מאובטחת שירותי Kubernetes ולהפעיל תקשורת הדדית של TLS ‏ (mTLS).

‫Istio ו-Cloud Service Mesh

‫Istio הוא לא מוצר נתמך של Google. במקום זאת, מומלץ להריץ את Cloud Service Mesh המנוהל. מידע נוסף זמין במאמר הקצאת מישור בקרה מנוהל של Cloud Service Mesh ב-GKE.

היתרונות של Cloud Service Mesh:

  • אפשר להקצות Cloud Service Mesh מנוהל באמצעות Fleet API בלי כלים בצד הלקוח כמו istioctl.
  • ‫Cloud Service Mesh מחדיר אוטומטית פרוקסי מסוג sidecar לעומסי עבודה בלי להעניק הרשאות מורחבות לקונטיינרים.
  • אתם יכולים לראות לוחות בקרה מפורטים של הרשת והשירותים שלכם בלי לבצע הגדרות נוספות, ואז להשתמש במדדים האלה כדי להגדיר יעדים ברמת השירות (SLO) והתראות למעקב אחרי תקינות האפליקציות.
  • מישור הבקרה של Cloud Service Mesh המנוהל משודרג באופן אוטומטי כדי להבטיח שתקבלו את תיקוני האבטחה והתכונות העדכניים ביותר.
  • מישור הנתונים המנוהל של Cloud Service Mesh משדרג אוטומטית את ה-sidecar proxies בעומסי העבודה, כך שלא צריך להפעיל מחדש את השירותים כשזמינים שדרוגי proxy ותיקוני אבטחה.
  • ‫Cloud Service Mesh הוא מוצר נתמך שאפשר להגדיר אותו באמצעות ממשקי API סטנדרטיים של Istio בקוד פתוח. מידע נוסף זמין במאמר בנושא תכונות נתמכות.

מטרות

המדריך הזה כולל את השלבים הבאים:

  • יוצרים אשכול GKE Autopilot.
  • מתקינים את Istio באמצעות כלי שורת הפקודה istioctl.
  • פורסים אפליקציה לדוגמה כדי לבדוק אימות TLS בו-זמני (mTLS).
  • מגדירים את Istio כך שישתמש באימות mTLS לתקשורת בין שירותים באמצעות PeerAuthentication משאב בהתאמה אישית.
  • מאמתים את אימות mTLS באמצעות לוח הבקרה של Kiali.

עלויות

במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:

כדי להעריך את ההוצאות בהתאם לתחזית השימוש שלכם, אתם יכולים להיעזר במחשבון העלויות.

משתמשים חדשים של Google Cloud ? יכול להיות שאתם זכאים לתקופת ניסיון בחינם.

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

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

ב-Cloud Shell מותקן מראש התוכנה שדרושה למדריך הזה, כולל kubectl,‏ ה-CLI של gcloud ו-Terraform. אם אתם לא משתמשים ב-Cloud Shell, אתם צריכים להתקין את gcloud CLI.

  1. נכנסים לחשבון Google Cloud . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
  2. התקינו את ה-CLI של Google Cloud.

  3. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  4. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

    gcloud init
  5. יוצרים או בוחרים Google Cloud פרויקט.

    תפקידים שנדרשים כדי לבחור או ליצור פרויקט

    • Select a project: כדי לבחור פרויקט לא צריך תפקיד IAM ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
    • יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד Project Creator (יצירת פרויקטים) (roles/resourcemanager.projectCreator), שכולל את ההרשאה resourcemanager.projects.create. איך מקצים תפקידים
    • יוצרים Google Cloud פרויקט:

      gcloud projects create PROJECT_ID

      מחליפים את PROJECT_ID בשם של פרויקט Google Cloud שיוצרים.

    • בוחרים את הפרויקט שיצרתם: Google Cloud

      gcloud config set project PROJECT_ID

      מחליפים את PROJECT_ID בשם הפרויקט ב- Google Cloud .

  6. מוודאים שהחיוב מופעל בפרויקט Google Cloud .

  7. מפעילים את GKE API:

    תפקידים שנדרשים להפעלת ממשקי API

    כדי להפעיל ממשקי API, צריך את תפקיד ה-IAM 'אדמין של Service Usage' (roles/serviceusage.serviceUsageAdmin), שכולל את ההרשאה serviceusage.services.enable. איך מקצים תפקידים

    gcloud services enable container.googleapis.com
  8. התקינו את ה-CLI של Google Cloud.

  9. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  10. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

    gcloud init
  11. יוצרים או בוחרים Google Cloud פרויקט.

    תפקידים שנדרשים כדי לבחור או ליצור פרויקט

    • Select a project: כדי לבחור פרויקט לא צריך תפקיד IAM ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
    • יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד Project Creator (יצירת פרויקטים) (roles/resourcemanager.projectCreator), שכולל את ההרשאה resourcemanager.projects.create. איך מקצים תפקידים
    • יוצרים Google Cloud פרויקט:

      gcloud projects create PROJECT_ID

      מחליפים את PROJECT_ID בשם של פרויקט Google Cloud שיוצרים.

    • בוחרים את הפרויקט שיצרתם: Google Cloud

      gcloud config set project PROJECT_ID

      מחליפים את PROJECT_ID בשם הפרויקט ב- Google Cloud .

  12. מוודאים שהחיוב מופעל בפרויקט Google Cloud .

  13. מפעילים את GKE API:

    תפקידים שנדרשים להפעלת ממשקי API

    כדי להפעיל ממשקי API, צריך את תפקיד ה-IAM 'אדמין של Service Usage' (roles/serviceusage.serviceUsageAdmin), שכולל את ההרשאה serviceusage.services.enable. איך מקצים תפקידים

    gcloud services enable container.googleapis.com
  14. מעניקים תפקידים לחשבון המשתמש. מריצים את הפקודה הבאה לכל אחד מהתפקידים הבאים ב-IAM: roles/container.clusterAdmin

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE

    מחליפים את מה שכתוב בשדות הבאים:

    • PROJECT_ID: מזהה הפרויקט.
    • USER_IDENTIFIER: המזהה של חשבון המשתמש . לדוגמה, myemail@example.com.
    • ROLE: תפקיד ה-IAM שאתם מקצים לחשבון המשתמש.

הכנת הסביבה

כדי להגדיר את הסביבה, מבצעים את השלבים הבאים:

  1. הגדרת משתני סביבה:

    export PROJECT_ID=PROJECT_ID
    gcloud config set project $PROJECT_ID
    gcloud config set compute/region us-central1
    

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

  2. משכפלים את המאגר ב-GitHub:

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git
    
  3. עוברים לספריית העבודה:

    cd kubernetes-engine-samples/service-mesh/istio-tutorial
    

יצירת אשכול GKE

מפעילים את היכולות של Linux שנדרשות ל-Istio: ‏ NET_RAW ו-NET_ADMIN. ב-GKE Autopilot,‏ NET_ADMIN לא מופעל כברירת מחדל, אבל אפשר להפעיל את NET_ADMIN באמצעות הפקודה --workload-policies=allow-net-admin בגרסאות GKE 1.27 ואילך:

gcloud container clusters create-auto istio-cluster \
    --location="us-central1" \
    --workload-policies="allow-net-admin"

מידע נוסף על אבטחה ב-GKE Autopilot זמין במאמר תצורות אבטחה מובנות.

התקנת Istio

אפשר להתקין את Istio באשכול GKE באמצעות Istioctl.

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

  1. מתקינים את Istio:

    • כדי להתקין את הגרסה העדכנית של Istio:

      curl -L https://istio.io/downloadIstio | sh -
      
    • כדי להתקין גרסה ספציפית של Istio:

      export ISTIO_VERSION=VERSION_NUMBER
      curl -L https://istio.io/downloadIstio | TARGET_ARCH=$(uname -m) sh -
      

      מחליפים את VERSION_NUMBER בגרסה של Istio שרוצים להתקין. מידע על גרסאות של Istio זמין בהודעות על גרסאות.

  2. מוסיפים את כלי שורת הפקודה istioctl לנתיב:

    cd istio-*
    export PATH=$PWD/bin:$PATH
    
  3. מתקינים את Istio באשכול:

    istioctl install --set profile="default" -y
    

    השלב הזה עשוי להימשך כמה דקות.

  4. מחכים שה-Pods של Istio יהיו מוכנים:

    watch kubectl get pods -n istio-system
    

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

    NAME                                    READY   STATUS        RESTARTS   AGE
    istio-ingressgateway-5c47bff876-wjm96   1/1     Running       0          2m54s
    istiod-5fc7cb65cd-k8cp4                 1/1     Running       0          2m57s
    

    כשה-Pods של Istio הם Running, חוזרים לשורת הפקודה על ידי לחיצה על Ctrl+C.

פריסת האפליקציה לדוגמה

בקטע הזה משתמשים באפליקציית הדוגמה Bank of Anthos כדי ליצור Service mesh עם אימות mTLS.

  1. מוסיפים תווית של מרחב שמות שמורה ל-Istio להפעיל הזרקה אוטומטית של פרוקסי Envoy מסוג sidecar:

    kubectl label namespace default istio-injection=enabled
    
  2. פורסים את האפליקציה לדוגמה:

    cd ..
    git clone https://github.com/GoogleCloudPlatform/bank-of-anthos.git
    kubectl apply -f bank-of-anthos/extras/jwt/jwt-secret.yaml
    kubectl apply -f bank-of-anthos/kubernetes-manifests/
    
  3. ממתינים עד שהאפליקציה תהיה מוכנה:

    watch kubectl get pods
    

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

    NAME                                 READY   STATUS    RESTARTS   AGE
    accounts-db-0                        2/2     Running   0          2m16s
    balancereader-5c695f78f5-x4wlz       2/2     Running   0          3m8s
    contacts-557fc79c5-5d7fg             2/2     Running   0          3m7s
    frontend-7dd589c5d7-b4cgq            2/2     Running   0          3m7s
    ledger-db-0                          2/2     Running   0          3m6s
    ledgerwriter-6497f5cf9b-25c6x        2/2     Running   0          3m5s
    loadgenerator-57f6896fd6-lx5df       2/2     Running   0          3m5s
    transactionhistory-6c498965f-tl2sk   2/2     Running   0          3m4s
    userservice-95f44b65b-mlk2p          2/2     Running   0          3m4s
    

    כשה-Pods הם Running, חוזרים לשורת הפקודה על ידי לחיצה על Ctrl+C.

  4. בודקים את קובץ המניפסט הבא:

    # Copyright 2020 Google LLC
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #      http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      name: frontend-gateway
    spec:
      selector:
        istio: ingressgateway # use Istio default gateway implementation
      servers:
      - port:
          number: 80
          name: http
          protocol: HTTP
        hosts:
        - "*"
    ---
    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: frontend-ingress
    spec:
      hosts:
      - "*"
      gateways:
      - frontend-gateway
      http:
      - route:
        - destination:
            host: frontend
            port:
              number: 80

    במניפסט הזה מתוארים משאבי Gateway ו-VirtualService של Istio שחושפים את האפליקציה ומשתמשים ב-Istio כבקר Ingress.

  5. מחילים את המניפסט על האשכול:

    kubectl apply -f bank-of-anthos/extras/istio/frontend-ingress.yaml
    

הגדרת mTLS

אימות TLS בו-זמני (mTLS) מופעל כברירת מחדל ב-Istio. כלומר, Istio עוקב אחרי עומסי עבודה בשרת שהועברו לשרתי proxy של Istio, ומגדיר אוטומטית שרתי proxy של לקוחות כדי ליצור חיבורי mTLS עם עומסי העבודה האלה. ‫Istio גם מגדיר ששרתי proxy של לקוחות לא ישתמשו ב-mTLS כשהם מתחברים לעומסי עבודה ללא שרתי proxy מסוג sidecar.

‫Istio יכול להגדיר mTLS כך שיפעל בשלושה מצבים:

  • PERMISSIVE: עומסי העבודה מקבלים תנועה גם ב-mTLS וגם בטקסט רגיל.
  • STRICT: עומסי העבודה מקבלים רק תנועה ב-mTLS.
  • DISABLE: mTLS מושבת. כדאי להשתמש במצב הזה אם רוצים להשתמש בפתרון אבטחה משלכם.

אפשר להחיל את הגדרת ה-mTLS באופן גלובלי, לכל מרחב שמות או לכל עומס עבודה. במדריך הזה, אתם מחילים הגדרה לכל מרחב שמות באמצעות מצב STRICT mTLS.

  1. בודקים את קובץ המניפסט הבא:

    apiVersion: security.istio.io/v1beta1
    kind: PeerAuthentication
    metadata:
      name: default
    spec:
      mtls:
          mode: STRICT

    במניפסט הזה מתואר משאב מותאם אישית של אימות עמיתים ב-Istio.

  2. מחילים את המניפסט על האשכול:

    kubectl apply -f peer-authentication.yaml
    

מידע נוסף על mTLS ב-Istio זמין במאמר בנושא אימות TLS בו-זמני (mTLS).

איך מוודאים ש-mTLS מופעל

Kiali הוא לוח בקרה מבוסס-אינטרנט למעקב אחרי נתונים ב-Istio service mesh. הוא מספק תצוגה גרפית של סביבת המיקרו-שירותים, ומאפשר לכם לעקוב אחרי האפליקציות ולפתור בעיות בהן. אתם יכולים להשתמש ב-Kiali כדי לוודא שאימות mTLS מופעל ופועל בצורה תקינה ב-Service mesh של Istio. כדי להשתמש ב-Kiali, צריך להגדיר את Prometheus כמקור נתוני טלמטריה. במדריך הזה נעשה שימוש בשירות המנוהל של Google Cloud ל-Prometheus.

התקנת ממשק שאילתות

  1. יוצרים חשבון שירות ב-IAM עם ההרשאה roles/monitoring.viewer כדי לאפשר לממשק השאילתות לגשת למדדים:

    gcloud iam service-accounts create monitoring \
        --display-name="Service account for query interface"
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member "serviceAccount:monitoring@PROJECT_ID.iam.gserviceaccount.com" \
        --role roles/monitoring.viewer
    gcloud iam service-accounts add-iam-policy-binding \
      monitoring@PROJECT_ID.iam.gserviceaccount.com \
        --role roles/iam.workloadIdentityUser \
        --member "serviceAccount:PROJECT_ID.svc.id.goog[monitoring/default]"
    
  2. יוצרים מרחב שמות של Kubernetes:

    kubectl create namespace monitoring
    
  3. מוסיפים הערה לחשבון השירות של Kubernetes שמוגדר כברירת מחדל במרחב השמות כדי להגדיר איחוד זהויות של עומסי עבודה ל-GKE:

    kubectl annotate serviceaccount -n monitoring default \
        iam.gke.io/gcp-service-account=monitoring@PROJECT_ID.iam.gserviceaccount.com --overwrite
    
  4. פורסים את עומס העבודה של ממשק השאילתות:

    kubectl -n monitoring apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/prometheus-engine/v0.7.1/examples/frontend.yaml
    
  5. בודקים את קובץ המניפסט הבא:

    apiVersion: monitoring.googleapis.com/v1
    kind: PodMonitoring
    metadata:
      name: istiod
      namespace: istio-system
    spec:
      selector:
        matchLabels:
          app: istiod
      endpoints:
      - port: 15014
        path: /metrics
        timeout: 30s
        interval: 60s

    קובץ המניפסט הזה מתאר משאב PodMonitoring שאוסף מדדים של Istio ושל Envoy Proxy.

  6. מחילים את המניפסט על האשכול:

    kubectl apply -f pod-monitorings.yaml
    
  7. קבלת קישור לאפליקציה לדוגמה:

    INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
    echo "http://$INGRESS_HOST"
    
  8. פותחים את הקישור כדי לראות את האפליקציה לדוגמה. נכנסים באמצעות שם המשתמש והסיסמה שמוגדרים כברירת מחדל כדי ליצור תנועה בין המיקרו-שירותים.

התקנת Kiali

מומלץ להתקין את Kiali באמצעות Kiali Operator.

  1. מתקינים את Kiali Operator:

    helm repo add kiali https://kiali.org/helm-charts
    helm repo update
    helm install \
        --namespace kiali-operator \
        --create-namespace \
        kiali-operator \
        kiali/kiali-operator
    
  2. בודקים את קובץ המניפסט הבא:

    apiVersion: kiali.io/v1alpha1
    kind: Kiali
    metadata:
      name: kiali
      namespace: istio-system
    spec:
      deployment:
        namespace: istio-system
      auth:
        strategy: anonymous
      external_services:
        custom_dashboards:
          prometheus:
            url: "http://frontend.monitoring:9090/"
            auth:
              type: none
        prometheus:
          url: "http://frontend.monitoring:9090/"
          auth:
            type: none
        tracing:
          enabled: false
        grafana:
          enabled: false

    המניפסט הזה מתאר משאב מותאם אישית של Operator שמגדיר את שרת Kiali.

  3. מחילים את המניפסט על האשכול:

    kubectl apply -f kiali.yaml
    
  4. ממתינים עד ששרת Kiali יהיה מוכן:

    watch kubectl get pods -n istio-system
    

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

    NAME                                    READY   STATUS    RESTARTS   AGE
    istio-ingressgateway-6845466857-92zp8   1/1     Running   0          9m11s
    istiod-6b47d84cf-4cqlt                  1/1     Running   0          12m
    kiali-5f6b7c8d9-abcde                   1/1     Running   0          1m
    

    כשה-Pods הם Running, חוזרים לשורת הפקודה על ידי לחיצה על Ctrl+C.

  5. מגדירים העברת יציאות בשירות של שרת Kiali כדי לגשת ללוח הבקרה:

    kubectl -n istio-system port-forward svc/kiali 8080:20001
    
  6. פותחים את התצוגה המקדימה באינטרנט. ב-Kiali, עוברים לקטע Graph (גרף) ובתפריט הנפתח Display (תצוגה) בוחרים באפשרות Security (אבטחה). בתצוגה הזו מוצג מצב האבטחה של כל צומת בתרשים. צמתים עם תג mTLS enabled מציינים ש-mTLS מופעל עבור השירות הזה, וצמתים ללא התג מציינים ש-mTLS לא מופעל.

הסרת המשאבים

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

מחיקת הפרויקט

    כדי למחוק Google Cloud פרויקט:

    gcloud projects delete PROJECT_ID

מחיקת המשאבים הבודדים

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

  1. מחיקת Kiali:

    kubectl -n istio-system delete kiali kiali
    helm uninstall --namespace kiali-operator kiali-operator
    
  2. מחיקת המשאבים למעקב:

    kubectl -n monitoring delete -f https://raw.githubusercontent.com/GoogleCloudPlatform/prometheus-engine/v0.7.1/examples/frontend.yaml
    
  3. מוחקים את האפליקציה לדוגמה:

    kubectl delete -f bank-of-anthos/extras/istio/frontend-ingress.yaml
    kubectl delete -f bank-of-anthos/kubernetes-manifests
    
  4. מסירים את Istio:

    istioctl uninstall --purge -y
    
  5. מחיקת אשכול GKE:

    gcloud container clusters delete --location us-central1 istio-cluster --quiet
    

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

  • כדאי להעמיק את הקריאה ולהכיר דוגמאות לארכיטקטורות, תרשימים ושיטות מומלצות בנושאי Google Cloud. כל אלה זמינים במרכז הארכיטקטורה של Cloud.