Service Mesh (ASM) gateway egress berfungsi sebagai pintu keluar terpadu untuk lalu lintas di dalam ASM. Gateway ini dapat memulai permintaan TLS/mTLS untuk mencapai komunikasi terenkripsi ujung ke ujung serta menerapkan kebijakan keamanan menyeluruh guna kontrol akses yang lebih rinci. Dalam ASM, gateway egress merupakan pilihan ideal untuk mengelola lalu lintas arah keluar. Topik ini menjelaskan cara menggunakan gateway egress ASM untuk mengelola lalu lintas arah keluar dan memulai komunikasi mTLS.
Pastikan Anda telah menyelesaikan semua langkah yang tercantum di Konfigurasikan layanan mTLS pada gateway ingress ASM dan batasi akses klien tertentu. Topik ini menggunakan aplikasi yang diterapkan di lingkungan ASM dan Container Service for Kubernetes (ACK) sebagai server mTLS eksternal. Oleh karena itu, saat melakukan langkah-langkah dalam topik ini, Anda perlu membuat lingkungan ASM dan ACK lainnya sebagai lingkungan utama. Untuk klarifikasi, ${ASM gateway IP} dalam topik ini mewakili alamat IP gateway ingress yang digunakan di Konfigurasikan layanan mTLS pada gateway ingress ASM dan batasi akses klien tertentu, dan "ACK cluster" serta "ASM instance" merujuk pada sumber daya lingkungan utama.
Prasyarat
Injeksi sidecar otomatis harus diaktifkan. Untuk informasi lebih lanjut, lihat Konfigurasikan kebijakan injeksi proxy sidecar.
Langkah 1: Terapkan aplikasi pengujian sleep
Terapkan aplikasi sleep. Untuk informasi lebih lanjut, lihat Operasi terkait.
Gunakan kubeconfig dari kluster ACK untuk menjalankan perintah berikut guna menguji akses ke layanan HTTPBin yang diterapkan di lingkungan ASM dan ACK lainnya.
kubectl exec deploy/sleep -- curl --header "host:test.com" ${ASM gateway IP}/status/418Keluaran yang diharapkan:
-=[ teapot ]=-
_...._
.' _ _ `.
| ."` ^ `". _,
\_;`"---"`|//
| ;/
\_ _/
`"""`Langkah 2: Aktifkan REGISTRY_ONLY dan buat ServiceEntry
Sidecar mendukung konfigurasi kebijakan akses eksternal sebagai REGISTRY_ONLY. Setelah REGISTRY_ONLY diaktifkan, pod hanya dapat mengakses layanan yang didaftarkan melalui ServiceEntry. Anda dapat memilih apakah akan mengaktifkan fitur ini. Untuk informasi lebih lanjut, lihat Langkah 2: Aktifkan REGISTRY_ONLY. Setelah fitur diaktifkan, mengakses layanan yang tidak terdaftar akan menghasilkan kesalahan 502 Bad Gateway.
Gunakan konten berikut untuk mengonfigurasi ServiceEntry untuk test.com. Untuk informasi lebih lanjut, lihat Buat layanan eksternal.
apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
name: test-com
namespace: default
spec:
endpoints:
- address: ${Alamat IP gateway ingress}
hosts:
- test.com
location: MESH_EXTERNAL
ports:
- name: http
number: 80
protocol: HTTP
- name: https
number: 443
protocol: HTTPS
resolution: STATICSetelah menyelesaikan konfigurasi, Anda dapat mengakses layanan HTTPBin dari pod sleep.
Langkah 3: Buat gateway egress ASM dan arahkan permintaan HTTP melalui gateway egress
Buat gateway egress, konfigurasikan untuk lalu lintas HTTP pada port 80, dan aktifkan saklar autentikasi mutual TLS. Setelah saklar diaktifkan, beban kerja lain di ASM secara otomatis menggunakan mTLS saat mengirim lalu lintas ke gateway, dengan sertifikat mTLS dikelola secara seragam oleh ASM. Untuk informasi lebih lanjut, lihat Buat gateway egress.
Gunakan konten berikut untuk membuat aturan gateway. Untuk informasi lebih lanjut, lihat Buat aturan gateway.
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: egress-gateway namespace: default spec: selector: istio: egressgateway servers: - hosts: - '*' port: name: http number: 80 protocol: HTTPS tls: mode: ISTIO_MUTUALAturan gateway menyatakan bahwa gateway egress mendengarkan pada port 80 dengan mTLS diaktifkan, menggunakan sertifikat yang disediakan oleh ASM.
Gunakan konten berikut untuk membuat layanan virtual.
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: egressgateway-vs spec: hosts: - test.com gateways: - egress-gateway # Nama aturan gateway yang dibuat pada langkah sebelumnya. - mesh http: - match: - gateways: - mesh port: 80 route: - destination: host: istio-egressgateway.istio-system.svc.cluster.local port: number: 80 weight: 100 - match: - gateways: - egress-gateway port: 80 route: - destination: host: test.com port: number: 80 weight: 100Setelah membuat layanan virtual, lalu lintas untuk
test.comdi sidecar dikirim ke gateway egress, dan lalu lintas yang diterima oleh gateway egress untuktest.comdikirim ketest.comServiceEntry yang sebenarnya.Jalankan perintah berikut untuk mengakses
test.comdari pod aplikasi sleep.kubectl exec deploy/sleep -- curl --header "host:test.com" ${ASM gateway IP}/status/418Keluaran yang diharapkan:
-=[ teapot ]=- _...._ .' _ _ `. | ."` ^ `". _, \_;`"---"`|// | ;/ \_ _/ `"""`Gunakan kubeconfig dari instance ASM untuk menjalankan perintah berikut.
kubectl -n istio-system logs ${nama pod gateway egress}| tail -1Keluaran yang diharapkan:
{"authority_for":"test.com","bytes_received":"0","bytes_sent":"135","downstream_local_address":"192.168.36.32:80","downstream_remote_address":"192.168.36.29:58146","duration":"8","istio_policy_status":"-","method":"GET","path":"/status/418","protocol":"HTTP/1.1","request_id":"9f7b5475-6e45-4700-a85a-e00835b6b6c0","requested_server_name":"outbound_.80_._.istio-egressgateway.istio-system.svc.cluster.local","response_code":"418","response_flags":"-","route_name":"-","start_time":"2024-07-29T03:05:58.421Z","trace_id":"-","upstream_cluster":"outbound|80||test.com","upstream_host":"${ASM gateway IP}:80","upstream_local_address":"192.168.36.32:52838","upstream_response_time":"7","upstream_service_time":"7","upstream_transport_failure_reason":"-","user_agent":"curl/8.1.2","x_forwarded_for":"192.168.36.29"}Log di atas mengonfirmasi bahwa layanan melewati gateway egress ASM.
Path permintaan dalam contoh ini adalah: sleep pod --> istio-egressgateway --> istio-ingressgateway --> httpbin. Di antaranya:
sleep pod --> istio-egressgatewayadalah lalu lintas mTLS.istio-egressgateway --> istio-ingressgatewayadalah lalu lintas teks biasa.istio-ingressgateway --> httpbinadalah lalu lintas mTLS.
Interaksi antara dua gateway melalui teks biasa jelas tidak aman. Karena gateway sisi server mendukung mTLS, Anda hanya perlu mengonfigurasi gateway egress sisi klien untuk memulai permintaan mTLS.
Langkah 4: Tingkatkan permintaan HTTP menjadi lalu lintas mTLS di gateway egress
Gunakan konten berikut untuk memperbarui layanan virtual.
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: egressgateway-vs spec: hosts: - test.com gateways: - egress-gateway - mesh http: - match: - gateways: - mesh port: 80 route: - destination: host: istio-egressgateway.istio-system.svc.cluster.local port: number: 80 weight: 100 - match: - gateways: - egress-gateway port: 80 route: - destination: host: test.com port: number: 443 # Hanya baris ini yang dimodifikasi weight: 100Pembaruan di sini hanya mengubah lalu lintas yang dikirim ke
test.comServiceEntry dari port 80 ke port 443.Impor sertifikat mTLS yang digunakan di Konfigurasikan layanan mTLS pada gateway ingress ASM dan batasi akses klien tertentu. Pastikan sertifikat yang diimpor bernama
test.client. Untuk informasi lebih lanjut, lihat Gunakan fitur manajemen sertifikat ASM. Anda juga dapat menggunakan kubectl untuk membuat rahasia guna mengimpor sertifikat. Gunakan kubeconfig dari kluster ACK untuk menjalankan perintah berikut.kubectl create -n istio-system secret generic test.client \ --from-file=tls.key=client.key.pem \ --from-file=tls.crt=clientcert.pem \ --from-file=ca.crt=cacert.pemGunakan konten berikut untuk membuat aturan tujuan.
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: originate-mtls-for-test-com spec: host: test.com trafficPolicy: loadBalancer: simple: ROUND_ROBIN portLevelSettings: - port: number: 443 tls: mode: MUTUAL credentialName: test.client sni: test.comJalankan perintah berikut untuk menguji akses lagi.
kubectl exec deployment/sleep -it -- curl --header "host:test.com" ${ASM gateway IP}/status/418Keluaran yang diharapkan:
RBAC: access denied%Permintaan ditolak. Ini karena sertifikat klien yang digunakan di sini digunakan kembali dari Konfigurasikan layanan mTLS pada gateway ingress ASM dan batasi akses klien tertentu, yang dikonfigurasi untuk melarang test.client mengakses path
status/418.Jalankan perintah berikut untuk mengakses path
status/200.kubectl exec deploy/sleep -it -- curl --header "host:test.com" ${ASM gateway IP}/status/200 -IKeluaran yang diharapkan:
HTTP/1.1 200 OK server: envoy date: Mon, 29 Jul 2024 03:33:50 GMT content-type: text/html; charset=utf-8 access-control-allow-origin: * access-control-allow-credentials: true content-length: 0 x-envoy-upstream-service-time: 5Akses berhasil.
Jalankan perintah berikut untuk melihat log akses gateway egress.
kubectl -n istio-system logs ${nama pod gateway egress}| tail -1Keluaran yang diharapkan:
{"authority_for":"test.com","bytes_received":"0","bytes_sent":"19","downstream_local_address":"192.168.36.32:80","downstream_remote_address":"192.168.36.29:58146","duration":"3","istio_policy_status":"-","method":"GET","path":"/status/418","protocol":"HTTP/1.1","request_id":"82394ec4-cf13-45cb-ae4c-cb1873fbccda","requested_server_name":"outbound_.80_._.istio-egressgateway.istio-system.svc.cluster.local","response_code":"403","response_flags":"-","route_name":"-","start_time":"2024-07-29T03:34:36.647Z","trace_id":"-","upstream_cluster":"outbound|443||test.com","upstream_host":"${ASM gateway IP}:443","upstream_local_address":"192.168.36.32:42214","upstream_response_time":"2","upstream_service_time":"2","upstream_transport_failure_reason":"-","user_agent":"curl/8.1.2","x_forwarded_for":"192.168.36.29"}Permintaan ini mengakses port 443 gateway ingress, yang hanya menyediakan layanan mTLS.
Langkah 5: Konfigurasi selanjutnya
Pod sleep memulai permintaan HTTP. Setelah melewati sidecar dan gateway egress, seluruh koneksi diamankan dengan enkripsi mTLS, yang membentuk dasar untuk otentikasi identitas klien. Dalam aliran permintaan ini, kebijakan otorisasi dapat dikonfigurasi di dua tempat untuk membatasi perilaku klien.
Gunakan konten berikut untuk mengonfigurasi kebijakan otorisasi pada gateway egress. Ini dapat membatasi layanan mana di dalam kluster yang dapat mengakses layanan
test.com.apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: labels: gateway: egressgateway name: test namespace: istio-system spec: action: DENY rules: - from: - source: principals: - cluster.local/ns/default/sa/sleep to: - operation: hosts: - test.com paths: - /headers selector: matchLabels: istio: egressgatewayKonfigurasi ini membatasi pod sleep untuk mengakses path
/headersdaritest.commelalui gateway egress.Konfigurasikan kebijakan otorisasi pada gateway ingress untuk membatasi identitas klien yang langsung mengakses gateway ingress. Kebijakan otorisasi pada gateway ingress yang dikonfigurasi di Langkah 4 mencegah gateway egress saat ini mengakses path
/status/418.