Model konfigurasi autentikasi dan otorisasi dalam mode Ambient Mesh berbeda dari mode Sidecar sebelumnya karena pemisahan antara Lapisan 4 dan Lapisan 7. Topik ini menjelaskan cara menggunakan kebijakan otorisasi Lapisan 4 di instance Service Mesh (ASM) versi 1.18.
Prasyarat
Gateway masuk dan aplikasi terkait telah diterapkan, serta fitur dasar telah diverifikasi. Untuk informasi lebih lanjut, lihat Prasyarat dan Langkah 1 di Memulai.
Batasan
Berikut adalah batasan yang berlaku untuk kebijakan otorisasi di ztunnels:
Bidang
actiontidak dapat diatur keCUSTOM, yang menunjukkan bahwa ztunnels tidak mendukung layanan otorisasi kustom.Bidang
requestPrincipalsdanremoteIpBlockstidak didukung di bidangsource.Hanya bidang
portsyang didukung di bidangoperation.
Jika tidak ada waypoint proxy yang diterapkan, kebijakan otorisasi diberlakukan oleh ztunnels. Dalam hal ini, kebijakan otorisasi harus diikat ke beban kerja tertentu.
Ztunnel adalah proxy Lapisan 4. Jika Anda mengonfigurasi kebijakan otorisasi yang berisi aturan Lapisan 7 pada ztunnel, hanya aturan Lapisan 4 yang akan berlaku.
Contoh 1: Izinkan hanya gateway dan aplikasi sleep untuk mengakses layanan productpage
Contoh ini memverifikasi apakah ztunnels dapat dengan benar mengeksekusi otorisasi berdasarkan principals. Untuk informasi lebih lanjut, lihat Memulai.
Setelah pengujian selesai, jalankan perintah berikut untuk menghapus kebijakan otorisasi:
kubectl delete authorizationpolicy productpage-viewerContoh 2: Larang akses ke port 9080 layanan productpage
Contoh ini memverifikasi apakah ztunnels dapat dengan benar mengeksekusi otorisasi berdasarkan port tujuan.
Gunakan konten berikut untuk membuat file productpage-viewer.yaml:
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: productpage-viewer namespace: default spec: selector: matchLabels: app: productpage action: DENY rules: - to: - operation: ports: - "9080"Gunakan kubectl untuk terhubung ke instance ASM berdasarkan informasi dalam file kubeconfig, lalu jalankan perintah berikut untuk membuat kebijakan otorisasi:
kubectl apply -f productpage-viewer.yamlVerifikasi apakah kebijakan otorisasi berlaku.
Jalankan perintah berikut untuk melakukan uji akses:
kubectl exec deploy/sleep -- curl -s "http://$GATEWAY_HOST/productpage"Output yang diharapkan:
upstream connect error or disconnect/reset before headers. reset reason: connection termination%Jalankan perintah berikut untuk melakukan uji akses:
kubectl exec deploy/notsleep -- curl -s "http://$GATEWAY_HOST/productpage"Output yang diharapkan:
upstream connect error or disconnect/reset before headers. reset reason: connection termination%Jalankan perintah berikut untuk melakukan uji akses:
kubectl exec deploy/sleep -- curl -s http://productpage:9080/Output yang diharapkan:
command terminated with exit code 56Jalankan perintah berikut untuk melakukan uji akses:
kubectl exec deploy/notsleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"Output yang diharapkan:
command terminated with exit code 56Output tersebut menunjukkan bahwa semua pod tidak dapat mengakses port 9080 layanan productpage.
Pada dua tes pertama, kesalahan
upstream connect error or disconnect/reset before headers. reset reason: connection termination%dilaporkan dalam respons permintaan untuk mengakses layanan productpage melalui gateway. Kesalahan ini sebenarnya dikembalikan oleh ingress gateway. Jika gateway tidak dapat mengakses layanan productpage (layanan productpage tidak mengizinkan ingress gateway untuk mengakses port 9080-nya), kesalahan HTTP 503 dilaporkan.Respons dalam dua tes terakhir adalah
command terminated with exit code 56, yang dikembalikan oleh perintahcurl. Perintahcurlmencoba langsung membangun koneksi dengan layanan productpage, tetapi koneksi gagal dibuat. Oleh karena itu, tidak ada kesalahan HTTP yang dilaporkan, yang berbeda dari kesalahan akses langsung melalui gateway.
Jalankan perintah berikut untuk menghapus kebijakan otorisasi:
kubectl delete authorizationpolicy productpage-viewer
Contoh 3: Larang alamat IP pod sleep mengakses layanan productpage
Contoh ini memverifikasi apakah ztunnels dapat dengan benar mengeksekusi otorisasi berdasarkan alamat IP sumber.
Jalankan perintah berikut untuk menanyakan alamat IP pod sleep:
kubectl get pod -o wide | grep sleepOutput yang diharapkan:
notsleep-5fb85fb789-z**** 1/1 Running 0 48m 10.0.67.92 cn-hangzhou.10.0.67.41 <none> <none> sleep-bc9998558-z**** 1/1 Running 0 48m 10.0.67.91 cn-hangzhou.10.0.67.42 <none> <none>Output yang diharapkan menunjukkan bahwa alamat IP pod sleep dalam lingkungan pengujian saat ini adalah
10.0.67.91. Alamat pod IP aktual di setiap lingkungan mungkin berbeda.Gunakan konten berikut untuk membuat file productpage-viewer.yaml yang melarang permintaan dari alamat IP pod sleep untuk mengakses layanan productpage.
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: productpage-viewer namespace: default spec: selector: matchLabels: app: productpage action: DENY rules: - from: - source: ipBlocks: - ${sleep Pod IP}Gunakan kubectl untuk terhubung ke instance ASM berdasarkan informasi dalam file kubeconfig, lalu jalankan perintah berikut untuk membuat kebijakan otorisasi:
kubectl apply -f productpage-viewer.yamlVerifikasi apakah kebijakan otorisasi berlaku.
Jalankan perintah berikut untuk melakukan uji akses:
kubectl exec deploy/sleep -- curl -s "http://$GATEWAY_HOST/productpage" | grep -o "<title>.*</title>"Output yang diharapkan:
<title>Simple Bookstore App</title>Jalankan perintah berikut untuk melakukan uji akses:
kubectl exec deploy/notsleep -- curl -s "http://$GATEWAY_HOST/productpage" | grep -o "<title>.*</title>"Output yang diharapkan:
<title>Simple Bookstore App</title>Jalankan perintah berikut untuk melakukan uji akses:
kubectl exec deploy/sleep -- curl -s http://productpage:9080/Output yang diharapkan:
command terminated with exit code 56Jalankan perintah berikut untuk melakukan uji akses:
kubectl exec deploy/notsleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"Output yang diharapkan:
<title>Simple Bookstore App</title>Output tersebut menunjukkan bahwa ketika Anda hanya menerapkan ztunnels dan tidak menerapkan waypoint proxy, Anda tidak dapat melarang pod sleep mengakses layanan productpage melalui gateway. Ini karena bidang
remoteIpBlocksdalam kebijakan otorisasi bergantung pada Header X-Forwarded-For dari permintaan, sedangkan ztunnel adalah proxy Lapisan 4.
Jalankan perintah berikut untuk menghapus kebijakan otorisasi:
kubectl delete authorizationpolicy productpage-viewer
Contoh 4: Larang pod di namespace istio-system mengakses layanan productpage
Contoh ini memverifikasi apakah ztunnels dapat dengan benar mengeksekusi otorisasi berdasarkan namespace sumber. Namespace sumber merujuk pada namespace tempat pod memulai permintaan.
Gunakan konten berikut untuk membuat file productpage-viewer.yaml yang melarang pod di namespace istio-system mengakses layanan productpage:
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: productpage-viewer namespace: default spec: selector: matchLabels: app: productpage action: DENY rules: - from: - source: namespaces: - istio-systemGunakan kubectl untuk terhubung ke instance ASM berdasarkan informasi dalam file kubeconfig, lalu jalankan perintah berikut untuk membuat kebijakan otorisasi:
kubectl apply -f productpage-viewer.yamlVerifikasi apakah kebijakan otorisasi berlaku.
Jalankan perintah berikut untuk melakukan uji akses:
kubectl exec deploy/sleep -- curl -s "http://$GATEWAY_HOST/productpage"Output yang diharapkan:
upstream connect error or disconnect/reset before headers. reset reason: connection termination%Jalankan perintah berikut untuk melakukan uji akses:
kubectl exec deploy/notsleep -- curl -s "http://$GATEWAY_HOST/productpage"Output yang diharapkan:
upstream connect error or disconnect/reset before headers. reset reason: connection termination%Jalankan perintah berikut untuk melakukan uji akses:
kubectl exec deploy/sleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"Output yang diharapkan:
<title>Simple Bookstore App</title>Jalankan perintah berikut untuk melakukan uji akses:
kubectl exec deploy/notsleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"Output yang diharapkan:
<title>Simple Bookstore App</title>Ingress gateway diterapkan di namespace istio-system. Output tersebut menunjukkan bahwa setelah kebijakan otorisasi dibuat, aplikasi sleep dan notsleep tidak dapat mengakses layanan productpage melalui gateway, tetapi mereka dapat langsung mengakses layanan productpage.
Jalankan perintah berikut untuk menghapus kebijakan otorisasi:
kubectl delete authorizationpolicy productpage-viewer