Cloud Service Mesh dengan contoh: Otorisasi


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

Apa yang dimaksud dengan otorisasi?

Autentikasi memverifikasi identitas -- apakah layanan ini memang benar? Otorisasi memverifikasi izin - apakah layanan ini diizinkan untuk melakukan itu? Identitas adalah hal mendasar bagi ide ini. Dengan Cloud Service Mesh, AuthorizationPolicies memungkinkan komunikasi workload ke workload di mesh Anda untuk dikontrol untuk meningkatkan keamanan dan akses.

Dalam arsitektur microservice, dengan panggilan dilakukan melalui batas jaringan, aturan firewall berbasis IP tradisional sering kali tidak memadai untuk mengamankan akses antar-workload. Dengan Cloud Service Mesh, Anda dapat menetapkan aturan otorisasi ke:

  • Kontrol akses ke workload dalam mesh Anda, baik workload-ke-workload atau akhir-pengguna-ke-beban kerja
  • Tentukan kebijakan secara luas atau terperinci sesuai kebutuhan Anda. Untuk melihat penjelasan mendalam tentang mengonfigurasi kebijakan dan praktik terbaik, lihat Otorisasi dengan Cloud Service Mesh.

Biaya

Tutorial ini menggunakan komponen Google Cloud yang dapat ditagih berikut:

Setelah menyelesaikan tutorial ini, Anda dapat menghindari biaya berkelanjutan dengan menghapus resource yang dibuat. Untuk informasi selengkapnya, lihat Pembersihan.

Sebelum memulai

  • Meng-clone repo:

    git clone https://github.com/GoogleCloudPlatform/anthos-service-mesh-samples
    cd anthos-service-mesh-samples
    

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. Mengaktifkan namespace untuk injeksi. Langkah-langkahnya bergantung pada jenis Cloud Service Mesh Anda (baik yang terkelola maupun dalam cluster):

    Terkelola

    Terapkan label revisi asm-managed ke namespace:

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

    Label ini sesuai dengan saluran rilis Cloud Service Mesh yang dikelola saat ini untuk versi Cloud Service Mesh.

    Dalam cluster

    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 adalah nilai label revisi istiod yang Anda catat di langkah sebelumnya.

      kubectl label namespace asm-ingress \
        istio-injection- istio.io/rev=REVISION --overwrite
      
  4. Deploy gateway contoh di repositori 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 aplikasi contoh Online Boutique

  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 namespace onlineboutique untuk memasukkan proxy Envoy secara otomatis. Ikuti langkah-langkah untuk mengaktifkan injeksi file bantuan otomatis.

  4. Deploy aplikasi contoh, VirtualService untuk frontend, dan akun layanan untuk workload. Untuk tutorial ini, Anda akan men-deploy Online Boutique, sebuah 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
    

Lihat 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 dalam kolom READY. Hal ini menunjukkan bahwa pod memiliki proxy file bantuan Envoy yang berhasil dimasukkan. Jika 2/2 tidak muncul setelah beberapa menit, kunjungi Panduan pemecahan masalah.

  2. Dapatkan IP eksternal, lalu 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.

    antarmuka butik online

MenolakSemua Otorisasi 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 file bantuan Anda. Hal ini memungkinkan proxy Envoy untuk 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 Online Boutique di browser web. Anda akan melihat error otorisasi (500 Internal Service Error) dari currency service.

    error authz rbac 500

Mengamati log proxy file bantuan

Untuk melihat apa yang terjadi di proxy file bantuan, 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. Menyetel proxy Envoy agar mengizinkan log tingkat rekaman aktivitas. Secara default, panggilan otorisasi yang diblokir tidak dicatat:

    kubectl exec -it $CURRENCY_POD -n onlineboutique -c istio-proxy -- curl -X POST "http://localhost:15000/logging?level=trace"
    

    Output yang diharapkan: 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 untuk membuat log:

    for i in {0..10}; do
    curl -s -I $FRONTEND_IP ; done
    
  4. Lihat 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 ditetapkan untuk memblokir permintaan masuk.

Izinkan Akses Terbatas

Sebagai ganti kebijakan DENYALL, Anda dapat menetapkan akses ke izin yang diizinkan untuk workload tertentu. Hal ini akan relevan dalam arsitektur microservice tempat Anda ingin memastikan bahwa hanya layanan yang diotorisasi yang dapat berkomunikasi satu sama lain.

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

  1. Dalam file di bawah, pastikan 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"]

Terapkan kebijakan:

kubectl apply -f docs/authorization/currency-allow-frontend-checkout.yaml -n onlineboutique
  1. Kunjungi EXTERNAL-IP di browser web Anda, kini Anda dapat mengakses Butik Online.

Pembersihan

Agar tidak dikenakan biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource tersebut, atau simpan project dan hapus setiap resource-nya.

Agar tidak menimbulkan biaya berkelanjutan pada akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, Anda dapat menghapus project atau menghapus masing-masing resource.

Menghapus project

Di Cloud Shell, hapus project:

gcloud projects delete PROJECT_ID

Menghapus resource

  • Jika Anda ingin mempertahankan cluster dan menghapus contoh Online Boutique:

    1. Hapus namespace aplikasi:

      kubectl delete namespace onlineboutique
      

      Output yang diharapkan:

      namespace "onlineboutique" deleted
      
    2. Hapus namespace Gateway Ingress:

      kubectl delete namespace asm-ingress
      

      Output yang diharapkan:

      amespace "asm-ingress" deleted
      
  • Jika tidak ingin dikenai biaya tambahan, hapus cluster:

    gcloud container clusters delete  CLUSTER_NAME  \
    --project=PROJECT_ID \
    --zone=CLUSTER_LOCATION 
    

Langkah selanjutnya