Untuk mengamankan gerbang masuk Alibaba Cloud Service Mesh (ASM), Anda perlu memperoleh alamat IP klien riil. Hal ini memungkinkan Anda membuat kebijakan otorisasi berbasis daftar hitam atau daftar putih IP guna mengontrol akses. Topik ini menjelaskan cara mengonfigurasi gerbang masuk agar dapat mengambil alamat IP klien riil dari header permintaan HTTP.
Prasyarat
-
Injeksi sidecar otomatis diaktifkan untuk namespace tersebut. Untuk informasi selengkapnya, lihat Aktifkan injeksi otomatis.
Latar Belakang
Biasanya, aplikasi mengandalkan reverse proxy untuk meneruskan atribut klien dalam permintaan, seperti header X-Forwarded-For. Namun, karena Istio dapat diterapkan dalam berbagai topologi jaringan, gerbang masuk mungkin diakses langsung melalui alamat IP publik Classic Load Balancer (CLB), melalui Web Application Firewall (WAF), atau melalui topologi penerapan lain yang tidak ditentukan. Untuk mendukung berbagai arsitektur penerapan ini, Service Mesh ASM tidak dapat menyediakan nilai default tetap untuk meneruskan atribut klien ke workload target secara akurat. Akibatnya, Anda tidak dapat langsung memperoleh alamat IP klien riil dari header X-Forwarded-For.
Untuk mengatasi masalah ini, atur parameter numTrustedProxies pada gateway ASM sesuai dengan jumlah proxy tepercaya yang ditempatkan di depan proxy gateway. Konfigurasi ini menentukan nilai yang diisi oleh gerbang masuk ke dalam header X-Envoy-External-Address, sehingga layanan hulu dapat menggunakan nilai tersebut untuk mengakses alamat IP asli klien.
Prosedur
-
Terapkan aplikasi contoh.
-
Hubungkan ke kluster menggunakan kubectl. Untuk informasi selengkapnya, lihat Dapatkan file kubeconfig kluster dan gunakan kubectl untuk terhubung ke kluster.
-
Terapkan aplikasi httpbin.
-
Buat file httpbin.yaml dengan konten berikut.
-
Jalankan perintah berikut untuk menerapkan aplikasi httpbin.
kubectl apply -f httpbin.yaml
-
-
-
Buat gateway ASM.
-
Masuk ke Konsol ASM. Di panel navigasi sebelah kiri, pilih .
-
Pada halaman Mesh Management, klik nama instans ASM. Di panel navigasi sebelah kiri, pilih .
-
Pada halaman Ingress Gateway, klik Create dan konfigurasikan pengaturan dasar gateway.
Atur CLB instance type menjadi Internet Access. Konfigurasikan parameter lain sesuai kebutuhan. Untuk informasi selengkapnya tentang parameter tersebut, lihat Buat layanan ingress gateway.
-
Klik Advanced Options, atur External Traffic Policy menjadi Local, lalu klik Create.
-
-
Buat Gateway dan VirtualService.
-
Gunakan kubectl untuk mengelola resource Istio pada lapisan kontrol. Untuk informasi selengkapnya, lihat Gunakan kubectl pada lapisan kontrol untuk mengakses resource Istio.
-
Buat resource Gateway.
-
Gunakan konten berikut untuk membuat file httpbin-gateway.yaml.
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: httpbin-gateway spec: selector: istio: ingressgateway servers: - port: number: 80 name: http protocol: HTTP hosts: - "*" -
Jalankan perintah berikut untuk membuat resource Gateway.
kubectl apply -f httpbin-gateway.yaml
-
-
Buat resource VirtualService.
-
Gunakan konten berikut untuk membuat file httpbin-virtualservice.yaml.
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: httpbin spec: hosts: - "*" gateways: - httpbin-gateway http: - route: - destination: host: httpbin port: number: 8000 -
Jalankan perintah berikut untuk membuat resource VirtualService.
kubectl apply -f httpbin-virtualservice.yaml
-
-
-
Peroleh alamat IP gerbang masuk pada port 80 untuk aplikasi httpbin. Untuk informasi selengkapnya, lihat Buat layanan ingress gateway.
-
Di Web Application Firewall, tambahkan alamat gerbang masuk yang Anda peroleh pada Langkah 4. Untuk informasi selengkapnya, lihat Tutorial WAF.
-
Tambahkan parameter numTrustedProxies ke gateway ASM.
-
Masuk ke Konsol ASM. Di panel navigasi sebelah kiri, pilih .
-
Pada halaman Mesh Management, klik nama instans ASM. Di panel navigasi sebelah kiri, pilih .
-
Pada halaman Ingress Gateway, temukan gateway target dan klik View YAML.
-
Pada kotak dialog Edit, di bawah parameter spec, tambahkan konten berikut, lalu klik OK.
podAnnotations: proxy.istio.io/config: '{"gatewayTopology" : { "numTrustedProxies": 2 } }'Atur numTrustedProxies sesuai dengan jumlah proxy tepercaya yang ditempatkan di depan proxy gateway berdasarkan topologi aktual Anda. Jika Anda mengatur numTrustedProxies ke nilai N yang lebih besar dari nol, alamat klien tepercaya adalah alamat ke-(N+1) dari kanan dalam header X-Forwarded-For.
-
-
Jalankan perintah berikut untuk mengakses aplikasi httpbin dan mengambil alamat IP klien riil.
curl http://{IP address of the ingress gateway}/get?show_env=trueOutput yang diharapkan:
{ "args": { "show_env": "true" }, "headers": { "Accept": "*/*", .... "X-Envoy-Attempt-Count": "1", "X-Envoy-External-Address": "106.11.**.**", .... }, .... }Nilai X-Envoy-External-Address adalah alamat IP klien riil.