Cloud Service Mesh dengan contoh: Otorisasi

Dalam tutorial ini, Anda akan mempelajari apa itu otorisasi, dan cara mengaktifkannya dengan Cloud Service Mesh di aplikasi contoh untuk mempelajari cara mengaktifkan kebijakan otorisasi ke microservice Anda. Anda akan membuat AuthorizationPolicy untuk DENY akses ke microservice, lalu membuat AuthorizationPolicy untuk ALLOW akses tertentu ke microservice.

Apa yang dimaksud dengan otorisasi?

Autentikasi memverifikasi identitas -- apakah layanan ini sesuai dengan yang diklaim? Otorisasi memverifikasi izin - apakah layanan ini diizinkan untuk melakukannya? Identitas adalah hal mendasar dalam ide ini. Dengan Cloud Service Mesh, komunikasi workload-ke-workload di mesh Anda dapat dikontrol untuk meningkatkan keamanan dan akses.AuthorizationPolicies

Dalam arsitektur microservice, tempat panggilan dilakukan di seluruh batas jaringan, aturan firewall berbasis IP sering kali tidak memadai untuk mengamankan akses antar-beban kerja. Dengan Cloud Service Mesh, Anda dapat menetapkan aturan otorisasi untuk:

  • Mengontrol akses ke workload dalam mesh Anda, baik workload-ke-workload atau pengguna akhir-ke-workload
  • Tentukan kebijakan secara luas atau terperinci, bergantung pada kebutuhan Anda.

Untuk melihat penjelasan mendalam tentang cara mengonfigurasi kebijakan dan praktik terbaik, lihat Otorisasi dengan Cloud Service Mesh.

Men-deploy gateway masuk

  1. Tetapkan konteks saat ini untuk kubectl ke cluster:

    gcloud container clusters get-credentials CLUSTER_NAME  \
    --project=PROJECT_ID \
    --zone=CLUSTER_LOCATION 
    
  2. Buat namespace untuk gateway masuk Anda:

    kubectl create namespace asm-ingress
    
  3. Aktifkan namespace untuk injeksi. Langkah-langkahnya bergantung pada implementasi bidang kontrol Anda.

    Terkelola (TD)

    Terapkan label injeksi default ke namespace:

    kubectl label namespace asm-ingress \
        istio.io/rev- istio-injection=enabled --overwrite
    

    Dikelola (Istiod)

    Direkomendasikan: Jalankan perintah berikut untuk menerapkan label injeksi default ke namespace:

      kubectl label namespace asm-ingress \
          istio.io/rev- istio-injection=enabled --overwrite
    

    Jika Anda adalah pengguna lama dengan Managed Istiod control plane: Sebaiknya gunakan injeksi default, tetapi injeksi berbasis revisi didukung. Gunakan petunjuk berikut:

    1. Jalankan perintah berikut untuk menemukan saluran rilis yang tersedia:

      kubectl -n istio-system get controlplanerevision
      

      Outputnya mirip dengan hal berikut ini:

      NAME                AGE
      asm-managed-rapid   6d7h
      

      Dalam output, nilai di kolom NAME adalah label revisi yang sesuai dengan saluran rilis yang tersedia untuk versi Cloud Service Mesh.

    2. Terapkan label revisi ke namespace:

      kubectl label namespace asm-ingress \
          istio-injection- istio.io/rev=REVISION_LABEL --overwrite
      

    Dalam cluster

    Direkomendasikan: Jalankan perintah berikut untuk menerapkan label injeksi default ke namespace:

      kubectl label namespace asm-ingress \
          istio.io/rev- istio-injection=enabled --overwrite
    

    Sebaiknya gunakan penyisipan default, tetapi penyisipan berbasis revisi didukung: Gunakan petunjuk berikut:

    1. Gunakan perintah berikut untuk menemukan label revisi di istiod:

      kubectl get deploy -n istio-system -l app=istiod -o \
         jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'
      
    2. Terapkan label revisi ke namespace. Dalam perintah berikut, REVISION_LABEL adalah nilai label revisi istiod yang Anda catat di langkah sebelumnya.

      kubectl label namespace asm-ingress \
          istio-injection- istio.io/rev=REVISION_LABEL --overwrite
      
  4. Deploy gateway contoh di repo anthos-service-mesh-samples:

    kubectl apply -n asm-ingress \
    -f docs/shared/asm-ingress-gateway
    

    Output yang diharapkan:

    serviceaccount/asm-ingressgateway configured
    service/asm-ingressgateway configured
    deployment.apps/asm-ingressgateway configured
    gateway.networking.istio.io/asm-ingressgateway configured
    

Men-deploy contoh aplikasi Butik Online

  1. Jika belum, tetapkan konteks saat ini untuk kubectl ke cluster:

    gcloud container clusters get-credentials CLUSTER_NAME  \
    --project=PROJECT_ID \
    --zone=CLUSTER_LOCATION 
    
  2. Buat namespace untuk aplikasi contoh:

    kubectl create namespace onlineboutique
    
  3. Beri label pada namespace onlineboutique untuk otomatis memasukkan proxy Envoy. Ikuti langkah-langkah untuk mengaktifkan injeksi sidecar otomatis.

  4. Deploy aplikasi contoh, VirtualService untuk frontend, dan akun layanan untuk workload. Untuk tutorial ini, Anda akan men-deploy Online Boutique, aplikasi demo microservice.

    kubectl apply \
    -n onlineboutique \
    -f docs/shared/online-boutique/virtual-service.yaml
    kubectl apply \
    -n onlineboutique \
    -f docs/shared/online-boutique/service-accounts
    

Melihat layanan Anda

  1. Lihat pod di namespace onlineboutique:

    kubectl get pods -n onlineboutique
    

    Output yang diharapkan:

    NAME                                     READY   STATUS    RESTARTS   AGE
    adservice-85598d856b-m84m6               2/2     Running   0          2m7s
    cartservice-c77f6b866-m67vd              2/2     Running   0          2m8s
    checkoutservice-654c47f4b6-hqtqr         2/2     Running   0          2m10s
    currencyservice-59bc889674-jhk8z         2/2     Running   0          2m8s
    emailservice-5b9fff7cb8-8nqwz            2/2     Running   0          2m10s
    frontend-77b88cc7cb-mr4rp                2/2     Running   0          2m9s
    loadgenerator-6958f5bc8b-55q7w           2/2     Running   0          2m8s
    paymentservice-68dd9755bb-2jmb7          2/2     Running   0          2m9s
    productcatalogservice-84f95c95ff-c5kl6   2/2     Running   0          114s
    recommendationservice-64dc9dfbc8-xfs2t   2/2     Running   0          2m9s
    redis-cart-5b569cd47-cc2qd               2/2     Running   0          2m7s
    shippingservice-5488d5b6cb-lfhtt         2/2     Running   0          2m7s
    

    Semua pod untuk aplikasi Anda harus aktif dan berjalan, dengan 2/2 di kolom READY. Hal ini menunjukkan bahwa proxy file bantuan Envoy telah berhasil disuntikkan ke pod. Jika 2/2 tidak muncul setelah beberapa menit, buka Panduan pemecahan masalah.

  2. Dapatkan IP eksternal, dan tetapkan ke variabel:

    kubectl get services -n asm-ingress
    export FRONTEND_IP=$(kubectl --namespace asm-ingress \
    get service --output jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}' \
    )
    

    Anda akan melihat output yang mirip dengan berikut ini:

    NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                                      AGE
    asm-ingressgateway   LoadBalancer   10.19.247.233   35.239.7.64   80:31380/TCP,443:31390/TCP,31400:31400/TCP   27m
    
    
  3. Buka alamat EXTERNAL-IP di browser web Anda. Anda akan melihat toko Online Boutique di browser Anda.

    frontend butik online

Otorisasi DenyAll untuk beban kerja

Bagian ini menambahkan AuthorizationPolicy untuk menolak semua traffic masuk ke layanan mata uang. AuthorizationPolicies bekerja dengan mengubah AuthorizationPolicies menjadi konfigurasi yang dapat dibaca Envoy, dan menerapkan konfigurasi ke proxy sidecar Anda. Hal ini memungkinkan proxy Envoy mengizinkan atau menolak permintaan masuk ke layanan.

  1. Terapkan AuthorizationPolicy ke currencyservice. Perhatikan kecocokan pada label currencyservice dalam file YAML.

    kubectl apply -f docs/authorization/currency-deny-all.yaml -n onlineboutique
    
    apiVersion: security.istio.io/v1beta1
    kind: AuthorizationPolicy
    metadata:
      name: currency-policy
    spec:
      selector:
        matchLabels:
          app: currencyservice
  2. Coba akses EXTERNAL-IP gateway Anda untuk melihat Butik Online di browser web. Anda akan melihat error otorisasi (500 Internal Service Error) dari currency service.

    authz rbac 500 error

Mengamati log proxy sidecar

Untuk melihat apa yang terjadi di proxy sidecar, Anda dapat meninjau log di pod.

  1. Dapatkan nama pod currencyservice Anda:

    CURRENCY_POD=$(kubectl get pod -n onlineboutique |grep currency|awk '{print $1}')
    
  2. Tetapkan proxy Envoy untuk mengizinkan log tingkat pelacakan. Secara default, panggilan otorisasi yang diblokir tidak dicatat:

    kubectl debug --image istio/base --target istio-proxy -it $CURRENCY_POD -n onlineboutique -- curl -X POST "http://localhost:15000/logging?level=trace"
    

    Output yang diharapkan: none {:.devsite-disable-click-to-copy} active loggers: admin: trace alternate_protocols_cache: trace ... tracing: trace upstream: trace udp: trace wasm: trace

  3. Gunakan curl untuk mengirim traffic ke EXTERNAL_IP Anda guna membuat log:

    for i in {0..10}; do
    curl -s -I $FRONTEND_IP ; done
    
  4. Melihat log terkait role-based access control (RBAC) di istio-proxy Anda:

    kubectl logs -n onlineboutique $CURRENCY_POD -c istio-proxy | grep -m5 rbac
    

    Output yang diharapkan:

    2022-07-08T14:19:20.442920Z     debug   envoy rbac      checking request: requestedServerName: outbound_.7000_._.currencyservice.onlineboutique.svc.cluster.local, sourceIP: 10.8.8.5:34080, directRemoteIP: 10.8.8.5:34080, remoteIP: 10.8.8.5:34080,localAddress: 10.8.0.6:7000, ssl: uriSanPeerCertificate: spiffe://christineskim-tf-asm.svc.id.goog/ns/onlineboutique/sa/default, dnsSanPeerCertificate: , subjectPeerCertificate: OU=istio_v1_cloud_workload,O=Google LLC,L=Mountain View,ST=California,C=US, headers: ':method', 'POST'
    2022-07-08T14:19:20.442944Z     debug   envoy rbac      enforced denied, matched policy none
    2022-07-08T14:19:20.442965Z     debug   envoy http      [C73987][S13078781800499437460] Sending local reply with details rbac_access_denied_matched_policy[none]
      ```
    

Anda akan melihat pesan enforced denied di log, yang menunjukkan bahwa currencyservice disetel untuk memblokir permintaan masuk.

Mengizinkan Akses Terbatas

Daripada kebijakan DENYALL, Anda dapat menetapkan akses agar diizinkan untuk workload tertentu. Hal ini akan relevan dalam arsitektur microservice di mana Anda ingin memastikan bahwa hanya layanan yang diberi otorisasi yang dapat berkomunikasi satu sama lain.

Di bagian ini, Anda akan mengaktifkan kemampuan layanan frontend dan checkout untuk berkomunikasi dengan layanan currency.

  1. Dalam file berikut, lihat bahwa source.principal(klien) tertentu diizinkan untuk mengakses currencyservice:
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: currency-policy
spec:
  selector:
    matchLabels:
      app: currencyservice
  rules:
  - from:
    - source:
        principals: ["cluster.local/ns/onlineboutique/sa/frontend"]
  - from:
    - source:
        principals: ["cluster.local/ns/onlineboutique/sa/checkoutservice"]
  1. Terapkan kebijakan:

    kubectl apply -f docs/authorization/currency-allow-frontend-checkout.yaml -n onlineboutique
    
  2. Buka EXTERNAL-IP di browser web Anda, dan sekarang Anda seharusnya dapat mengakses Online Boutique.