Topik ini menjelaskan cara membatasi akses dari alamat IP tertentu ke aplikasi dalam instance Service Mesh (ASM).
Prasyarat
Sebuah kluster telah ditambahkan ke instance ASM versi 1.15.3.25 atau yang lebih baru. Untuk informasi lebih lanjut, lihat Tambahkan Kluster ke Instance ASM.
Injeksi proxy sidecar otomatis diaktifkan. Untuk informasi lebih lanjut, lihat Aktifkan Injeksi Proxy Sidecar Otomatis.
Aplikasi HTTPBin telah diterapkan dan dapat diakses. Untuk informasi lebih lanjut, lihat Terapkan Aplikasi HTTPBin.
Catatan penggunaan
Dalam contoh ini, bidang externalTrafficPolicy gateway disetel ke Local. Jika bidang externalTrafficPolicy disetel ke Cluster, alamat IP sumber tidak akan dipertahankan.
Skenario 1: Tidak ada proxy lapisan 7 yang diterapkan antara klien yang memulai permintaan untuk mengakses aplikasi dalam instance ASM dan gateway ASM
Jalankan perintah berikut untuk mengakses aplikasi HTTPBin:
curl 47.111.XXX.XX:80/ -IAlamat IP sebenarnya dari klien adalah 106.11.XX.X. Nilai dari bidang downstream_remote_address dan x_forwarded_for dalam log gateway benar. Dalam hal ini, konfigurasi ipBlocks dan remoteIpBlocks pada gateway dapat berfungsi.
Nilai dari bidang x_forwarded_for dalam log akses proxy sidecar adalah alamat IP sebenarnya dari klien. Nilai dari bidang downstream_remote_address juga merupakan alamat IP sebenarnya dari klien, tetapi informasi port hilang dan ditampilkan sebagai 0.
Contoh 1: Konfigurasikan daftar hitam atau putih pada gateway
Uji ipBlocks
Gunakan konten berikut untuk membuat kebijakan otorisasi bernama gateway-test.yaml.
Anda dapat menggunakan kebijakan keamanan ASM atau daftar hitam/putih gateway untuk menyederhanakan konfigurasi.
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: gateway-test namespace: istio-system spec: action: DENY rules: - from: - source: ipBlocks: - 106.11.XX.X selector: matchLabels: istio: ingressgatewayJalankan perintah berikut untuk menerapkan kebijakan otorisasi:
kubectl apply -f gateway-test.yamlJalankan perintah berikut untuk mengakses aplikasi HTTPBin:
curl 47.111.175.XX:XX/ -IOutput yang Diharapkan:
HTTP/1.1 403 Forbidden content-length: 19 content-type: text/plain date: Thu, 31 Aug 2023 06:56:00 GMT server: istio-envoy
Uji remoteIpBlocks
Gunakan konten berikut untuk membuat kebijakan otorisasi bernama gateway-test.yaml.
Anda dapat menggunakan kebijakan keamanan ASM atau daftar hitam/putih gateway untuk menyederhanakan konfigurasi.
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: gateway-test namespace: istio-system spec: action: DENY rules: - from: - source: remoteIpBlocks: - 106.11.XX.X selector: matchLabels: istio: ingressgatewayJalankan perintah berikut untuk menerapkan kebijakan otorisasi:
kubectl apply -f gateway-test.yamlJalankan perintah berikut untuk mengakses aplikasi HTTPBin:
curl 47.111.175.XX:XX/ -IOutput yang Diharapkan:
HTTP/1.1 403 Forbidden content-length: 19 content-type: text/plain date: Thu, 31 Aug 2023 09:59:02 GMT server: istio-envoy
Contoh 2: Konfigurasikan daftar hitam atau putih pada proxy sidecar
Uji ipBlocks
Gunakan konten berikut untuk membuat kebijakan otorisasi bernama gateway-test.yaml:
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: gateway-test namespace: default spec: action: DENY rules: - from: - source: ipBlocks: - 106.11.XX.X selector: matchLabels: app: httpbinJalankan perintah berikut untuk menerapkan kebijakan otorisasi:
kubectl apply -f gateway-test.yamlJalankan perintah berikut untuk mengakses aplikasi HTTPBin:
curl 47.111.175.XX:XX/ -IOutput yang Diharapkan:
HTTP/1.1 200 OK server: istio-envoy date: Thu, 31 Aug 2023 10:14:01 GMT content-type: text/html; charset=utf-8 content-length: 9593 access-control-allow-origin: * access-control-allow-credentials: true x-envoy-upstream-service-time: 2Nilai dari bidang
downstream_remote_addressdalam log akses proxy sidecar adalah alamat IP klien, yang tidak diblokir.Nilai dari
downstream_remote_addresstidak selalu menjadi alamat IP yang ditentukan dalam bidangipBlocks. BidangipBlocksmenentukan alamat IP klien yang tidak diizinkan untuk secara langsung membentuk koneksi TCP dengan proxy saat ini. Dalam hal ini, alamat IP sumber sebenarnya dari koneksi TCP adalah alamat IP pod dari gateway.downstream_remote_addressadalah bidang fleksibel dan nilainya tidak selalu menjadi alamat IP fisik dari koneksi downstream.Bidang
downstream_remote_addressmenunjukkan alamat remote dari koneksi downstream. Jika alamat tersebut adalah alamat IP, maka ia mencakup alamat IP dan port. Alamat tersebut mungkin bukan alamat fisik sebenarnya dari ujung remote. Alamat tersebut mungkin disimpulkan dari filter Proxy Protocol atau header permintaanx_forwarded_for.Anda dapat mengganti alamat dalam bidang
ipBlocksdengan alamat IP pod dari gateway. Setelah konfigurasi, Anda tidak dapat mengakses aplikasi HTTPBin.
Uji remoteIpBlocks
Gunakan konten berikut untuk membuat kebijakan otorisasi bernama gateway-test.yaml:
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: gateway-test namespace: default spec: action: DENY rules: - from: - source: remoteIpBlocks: - 106.11.XX.X selector: matchLabels: app: httpbinJalankan perintah berikut untuk menerapkan kebijakan otorisasi:
kubectl apply -f gateway-test.yamlJalankan perintah berikut untuk mengakses aplikasi HTTPBin:
curl 47.111.XXX.XX:80/ -IOutput yang Diharapkan:
HTTP/1.1 403 Forbidden content-length: 19 content-type: text/plain date: Thu, 31 Aug 2023 11:06:42 GMT server: istio-envoy x-envoy-upstream-service-time: 0Konfigurasi remoteIpBlocks berfungsi. Dalam hal ini, nilai dari bidang
x_forwarded_forsama dengan nilai dari bidangdownstream_remote_address.
Skema 2: Sebuah proxy lapisan 7 diterapkan antara klien yang memulai permintaan untuk mengakses aplikasi dalam instance ASM dan gateway ASM
Dalam skenario ini, header permintaan x_forwarded_for dalam permintaan yang diterima oleh gateway ASM harus memiliki nilai default, yang ditambahkan oleh proxy lapisan 7.
Sebelum permintaan mencapai gateway ASM, nilai dari header permintaan x_forwarded_for harus 56.5.X.X, 72.9.X.X, 98.1.X.X. Alamat IP terakhir 106.11.XX.X ditambahkan oleh gateway ASM. downstream_remote_address menunjukkan alamat IP dari peer end yang langsung terhubung ke gateway. Dalam hal ini, itu adalah alamat IP fisik dan berisi port yang valid.
Log proxy sidecar menunjukkan bahwa nilai dari header permintaan x_forwarded_for sama dengan gateway. Nilai dari downstream_remote_address bukan alamat fisik sebenarnya. Ini adalah alamat IP terakhir dalam nilai dari header permintaan x_forwarded_for. (Bidang x_forwarded_for hanya berisi alamat IP. Oleh karena itu, port di sini adalah 0.)
Berikut ini tidak menguji bidang ipBlocks (bidang ini menunjukkan alamat IP fisik sebenarnya dari peer end). Hanya bidang remoteIpBlocks yang diuji. Dalam hal ini, Anda perlu memperlakukan bidang x_forwarded_for sebagai array. Ini menolak alamat IP untuk mengakses gateway ASM. Alamat IP terakhir dalam x_forwarded_for dalam log sebelumnya tidak diizinkan untuk mengakses gateway ASM.
Contoh 1: Atur remoteIpBlocks ke alamat IP terakhir dalam bidang x_forwarded_for
Gunakan konten berikut untuk membuat kebijakan otorisasi bernama gateway-test.yaml:
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: gateway-test-ap-wg-gateway-test-istio-system-gateway-ingressgateway namespace: istio-system spec: action: DENY rules: - from: - source: remoteIpBlocks: - 106.11.XX.X selector: matchLabels: istio: ingressgatewayJalankan perintah berikut untuk menerapkan kebijakan otorisasi:
kubectl apply -f gateway-test.yamlJalankan perintah berikut untuk mengakses aplikasi HTTPBin:
curl 47.111.175.XX:XX/ -H 'X-Forwarded-For: 56.5.X.X, 72.9.X.X, 98.1.X.X' -IOutput yang Diharapkan:
HTTP/1.1 403 Forbidden content-length: 19 content-type: text/plain date: Thu, 31 Aug 2023 11:50:36 GMT server: istio-envoyOutput menunjukkan bahwa alamat IP terakhir dalam bidang
x_forwarded_fortidak diizinkan untuk mengakses gateway ASM.
Contoh 2: Atur bidang numTrustedProxies dari gateway masuk ke 2
Tambahkan konfigurasi berikut ke bidang
specdalam file YAML gateway masuk. Untuk informasi lebih lanjut tentang cara mengedit file YAML gateway masuk, lihat Kelola Gateway Masuk di Konsol ASM.podAnnotations: proxy.istio.io/config: '{"gatewayTopology" : { "numTrustedProxies": 2 } }'CatatanKonfigurasi ini menyebabkan gateway restart.
Setelah gateway direstart, jalankan perintah berikut untuk mengakses aplikasi HTTPBin:
curl 47.111.XXX.XX:80/ -H 'X-Forwarded-For: 56.5.X.X, 72.9.X.X, 98.1.X.X' -IOutput yang Diharapkan:
HTTP/1.1 200 OK server: istio-envoy date: Thu, 31 Aug 2023 12:10:15 GMT content-type: text/html; charset=utf-8 content-length: 9593 access-control-allow-origin: * access-control-allow-credentials: true x-envoy-upstream-service-time: 2Output menunjukkan bahwa akses berhasil dan nilai dari bidang
numTrustedProxiesmemengaruhi hasil penilaian dari bidangremoteIpBlocks.Ketika
numTrustedProxiesdisetel ke2, gateway ASM menganggap dua proxy terdekat dengan dirinya sendiri sebagai tepercaya dan proxy ketiga terdekat sebagai tidak tepercaya. Oleh karena itu, bidangremoteIpBlocksmenolak alamat IP dari proxy ketiga terdekat untuk mengakses gateway. JikanumTrustedProxiestidak disetel, nilai defaultnya adalah 0.
Contoh 3: Gunakan kebijakan otorisasi untuk menolak akses dari alamat IP ketiga terakhir dalam bidang x_forwarded_for log gateway
Gunakan konten berikut untuk membuat kebijakan otorisasi bernama gateway-test.yaml:
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: gateway-test-ap-wg-gateway-test-istio-system-gateway-ingressgateway namespace: istio-system spec: action: DENY rules: - from: - source: remoteIpBlocks: - 72.9.X.X selector: matchLabels: istio: ingressgatewayJalankan perintah berikut untuk menerapkan kebijakan otorisasi:
kubectl apply -f gateway-test.yamlJalankan perintah berikut untuk mengakses aplikasi HTTPBin:
curl 47.111.XXX.XX:80/ -H 'X-Forwarded-For: 56.5.X.X, 72.9.X.X, 98.1.X.X' -IOutput yang Diharapkan:
HTTP/1.1 403 Forbidden content-length: 19 content-type: text/plain date: Thu, 31 Aug 2023 12:38:09 GMT server: istio-envoyOutput menunjukkan bahwa akses dari alamat IP ketiga terakhir yang ditentukan dalam bidang
x_forwarded_forditolak.
Contoh 4: Ubah ruang lingkup efektif dari kebijakan otorisasi sebelumnya ke aplikasi HTTPBin
Gunakan konten berikut untuk membuat kebijakan otorisasi bernama gateway-test.yaml:
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: gateway-test namespace: default spec: action: DENY rules: - from: - source: remoteIpBlocks: - 72.9.X.X selector: matchLabels: app: httpbinJalankan perintah berikut untuk menerapkan kebijakan otorisasi:
kubectl apply -f gateway-test.yamlJalankan perintah berikut untuk mengakses aplikasi HTTPBin:
curl 47.111.XXX.XX:80/ -H 'X-Forwarded-For: 56.5.X.X, 72.9.X.X, 98.1.X.X' -IOutput yang Diharapkan:
HTTP/1.1 200 OK server: istio-envoy date: Thu, 31 Aug 2023 12:39:36 GMT content-type: text/html; charset=utf-8 content-length: 9593 access-control-allow-origin: * access-control-allow-credentials: true x-envoy-upstream-service-time: 6Output menunjukkan bahwa akses berhasil dan kebijakan otorisasi tidak valid. Bidang
numTrustedProxiessebelumnya dikonfigurasikan untuk gateway. Nilai default darinumTrustedProxiesuntuk proxy sidecar masih 0. Proxy sidecar memverifikasi alamat IP terakhir dari header permintaanx_forwarded_foryang diterima. Oleh karena itu, permintaan tidak ditolak.Jika Anda mengubah nilai dari
remoteIpBlocksdalam kebijakan otorisasi menjadi alamat IP terakhir darix_forwarded_fordalam log proxy sidecar, akses ditolak.