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.
Biaya
Dalam dokumen ini, Anda menggunakan komponen Google Cloud yang dapat ditagih berikut:
Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda,
gunakan kalkulator harga.
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 dalammicroservices-demo
ke dalam repositori tambahan. Dengan mengikuti praktik terbaik, setiap layanan di-deploy di namespace terpisah dengan akun layanan unik.
Akses Butik Online
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
Tampilkan daftar layanan di namespace
frontend
:kubectl get services -n frontend
Perhatikan bahwa
frontend-external
adalahLoadBalancer
, dan memiliki alamat IP eksternal. Aplikasi contoh ini berisi layanan yang load balancer agar dapat di-deploy di GKE tanpa dan Cloud Service Mesh.Buka aplikasi di browser Anda menggunakan alamat IP eksternal dari Layanan
frontend-external
:http://FRONTEND_EXTERNAL_IP/
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
- 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
Buka tab lain di browser Anda dan kunjungi aplikasi menggunakan alamat IP eksternal gateway masuk:
http://INGRESS_GATEWAY_EXTERNAL_IP/
Jalankan perintah berikut ke
curl
layananfrontend
dengan HTTP biasa dari Pod lain. Karena layanan berada di namespace yang berbeda, Anda perlu melakukan curl pada nama DNS dari layananfrontend
.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, TLS dan lalu lintas teks polos diterima.
Mengaktifkan TLS bersama per namespace
Anda menerapkan mTLS dengan menerapkan kebijakan PeerAuthentication
dengan kubectl
.
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
adalahPERMISSIVE
, yang mengonfigurasi layanan untuk menerima teks biasa dan mTLS.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
Buka tab di browser Anda yang mengakses Butik Online menggunakan alamat IP eksternal layanan
frontend-external
:http://FRONTEND_EXTERNAL_IP/
Muat ulang halaman. Browser menampilkan error berikut:
Memuat ulang halaman akan menyebabkan teks biasa dikirim ke layanan
frontend
. Karena kebijakan autentikasiSTRICT
, proxy file bantuan memblokir permintaan ke layanan.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:Alur autentikasi mTLS:
- Browser mengirimkan permintaan HTTP teks biasa ke server.
- Penampung proxy gateway masuk mencegat permintaan.
- 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.
- Proxy gateway masuk melakukan pemeriksaan penamaan sertifikat server, yang memverifikasi bahwa identitas resmi sedang berjalan server.
- Gateway masuk dan proxy server membentuk TLS bersama dan {i>proxy<i} server akan meneruskan permintaan ke server container aplikasi (layanan frontend).
Jalankan perintah berikut ke
curl
layananfrontend
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 Butik Online ditetapkan ke
STRICT
mTLS, dan proxy file bantuan memblokir permintaan untuk layanan tersebut.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.
Di konsol Google Cloud, buka Overview GKE Enterprise kami.
Pilih project Google Cloud dari daftar project di panel menu.
Dari kartu Status kebijakan, bergantung pada konfigurasi Anda, klik Lihat Kebijakan atau Aktifkan Kebijakan. Dasbor Pengontrol Kebijakan akan terbuka.
Klik tab Pelanggaran.
Di bagian Resource Kind, centang kotak Pod. Ini menampilkan daftar Pod yang melanggar kebijakan.
Menemukan dan menghapus kebijakan autentikasi
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
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
Akses Butik Online menggunakan alamat IP eksternal dari
frontend-external
, lalu muat ulang halaman. Halaman ditampilkan sebagai yang diharapkan.Jalankan perintah berikut ke
curl
layananfrontend
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, 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.
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
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
Akses Butik Online menggunakan alamat IP eksternal dari
frontend-external
, lalu muat ulang halaman. Halaman ini tidak ditampilkan karenafrontend service
disetel keSTRICT
mTLS, dan proxy file bantuan memblokir permintaan.Jalankan perintah berikut ke
curl
layananfrontend
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 me-refresh halaman di konsol Google Cloud yang menampilkan Workloads, kini menampilkan bahwa status mTLS untuk Layanan
frontend
adalahStrict
dan semua layanan lainnya ditetapkan kePermissive
.Hapus kebijakan autentikasi:
kubectl delete peerauthentication -n frontend frontend
Output yang diharapkan:
peerauthentication.security.istio.io "frontend" deleted
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.
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
Akses Butik Online menggunakan alamat IP eksternal dari
frontend-external
, lalu muat ulang halaman. Halaman ini tidak tampilan.Jalankan perintah berikut ke
curl
layananfrontend
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
.Hapus kebijakan
mesh-wide
:kubectl delete peerauthentication -n istio-system mesh-wide
Output yang diharapkan:
peerauthentication.security.istio.io "mesh-wide" deleted
Jika Anda me-refresh halaman di Konsol Google Cloud, Anda akan melihat bahwa Detail
mTLS
untuk semua layanan kini menampilkanPermissive
.
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:
- 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
- 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
- Untuk panduan umum tentang mengonfigurasi kebijakan
PeerAuthentication
, lihat Mengonfigurasi keamanan transportasi.