Anthos Service Mesh melalui contoh: mTLS


Di Anthos Service Mesh 1.5 dan yang lebih baru, TLS bersama otomatis (auto mTLS) diaktifkan secara default. Dengan mTLS otomatis, proxy file bantuan klien akan otomatis mendeteksi apakah server memiliki file bantuan. Sidecar klien mengirimkan mTLS ke beban kerja dengan file bantuan dan mengirim teks biasa ke beban kerja tanpa file bantuan. Namun, perlu diketahui bahwa layanan menerima traffic teks biasa dan mTLS. Saat memasukkan proxy file bantuan ke Pod, sebaiknya Anda juga mengonfigurasi layanan agar hanya menerima traffic mTLS.

Dengan Anthos Service Mesh, Anda dapat menerapkan mTLS di luar kode aplikasi, dengan menerapkan satu file YAML. Anthos Service Mesh memberi Anda fleksibilitas untuk menerapkan kebijakan autentikasi ke seluruh mesh layanan, ke namespace, atau ke setiap workload.

mTLS bersama

Biaya

Dalam dokumen ini, Anda menggunakan komponen Google Cloud yang dapat ditagih berikut:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga. Pengguna baru Google Cloud mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

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

Sebelum memulai

Akses Butik Online

  1. Tetapkan konteks saat ini untuk kubectl ke cluster tempat Anda men-deploy Online Boutique:

    gcloud container clusters get-credentials CLUSTER_NAME  \
        --project=PROJECT_ID \
        --zone=CLUSTER_LOCATION
    
  2. Cantumkan layanan di namespace frontend:

    kubectl get services -n frontend
    

    Perhatikan bahwa frontend-external adalah LoadBalancer, dan memiliki alamat IP eksternal. Aplikasi contoh menyertakan layanan yang merupakan load balancer, sehingga dapat di-deploy di GKE tanpa Anthos Service Mesh.

  3. Buka aplikasi di browser menggunakan alamat IP eksternal layanan frontend-external:

    http://FRONTEND_EXTERNAL_IP/
    
  4. Anthos Service Mesh memberi Anda kemampuan untuk men-deploy gateway masuk. Anda juga dapat mengakses Butik Online menggunakan alamat IP eksternal gateway masuk. Dapatkan IP eksternal gateway. Ganti placeholder dengan informasi berikut:

    • GATEWAY_SERVICE_NAME : Nama layanan gateway ingress. Jika Anda men-deploy gateway contoh tanpa modifikasi, atau jika Anda men-deploy gateway masuk default, namanya adalah istio-ingressgateway.
    • GATEWAY_NAMESPACE: Namespace tempat Anda men-deploy gateway masuk. Jika Anda men-deploy gateway masuk default, namespace adalah istio-system.
    kubectl get service GATEWAY_NAME -n GATEWAY_NAMESPACE
    
  5. Buka tab lain di browser Anda, lalu buka aplikasi menggunakan alamat IP eksternal gateway masuk:

    http://INGRESS_GATEWAY_EXTERNAL_IP/
    
  6. Jalankan perintah berikut untuk curl layanan frontend dengan HTTP biasa dari Pod lain. Karena layanan berada di namespace yang berbeda, Anda perlu melakukan curl DNS name layanan frontend.

    kubectl exec \
      $(kubectl get pod -l app=productcatalogservice -n product-catalog -o jsonpath={.items..metadata.name}) \
      -c istio-proxy -n product-catalog -- \
      curl http://frontend.frontend.svc.cluster.local:80/ -o /dev/null -s -w '%{http_code}\n'
    

    Permintaan Anda berhasil dengan status 200, karena secara default, traffic TLS dan teks biasa diterima.

Mengaktifkan TLS bersama per namespace

Anda memberlakukan mTLS dengan menerapkan kebijakan PeerAuthentication dengan kubectl.

  1. Simpan kebijakan autentikasi berikut sebagai mtls-namespace.yaml.

    cat <<EOF > mtls-namespace.yaml
    apiVersion: "security.istio.io/v1beta1"
    kind: "PeerAuthentication"
    metadata:
      name: "namespace-policy"
    spec:
      mtls:
        mode: STRICT
    EOF
    

    Baris mode: STRICT dalam YAML mengonfigurasi layanan agar hanya menerima mTLS. Secara default, mode adalah PERMISSIVE, yang mengonfigurasi layanan untuk menerima teks biasa dan mTLS.

  2. Terapkan kebijakan autentikasi untuk mengonfigurasi semua layanan Butik Online agar hanya menerima mTLS:

    for ns in ad cart checkout currency email frontend loadgenerator \
         payment product-catalog recommendation shipping; do
    kubectl apply -n $ns -f mtls-namespace.yaml
    done
    

    Output yang diharapkan:

    peerauthentication.security.istio.io/namespace-policy created
    peerauthentication.security.istio.io/namespace-policy created
    peerauthentication.security.istio.io/namespace-policy created
    peerauthentication.security.istio.io/namespace-policy created
    peerauthentication.security.istio.io/namespace-policy created
    peerauthentication.security.istio.io/namespace-policy created
    peerauthentication.security.istio.io/namespace-policy created
    peerauthentication.security.istio.io/namespace-policy created
    peerauthentication.security.istio.io/namespace-policy created
    peerauthentication.security.istio.io/namespace-policy created
    peerauthentication.security.istio.io/namespace-policy created

  3. Buka tab di browser Anda yang mengakses Butik Online menggunakan alamat IP eksternal layanan frontend-external:

    http://FRONTEND_EXTERNAL_IP/
    
  4. Muat ulang halaman. Browser menampilkan error berikut:

    situs tidak dapat dijangkau

    Memuat ulang halaman akan menyebabkan teks biasa dikirim ke layanan frontend. Karena kebijakan autentikasi STRICT, proxy file bantuan memblokir permintaan ke layanan.

  5. Buka tab di browser Anda yang mengakses Butik Online menggunakan alamat IP eksternal istio-ingressgateway, lalu muat ulang halaman, yang berhasil ditampilkan. Saat Anda mengakses Online Boutique menggunakan gateway masuk, permintaan tersebut mengambil jalur berikut:

    mTLS bersama

    Alur autentikasi mTLS:

    1. Browser mengirimkan permintaan HTTP teks biasa ke server.
    2. Container proxy gateway masuk mencegat permintaan.
    3. Proxy gateway masuk melakukan handshake TLS dengan proxy sisi server (layanan frontend dalam contoh ini). Handshake ini mencakup pertukaran sertifikat. Sertifikat ini sebelumnya dimuat ke dalam container proxy oleh Anthos Service Mesh.
    4. Proxy gateway masuk melakukan pemeriksaan penamaan yang aman pada sertifikat server, yang memverifikasi bahwa identitas yang sah sedang menjalankan server.
    5. Gateway masuk dan proxy server membuat koneksi TLS bersamaan, dan proxy server meneruskan permintaan ke penampung aplikasi server (layanan frontend).
  6. Jalankan perintah berikut untuk curl layanan frontend dengan HTTP biasa dari Pod lain.

    kubectl exec \
      $(kubectl get pod -l app=productcatalogservice -n product-catalog -o jsonpath={.items..metadata.name}) \
      -c istio-proxy -n product-catalog -- \
      curl http://frontend.frontend.svc.cluster.local:80/ -o /dev/null -s -w '%{http_code}\n'
    

    Permintaan Anda gagal karena semua layanan Online Boutique ditetapkan ke STRICT mTLS, dan proxy file bantuan memblokir permintaan ke layanan.

    Output yang diharapkan:

    000
    command terminated with exit code 56

Lihat status mTLS

Anda dapat melihat status fitur keamanan GKE Enterprise, termasuk kebijakan autentikasi, di Konsol Google Cloud.

  1. Di Konsol Google Cloud, buka halaman Overview GKE Enterprise.

    Buka Ringkasan

  2. Pilih project Google Cloud dari daftar project di panel menu.

  3. Dari kartu Status kebijakan, bergantung pada konfigurasi Anda, klik Lihat Kebijakan atau Aktifkan Kebijakan. Dasbor Pengontrol Kebijakan akan terbuka.

  4. Klik tab Pelanggaran.

  5. Di bagian Resource Kind, pilih kotak centang Pod. Ini menunjukkan daftar Pod yang melanggar kebijakan.

Menemukan dan menghapus kebijakan autentikasi

  1. Untuk melihat daftar semua kebijakan PeerAuthentication dalam mesh layanan:

    kubectl get peerauthentication --all-namespaces
    

    Outputnya mirip dengan hal berikut ini:

    NAMESPACE         NAME               MODE     AGE
    ad                namespace-policy   STRICT   17m
    cart              namespace-policy   STRICT   17m
    checkout          namespace-policy   STRICT   17m
    currency          namespace-policy   STRICT   17m
    email             namespace-policy   STRICT   17m
    frontend          namespace-policy   STRICT   17m
    loadgenerator     namespace-policy   STRICT   17m
    payment           namespace-policy   STRICT   17m
    product-catalog   namespace-policy   STRICT   17m
    recommendation    namespace-policy   STRICT   17m
    shipping          namespace-policy   STRICT   17m
    
  2. Hapus kebijakan autentikasi dari semua namespace Butik Online:

    for ns in ad cart checkout currency email frontend loadgenerator payment \
      product-catalog recommendation shipping; do
        kubectl delete peerauthentication -n $ns namespace-policy
    done;
    

    Output yang diharapkan:

    peerauthentication.security.istio.io "namespace-policy" deleted
    peerauthentication.security.istio.io "namespace-policy" deleted
    peerauthentication.security.istio.io "namespace-policy" deleted
    peerauthentication.security.istio.io "namespace-policy" deleted
    peerauthentication.security.istio.io "namespace-policy" deleted
    peerauthentication.security.istio.io "namespace-policy" deleted
    peerauthentication.security.istio.io "namespace-policy" deleted
    peerauthentication.security.istio.io "namespace-policy" deleted
    peerauthentication.security.istio.io "namespace-policy" deleted
    peerauthentication.security.istio.io "namespace-policy" deleted
    peerauthentication.security.istio.io "namespace-policy" deleted
    
  3. Akses Butik Online menggunakan alamat IP eksternal layanan frontend-external, dan muat ulang halaman. Halaman ditampilkan seperti yang diharapkan.

  4. Jalankan perintah berikut untuk curl layanan frontend dengan HTTP biasa dari Pod lain.

    kubectl exec \
      $(kubectl get pod -l app=productcatalogservice -n product-catalog -o jsonpath={.items..metadata.name}) \
      -c istio-proxy -n product-catalog -- \
      curl http://frontend.frontend.svc.cluster.local:80/ -o /dev/null -s -w '%{http_code}\n'
    

    Permintaan Anda berhasil dengan status 200, karena secara default, traffic TLS dan teks biasa diterima.

Jika Anda memuat ulang halaman di Konsol Google Cloud yang menampilkan daftar Workloads, status mTLS akan menjadi Permissive.

Mengaktifkan TLS bersama per workload

Agar dapat menetapkan kebijakan PeerAuthentication untuk beban kerja tertentu, Anda harus mengonfigurasi bagian selector dan menentukan label yang cocok dengan beban kerja yang diinginkan. Namun, Anthos Service Mesh tidak dapat menggabungkan kebijakan tingkat workload untuk traffic mTLS keluar ke layanan. Anda harus mengonfigurasi aturan tujuan untuk mengelola perilaku tersebut.

  1. Terapkan kebijakan autentikasi ke workload tertentu. Perhatikan cara kebijakan berikut menggunakan label dan pemilih untuk menargetkan deployment frontend tertentu.

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

    Output yang diharapkan:

    peerauthentication.security.istio.io/frontend created
  2. Konfigurasi aturan tujuan yang cocok.

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

    Output yang diharapkan:

    destinationrule.networking.istio.io/frontend created
  3. Akses Butik Online menggunakan alamat IP eksternal layanan frontend-external, dan muat ulang halaman. Halaman tidak ditampilkan karena frontend service disetel ke STRICT mTLS, dan proxy file bantuan memblokir permintaan.

  4. Jalankan perintah berikut untuk curl layanan frontend dengan HTTP biasa dari Pod lain.

    kubectl exec \
      $(kubectl get pod -l app=productcatalogservice -n product-catalog -o jsonpath={.items..metadata.name}) \
      -c istio-proxy -n product-catalog -- \
      curl http://frontend.frontend.svc.cluster.local:80/ -o /dev/null -s -w '%{http_code}\n'
    

    Permintaan Anda gagal dengan kode status 56.

    Jika Anda memuat ulang halaman di Konsol Google Cloud yang menampilkan daftar Workloads, kini status mTLS untuk layanan frontend adalah Strict dan semua layanan lainnya disetel ke Permissive.

    hanya layanan frontend yang merupakan mtls yang ketat

  5. Hapus kebijakan autentikasi:

    kubectl delete peerauthentication -n frontend frontend
    

    Output yang diharapkan:

    peerauthentication.security.istio.io "frontend" deleted
    
  6. Hapus aturan tujuan:

    kubectl delete destinationrule -n frontend frontend
    

    Output yang diharapkan:

    destinationrule.networking.istio.io "frontend" deleted
    

Menerapkan mTLS di seluruh mesh

Agar semua layanan Anda di mesh tidak menerima traffic teks biasa, tetapkan kebijakan PeerAuthentication seluruh mesh dengan mode mTLS ditetapkan ke STRICT. Kebijakan PeerAuthentication seluruh mesh tidak boleh memiliki pemilih dan harus diterapkan dalam namespace root, istio-system. Saat Anda men-deploy kebijakan, bidang kontrol akan otomatis menyediakan sertifikat TLS sehingga beban kerja dapat saling melakukan autentikasi.

  1. Terapkan mTLS di seluruh mesh:

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

    Output yang diharapkan:

    peerauthentication.security.istio.io/mesh-wide created

  2. Akses Butik Online menggunakan alamat IP eksternal layanan frontend-external, dan muat ulang halaman. Lamannya tidak akan ditampilkan.

  3. Jalankan perintah berikut untuk curl layanan frontend dengan HTTP biasa dari Pod lain.

    kubectl exec \
      $(kubectl get pod -l app=productcatalogservice -n product-catalog -o jsonpath={.items..metadata.name}) \
      -c istio-proxy -n product-catalog -- \
      curl http://frontend.frontend.svc.cluster.local:80/ -o /dev/null -s -w '%{http_code}\n'
    

    Permintaan Anda gagal dengan kode status 56.

  4. Hapus kebijakan mesh-wide:

    kubectl delete peerauthentication -n istio-system mesh-wide
    

    Output yang diharapkan:

    peerauthentication.security.istio.io "mesh-wide" deleted
    

    Jika memuat ulang halaman di Konsol Google Cloud, Anda akan melihat bahwa detail mTLS untuk semua layanan sekarang menampilkan Permissive.

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.

  • Jika Anda ingin mencegah biaya tambahan, hapus cluster:

    gcloud container clusters delete  CLUSTER_NAME  \
        --project=PROJECT_ID \
        --zone=CLUSTER_LOCATION
    
  • Jika Anda ingin mempertahankan cluster dan menghapus contoh Butik Online:

    1. Hapus namespace aplikasi:
    kubectl delete -f online-boutique/kubernetes-manifests/namespaces
    

    Output yang diharapkan:

    namespace "ad" deleted
    namespace "cart" deleted
    namespace "checkout" deleted
    namespace "currency" deleted
    namespace "email" deleted
    namespace "frontend" deleted
    namespace "loadgenerator" deleted
    namespace "payment" deleted
    namespace "product-catalog" deleted
    namespace "recommendation" deleted
    namespace "shipping" deleted
    
    1. Hapus entri layanan:
    kubectl delete -f online-boutique/istio-manifests/allow-egress-googleapis.yaml
    

    Output yang diharapkan:

    serviceentry.networking.istio.io "allow-egress-googleapis" deleted
    serviceentry.networking.istio.io "allow-egress-google-metadata" deleted
    

Langkah selanjutnya