Anthos Service Mesh melalui contoh: Otorisasi


Dalam tutorial ini, Anda akan mempelajari apa yang dimaksud dengan otorisasi, dan cara mengaktifkannya dengan Anthos 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 hingga ALLOW ke microservice.

Apa itu otorisasi?

Otentikasi memverifikasi identitas. Apakah layanan ini benar-benar pengguna yang dimaksud? Otorisasi memverifikasi izin - apakah layanan ini diizinkan untuk melakukannya? Identitas adalah landasan untuk ide ini. Dengan Anthos Service Mesh, AuthorizationPolicies memungkinkan komunikasi workload ke workload di mesh Anda dapat dikontrol untuk meningkatkan keamanan dan akses.

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

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

Biaya

Tutorial ini menggunakan komponen Google Cloud yang dapat ditagih berikut:

  • GKE
  • Anthos Service Mesh
  • Setelah menyelesaikan tutorial ini, Anda dapat menghindari biaya berkelanjutan dengan menghapus resource yang Anda buat. Untuk informasi selengkapnya, lihat Pembersihan.

    Sebelum memulai

    • Clone repo:

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

    Deploy gateway ingress:

    1. Setel 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 jenis Anthos Service Mesh Anda (baik terkelola atau 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 Anthos Service Mesh terkelola saat ini untuk versi Anthos 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 contoh gateway 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 aplikasi contoh Butik Online

    1. Jika belum, setel 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 beban kerja. Untuk tutorial ini, Anda akan men-deploy Online Boutique, yaitu 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 sudah aktif dan berjalan, dengan 2/2 di kolom READY. Hal ini menunjukkan bahwa pod memiliki proxy file bantuan Envoy yang berhasil dimasukkan. Jika tidak menampilkan 2/2 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 Butik Online di browser Anda.

      frontend butik online

    DenyAll Authorization untuk beban kerja

    Bagian ini menambahkan AuthorizationPolicy untuk menolak semua traffic masuk ke layanan mata uang. AuthorizationPolicies berfungsi dengan mengubah AuthorizationPolicies menjadi konfigurasi yang dapat dibaca Envoy, dan menerapkan konfigurasi tersebut 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 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.

      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. Setel proxy Envoy untuk mengizinkan log tingkat pelacakan. 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 untuk membuat log:

      for i in {0..10}; do
      curl -s -I $FRONTEND_IP ; done
      
    4. Lihat log terkait kontrol akses berbasis peran (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

    Anda dapat menetapkan akses ke beban kerja tertentu, bukan kebijakan DENYALL. Hal ini akan relevan dalam arsitektur microservice tempat Anda ingin memastikan bahwa hanya layanan yang diizinkan yang dapat berkomunikasi satu sama lain.

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

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

    Terapkan kebijakan:

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

    Mengamati layanan Anda di UI Keamanan Anthos Service Mesh

    1. Di konsol Google Cloud, buka halaman GKE Enterprise Security.

      Buka GKE Enterprise Security

    2. Halaman Keamanan adalah tempat Anda dapat menambahkan atau mengaktifkan fitur untuk membuat beban kerja aplikasi Anda aman. Untuk informasi selengkapnya, lihat Memantau keamanan mesh. Pilih tab Audit Kebijakan untuk melihat ringkasan workload Anda.

    3. Perhatikan bahwa di kolom Service access control, hanya currencyservice yang ditampilkan sebagai 'Enabled'. Klik Enabled untuk melihat detail AuthorizationPolicy.

      audit kebijakan keamanan

    Di sini Anda dapat melihat AuthorizationPolicy yang Anda terapkan. Hal ini berguna untuk memiliki visibilitas di seluruh aplikasi Anda, terutama jika ada banyak kebijakan yang diterapkan pada workload Anda. Menjelajahi UI. Anda dapat melihat layanan yang berinteraksi satu sama lain, dan hal ini berguna untuk memvisualisasikan perilaku keamanan. Ini hanyalah contoh sederhana dari manfaat yang dimiliki kebijakan saat mengamankan workload Anda.

    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 resource individual.

    Menghapus project

    Di Cloud Shell, hapus project:

    gcloud projects delete PROJECT_ID
    

    Menghapus resource

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

      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 Anda ingin mencegah biaya tambahan, hapus cluster:

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

    Langkah selanjutnya