Cloud Service Mesh melalui contoh: mTLS


Di Cloud Service Mesh 1.5 dan yang lebih baru, TLS bersama otomatis (mTLS otomatis) diaktifkan dengan secara default. Dengan mTLS otomatis, proxy file bantuan klien secara otomatis mendeteksi apakah memiliki file bantuan. File bantuan klien mengirimkan mTLS ke workload dengan file bantuan dan mengirimkan teks biasa ke workload tanpa file bantuan. Namun, perlu diketahui bahwa layanan menerima traffic teks biasa dan mTLS. Saat Anda memasukkan proxy file bantuan ke Pod Anda, kami sebaiknya konfigurasi juga layanan Anda agar hanya menerima traffic mTLS.

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

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 telah dibuat. Untuk informasi selengkapnya, lihat Pembersihan.

Sebelum memulai

  • Pastikan penagihan diaktifkan untuk project Cloud Anda. Pelajari cara mengonfirmasi bahwa penagihan diaktifkan untuk project Anda.

  • Menginstal Cloud Service Mesh di cluster GKE dan men-deploy ingress gateway. Jika Anda perlu menyiapkan cluster untuk tutorial ini, lihat Panduan memulai Cloud Service Mesh, yang akan memandu Anda melalui:

    • Membuat cluster GKE.
    • Menyediakan Cloud Service Mesh yang terkelola.
    • Men-deploy gateway masuk.
    • Men-deploy aplikasi contoh Online Boutique dari anthos-service-mesh-packages , yang dimodifikasi dari kumpulan manifes asli dalam microservices-demo ke dalam repositori tambahan. Dengan mengikuti praktik terbaik, setiap layanan di-deploy di namespace terpisah dengan akun layanan unik.
  • Membuat pod TestCurl untuk mengirim traffic teks biasa untuk pengujian.

      apiVersion: v1
      kind: Pod
      metadata:
        name: testcurl
        namespace: default
        annotations:
          sidecar.istio.io/inject: "false"
      spec:
        containers:
        - name: curl
          image: curlimages/curl
          command: ["sleep", "600"]
    

Akses Butik Online

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

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

    kubectl get services -n frontend
    

    Perhatikan bahwa frontend-external adalah LoadBalancer, dan memiliki alamat IP eksternal. Aplikasi contoh ini berisi layanan yang load balancer agar dapat di-deploy di GKE tanpa dan Cloud Service Mesh.

  3. Buka aplikasi di browser Anda menggunakan alamat IP eksternal dari Layanan frontend-external:

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

    • GATEWAY_SERVICE_NAME : Nama gateway masuk layanan. 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 yaitu gateway masuknya. 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 dan kunjungi aplikasi menggunakan alamat IP eksternal gateway masuk:

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

    kubectl debug --image istio/base --target istio-proxy -it \
      $(kubectl get pod -l app=productcatalogservice -n product-catalog -o jsonpath={.items..metadata.name}) \
      -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, TLS dan lalu lintas teks polos diterima.

Mengaktifkan TLS bersama per namespace

Anda menerapkan 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 Butik Online layanan untuk 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 memuat ulang halaman, yang berhasil ditampilkan. Saat Anda mengakses Butik Online menggunakan gateway masuk, permintaan mengambil jalur berikut:

    mTLS bersama

    Alur autentikasi mTLS:

    1. Browser mengirimkan permintaan HTTP teks biasa ke server.
    2. Penampung proxy gateway masuk mencegat permintaan.
    3. Proxy gateway masuk melakukan handshake TLS dengan proxy sisi server (layanan frontend dalam contoh ini). Handshake ini termasuk pertukaran sertifikat. Sertifikasi ini dimuat sebelumnya ke dalam container proxy oleh Cloud Service Mesh.
    4. Proxy gateway masuk melakukan pemeriksaan penamaan sertifikat server, yang memverifikasi bahwa identitas resmi sedang berjalan server.
    5. Gateway masuk dan proxy server membentuk TLS bersama dan {i>proxy<i} server akan meneruskan permintaan ke server container aplikasi (layanan frontend).
  6. Jalankan perintah berikut ke curl layanan frontend dengan HTTP biasa dari Pod lain.

    kubectl exec testcurl -n default -- curl \
      http://frontend.frontend.svc.cluster.local:80/ -o /dev/null -s -w '%{http_code}\n'
    

    Permintaan Anda gagal karena kami mengirim traffic teks biasa dari workload tanpa file bantuan yang menerapkan kebijakan STRICT peerAuthentication.

Menemukan dan menghapus kebijakan autentikasi

  1. Untuk mengetahui 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 Boutique Online namespace:

    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 dari frontend-external, lalu muat ulang halaman. Halaman ditampilkan sebagai yang diharapkan.

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

    kubectl debug --image istio/base --target istio-proxy -it \
      $(kubectl get pod -l app=productcatalogservice -n product-catalog -o jsonpath={.items..metadata.name}) \
      -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, TLS dan lalu lintas teks polos diterima.

Jika Anda me-refresh halaman di konsol Google Cloud yang menampilkan Workloads, kini menampilkan bahwa status mTLS adalah Permissive.

Mengaktifkan TLS bersama per workload

Agar dapat menetapkan kebijakan PeerAuthentication untuk workload tertentu, Anda harus mengonfigurasi bagian selector dan tentukan label yang sesuai dengan workload yang diinginkan. Namun, Cloud Service Mesh tidak dapat menggabungkan kebijakan tingkat workload untuk layanan outbound traffic mTLS ke layanan. Anda perlu mengonfigurasi aturan tujuan untuk mengelola perilaku tersebut.

  1. Terapkan kebijakan autentikasi ke beban kerja tertentu. Perhatikan bagaimana kebijakan berikut menggunakan label dan pemilih untuk menargetkan frontend tertentu deployment.

    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. Mengonfigurasi 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 dari frontend-external, lalu muat ulang halaman. Halaman ini tidak ditampilkan karena frontend service disetel ke STRICT mTLS, dan proxy file bantuan memblokir permintaan.

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

    kubectl exec testcurl -n default -- curl \
      http://frontend.frontend.svc.cluster.local:80/ -o /dev/null -s -w '%{http_code}\n'
    

    Permintaan Anda gagal karena kami mengirim traffic teks biasa dari workload tanpa file bantuan yang menerapkan kebijakan STRICT peerAuthentication.

  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 seluruh mesh

Untuk mencegah semua layanan Anda di mesh menerima traffic teks biasa, setel kebijakan PeerAuthentication seluruh mesh dengan mode mTLS yang disetel 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 otomatis menyediakan sertifikat TLS sehingga beban kerja dapat mengotentikasi satu sama lain.

  1. Terapkan mTLS 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 dari frontend-external, lalu muat ulang halaman. Halaman ini tidak tampilan.

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

    kubectl exec testcurl -n default -- curl \
      http://frontend.frontend.svc.cluster.local:80/ -o /dev/null -s -w '%{http_code}\n'
    

    Permintaan Anda gagal karena kami mengirim traffic teks biasa dari workload tanpa file bantuan yang menerapkan kebijakan STRICT peerAuthentication.

  4. Hapus kebijakan mesh-wide:

    kubectl delete peerauthentication -n istio-system mesh-wide
    

    Output yang diharapkan:

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

Pembersihan

Agar tidak perlu membayar 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.

  • Jika tidak ingin dikenai biaya tambahan, hapus cluster:

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

    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