Secara default, workload dalam instans Service Mesh (ASM) dapat saling berkomunikasi. Anda dapat membuat kebijakan otorisasi untuk mengontrol akses dan mengelola izin pada workload dalam kluster. Dalam hal ini, hanya permintaan yang memenuhi persyaratan tertentu yang dapat mengakses workload tersebut. Misalnya, Anda dapat mengontrol akses ke workload dengan menentukan path permintaan, metode permintaan, dan alamat IP klien. Hal ini meningkatkan keamanan serta melindungi sumber daya instans ASM.
Prasyarat
Pengenalan fitur
Anda dapat menentukan aksi CUSTOM, DENY, atau ALLOW dalam kebijakan otorisasi. Kebijakan otorisasi memiliki tingkat prioritas berbeda saat Anda menerapkan beberapa kebijakan otorisasi pada satu workload. Secara spesifik, sistem memverifikasi permintaan berdasarkan kebijakan otorisasi CUSTOM, DENY, dan ALLOW secara berurutan. Jika Anda membuat beberapa kebijakan otorisasi untuk satu workload, aturan berikut berlaku:
Jika permintaan sesuai dengan kondisi dalam kebijakan otorisasi CUSTOM yang menolak permintaan tersebut, maka permintaan tersebut ditolak.
Jika permintaan sesuai dengan kondisi dalam kebijakan otorisasi DENY yang menolak permintaan tersebut, maka permintaan tersebut ditolak.
Secara default, jika tidak ada kebijakan otorisasi ALLOW yang dikonfigurasi untuk suatu workload, permintaan dapat mengakses workload tersebut.
Jika kebijakan otorisasi ALLOW dikonfigurasi untuk suatu workload dan permintaan sesuai dengan kondisi dalam kebijakan otorisasi ALLOW tersebut, maka permintaan tersebut dapat mengakses workload tersebut.
Jika permintaan tidak memenuhi semua persyaratan di atas, permintaan tersebut ditolak.
Topik ini menyediakan empat contoh berikut untuk membantu Anda memahami dan mengonfigurasi kebijakan otorisasi dengan cepat:
Skenario 1: Kontrol akses ke path tertentu dari suatu workload
Dalam contoh ini, kebijakan otorisasi dibuat untuk menentukan bahwa aplikasi dalam namespace foo dapat mengakses path /headers dari aplikasi HTTPBin. Aplikasi HTTPBin berada dalam namespace foo. Permintaan ke path lain gagal. Aplikasi dalam namespace selain foo tidak dapat mengakses aplikasi HTTPBin.
Langkah 1: Aktifkan injeksi proxy sidecar otomatis untuk namespace default dan foo
Buat namespace default dan foo. Untuk informasi lebih lanjut, lihat Buat namespace.
Aktifkan injeksi proxy sidecar otomatis untuk namespace default dan foo. Untuk informasi lebih lanjut, lihat Aktifkan injeksi proxy sidecar otomatis.
Langkah 2: Deploy aplikasi uji
Deploy aplikasi sleep di namespace default dan foo.
Buat file sleep.yaml yang berisi konten berikut:
Jalankan perintah berikut untuk mendeploy aplikasi sleep di namespace default:
kubectl apply -f sleep.yaml -n defaultJalankan perintah berikut untuk mendeploy aplikasi sleep di namespace foo:
kubectl apply -f sleep.yaml -n foo
Deploy aplikasi HTTPBin di namespace foo.
Buat file httpbin.yaml yang berisi konten berikut:
Jalankan perintah berikut untuk mendeploy aplikasi HTTPBin di namespace foo:
kubectl apply -f httpbin.yaml -n foo
Langkah 3: Buat kebijakan otorisasi
-
Masuk ke Konsol ASM. Di panel navigasi kiri, pilih .
-
Pada halaman Mesh Management, klik nama instans ASM. Di panel navigasi kiri, pilih . Pada halaman yang muncul, klik Create.
Pada halaman Create, konfigurasikan parameter dan klik Create.
Parameter
Deskripsi
Name
Nama kebijakan otorisasi.
Policy Type
Atur nilainya ke ALLOW.
Namespaces
Pada tab Workload Scope, atur Namespaces ke foo.
Effective Scope
Pilih Service.
Workload
Pilih httpbin.
Request Matching Rules
Di bagian Add Request Source, aktifkan sakelar Namespaces dan atur nilainya ke foo. Hal ini memungkinkan semua aplikasi dalam namespace
foomengakses aplikasihttpbin.Di bagian Add Request Target, aktifkan sakelar Paths dan atur nilainya ke /headers. Hal ini memungkinkan aplikasi mengakses hanya path
/headersdari aplikasihttpbindalam namespacefoo.
Langkah 4: Periksa apakah kebijakan otorisasi yang mengontrol akses ke path tertentu berlaku
Kirim permintaan menggunakan aplikasi sleep di namespace default untuk mengakses aplikasi HTTPBin di namespace foo.
Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
Pada halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik .
Di bagian atas halaman Pods, atur Namespaces ke default. Temukan pod
sleepdan klik di kolom Actions.Jalankan perintah berikut di bagian Terminal kontainer sleep untuk mengakses path /headers dari aplikasi HTTPBin:
curl httpbin.foo.svc.cluster.local:8000/headersKode 403 dikembalikan, yang menunjukkan bahwa permintaan ditolak.
Jalankan perintah berikut di bagian Terminal kontainer sleep untuk mengakses path /ip dari aplikasi HTTPBin:
curl httpbin.foo.svc.cluster.local:8000/ipKode 403 dikembalikan, yang menunjukkan bahwa permintaan ditolak.
Kirim permintaan menggunakan aplikasi sleep di namespace foo untuk mengakses aplikasi HTTPBin di namespace foo.
Di panel navigasi kiri halaman manajemen kluster, pilih .
Di bagian atas halaman Pods, atur Namespaces ke foo. Temukan pod
sleepdan klik di kolom Actions.Jalankan perintah berikut di bagian Terminal kontainer sleep untuk mengakses path /headers dari aplikasi HTTPBin:
curl httpbin.foo.svc.cluster.local:8000/headersOutput yang diharapkan:
{ "headers": { "Accept": "*/*", "Host": "httpbin.foo.svc.cluster.local:8000", "User-Agent": "curl/7.82.0-DEV", "X-Envoy-Attempt-Count": "1", "X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/foo/sa/httpbin;Hash=f7ab4985563b5b1986314d5a36c6e46819213e2f38301f534f00afb7cd4b9164;Subject=\"\";URI=spiffe://cluster.local/ns/foo/sa/sleep" } }Jalankan perintah berikut di bagian Terminal kontainer sleep untuk mengakses path /ip dari aplikasi HTTPBin:
curl httpbin.foo.svc.cluster.local:8000/ipKode 403 dikembalikan, yang menunjukkan bahwa permintaan ditolak.
Hasil output menunjukkan bahwa aplikasi dalam namespace default tidak dapat mengakses path aplikasi HTTPBin di namespace foo. Aplikasi dalam namespace foo dapat mengakses path /headers dari aplikasi HTTPBin.
Skenario 2: Kontrol metode permintaan dan akses ke path tertentu dari suatu workload
Dalam contoh ini, kebijakan otorisasi dibuat untuk menentukan bahwa aplikasi dalam namespace selain foo hanya dapat mengakses path /status dari aplikasi HTTPBin menggunakan permintaan GET. Aplikasi HTTPBin berada dalam namespace foo. Permintaan ke path lain dari aplikasi HTTPBin dan permintaan yang menggunakan metode selain GET gagal.
Langkah 1: Aktifkan injeksi proxy sidecar otomatis untuk namespace default dan foo
Buat namespace default dan foo. Untuk informasi lebih lanjut, lihat Buat namespace.
Aktifkan injeksi proxy sidecar otomatis untuk namespace default dan foo. Untuk informasi lebih lanjut, lihat Aktifkan injeksi proxy sidecar otomatis.
Langkah 2: Deploy aplikasi uji
Deploy aplikasi sleep di namespace default dan foo.
Buat file sleep.yaml yang berisi konten berikut:
Jalankan perintah berikut untuk mendeploy aplikasi sleep di namespace default:
kubectl apply -f sleep.yaml -n defaultJalankan perintah berikut untuk mendeploy aplikasi sleep di namespace foo:
kubectl apply -f sleep.yaml -n foo
Deploy aplikasi HTTPBin di namespace foo.
Buat file httpbin.yaml yang berisi konten berikut:
Jalankan perintah berikut untuk mendeploy aplikasi HTTPBin di namespace foo:
kubectl apply -f httpbin.yaml -n foo
Langkah 3: Buat kebijakan otorisasi
-
Masuk ke Konsol ASM. Di panel navigasi kiri, pilih .
-
Pada halaman Mesh Management, klik nama instans ASM. Di panel navigasi kiri, pilih . Pada halaman yang muncul, klik Create.
Pada halaman Create, konfigurasikan parameter dan klik Create.
Aktifkan sakelar Methods dan atur nilainya ke GET.
Aktifkan sakelar Paths dan atur nilainya ke /status/*. Hal ini memungkinkan aplikasi di semua namespace hanya menggunakan metode GET untuk mengakses path /status dari aplikasi httpbin di namespace foo.
Parameter | Deskripsi |
Name | Nama kebijakan otorisasi. |
Policy Type | Pilih ALLOW. |
Namespaces | Pada tab Workload Scope, atur Namespaces ke foo. |
Effective Scope | Pilih Service. |
Workload | Pilih httpbin. |
Request Matching Rules | Di bagian Add Request Target, konfigurasikan parameter berikut: |
Langkah 4: Periksa apakah kebijakan otorisasi yang mengontrol metode permintaan dan akses ke path tertentu dari workload berlaku
Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
Pada halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik .
Di bagian atas halaman Pods, atur Namespaces ke default. Temukan pod
sleepdan klik di kolom Actions.Jalankan perintah berikut di bagian Terminal kontainer sleep untuk mengakses path /status dari aplikasi HTTPBin menggunakan permintaan POST:
curl -I -X POST "httpbin.foo.svc.cluster.local:8000/status/200" -H "accept: text/plain"Kode 403 dikembalikan, yang menunjukkan bahwa permintaan ditolak.
Jalankan perintah berikut untuk mengakses path /IP dari aplikasi HTTPBin menggunakan permintaan GET:
curl -I -X GET "httpbin.foo.svc.cluster.local:8000/IP/200" -H "accept: text/plain"Kode 403 dikembalikan, yang menunjukkan bahwa permintaan ditolak.
Jalankan perintah berikut untuk mengakses path /status dari aplikasi HTTPBin menggunakan permintaan GET:
curl -I -X GET "httpbin.foo.svc.cluster.local:8000/status/200" -H "accept: text/plain"Output yang diharapkan:
HTTP/1.1 200 OK server: envoy date: Fri, 29 Apr 2022 03:01:16 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: 5Hasil ini menunjukkan bahwa aplikasi dalam namespace default hanya dapat mengakses path /status dari aplikasi HTTPBin menggunakan permintaan GET. Artinya, kebijakan otorisasi berlaku.
Contoh 3: Kontrol akses ke workload berdasarkan alamat IP klien
Anda dapat membuat kebijakan otorisasi yang hanya mengizinkan permintaan dari alamat IP klien yang sah untuk mengakses aplikasi HTTPBin di namespace foo.
Langkah 1: Aktifkan injeksi proxy sidecar otomatis untuk namespace foo
Buat namespace foo. Untuk informasi lebih lanjut, lihat Kelola namespace global.
Aktifkan injeksi proxy sidecar otomatis untuk namespace foo. Untuk informasi lebih lanjut, lihat Aktifkan injeksi proxy sidecar otomatis.
Langkah 2: Deploy gerbang masuk
-
Masuk ke Konsol ASM. Di panel navigasi kiri, pilih .
-
Pada halaman Mesh Management, klik nama instans ASM. Di panel navigasi kiri, pilih .
Pada halaman Ingress Gateway, klik Create, konfigurasikan parameter, lalu klik Create.
Parameter
Deskripsi
Name
Nama gerbang masuk.
Cluster
Kluster tempat Anda ingin mendeploy gerbang masuk.
SLB
Pilih Classic Load Balancer dan Public Access. Contoh ini menggunakan Classic Load Balancer, tetapi Anda juga dapat menggunakan Network Load Balancer.
Create SLB Instance
Instans load balancer yang ingin Anda gunakan. Anda dapat memilih instans load balancer dengan salah satu metode berikut:
Use Existing CLB Instance: Pilih load balancer yang sudah ada dari daftar.
Create SLB Instance: Klik Create SLB Instance dan pilih spesifikasi yang diinginkan dari daftar drop-down.
Port Mapping
Pilih Protocol dan masukkan Service Port sesuai kebutuhan.
External Traffic Policy
Klik Advanced Options dan atur External Traffic Policy ke Local.
Langkah 3: Buat layanan virtual dan gateway Istio
Gunakan konten berikut untuk membuat layanan virtual di namespace foo. Untuk informasi lebih lanjut, lihat Kelola layanan virtual.
apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: httpbin spec: gateways: - httpbin-gateway hosts: - '*' http: - match: - uri: prefix: /headers route: - destination: host: httpbin port: number: 8000Gunakan konten berikut untuk membuat gateway Istio di namespace foo. Untuk informasi lebih lanjut, lihat Kelola gateway Istio.
apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: httpbin-gateway spec: selector: istio: ingressgateway servers: - hosts: - '*' port: name: http number: 80 protocol: HTTP
Langkah 4: Buat kebijakan otorisasi
Dapatkan alamat IP gerbang masuk. Untuk informasi lebih lanjut, lihat Buat gerbang masuk.
Dapatkan alamat IP klien.
Masukkan http://{ASM Gateway IP}/headers di bilah alamat browser Anda untuk mendapatkan alamat IP untuk X-Envoy-External-Address. Di respons yang dikembalikan, field
X-Envoy-External-Addressadalah alamat IP eksternal asli klien.{ "headers": { "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,imag...", "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8", "Cache-Control": "max-age=0", "Host": "<IP address>", "Upgrade-Insecure-Requests": "1", "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.3...", "X-Envoy-Attempt-Count": "1", "X-Envoy-External-Address": "<Client external IP>", "X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/foo/sa/httpbin;Hash=e49...service-account" } }Buat kebijakan otorisasi.
-
Masuk ke Konsol ASM. Di panel navigasi kiri, pilih .
-
Pada halaman Mesh Management, klik nama instans ASM. Di panel navigasi kiri, pilih . Pada halaman yang muncul, klik Create.
Pada halaman Create, konfigurasikan parameter dan klik Create.
Parameter
Deskripsi
Name
Nama kebijakan otorisasi.
Policy Type
Pilih DENY.
Namespaces
Pada tab Workload Scope, atur Namespaces ke foo.
Effective Scope
Pilih Service.
Workload
Pilih httpbin.
Request Matching Rules
Di bagian Add Request Source, aktifkan sakelar RemoteIPBlocks dan atur nilainya ke alamat IP klien yang Anda peroleh di langkah sebelumnya. Hal ini mencegah alamat IP klien mengakses aplikasi
httpbin.
-
Langkah 5: Periksa apakah kebijakan otorisasi yang menolak permintaan dari alamat IP klien tertentu berlaku
Di browser Anda, buka http://{ASM gateway IP}/headers. Pesan RBAC: access denied dikembalikan, yang menunjukkan bahwa akses ke aplikasi httpbin gagal. Hal ini memverifikasi bahwa pembatasan berdasarkan alamat IP klien berlaku.
RBAC: access deniedContoh 4: Kontrol akses layanan lintas namespace
Langkah 1: Aktifkan injeksi proxy sidecar otomatis untuk namespace demo-frontend dan demo-server
Buat namespace demo-frontend dan demo-server. Untuk informasi lebih lanjut, lihat Buat namespace.
Aktifkan injeksi proxy sidecar otomatis untuk namespace demo-frontend dan demo-server. Untuk informasi lebih lanjut, lihat bagian "Aktifkan injeksi proxy sidecar otomatis" dalam topik Kelola namespace global.
Langkah 2: Deploy layanan uji
Buat layanan bernama sleep di namespace demo-frontend dan layanan bernama httpbin di namespace demo-server. Layanan sleep digunakan untuk mengirim permintaan guna mengakses layanan httpbin.
Buat layanan bernama sleep di namespace demo-frontend.
Buat file sleep.yaml yang berisi konten berikut:
Gunakan kubectl untuk terhubung ke kluster Container Service for Kubernetes (ACK) berdasarkan informasi dalam file kubeconfig, lalu jalankan perintah berikut untuk membuat layanan sleep:
kubectl apply -f sleep.yaml -n demo-frontend
Buat layanan bernama httpbin di namespace demo-server.
Buat file httpbin.yaml yang berisi konten berikut:
Gunakan kubectl untuk terhubung ke kluster ACK berdasarkan informasi dalam file kubeconfig, lalu jalankan perintah berikut untuk membuat layanan httpbin:
kubectl apply -f httpbin.yaml -n demo-server
Verifikasi bahwa proxy sidecar telah diinjeksikan ke pod tempat layanan sleep dan httpbin berada.
Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
Pada halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik .
Di bagian atas halaman Pods, pilih demo-frontend dari daftar drop-down Namespaces dan klik nama pod layanan
sleep.Di tab Containers, Anda dapat melihat kontainer istio-proxy. Hal ini menunjukkan bahwa injeksi sidecar untuk layanan
sleeptelah selesai.Di bagian atas halaman Pods, pilih demo-server dari daftar drop-down Namespaces dan klik nama pod layanan
httpbin.Di tab Containers, Anda dapat melihat kontainer istio-proxy. Hal ini menunjukkan bahwa injeksi sidecar untuk layanan
httpbintelah selesai.
Langkah 3: Buat kebijakan otorisasi untuk mengontrol akses layanan lintas namespace
Anda dapat membuat kebijakan otorisasi dan mengubah parameter action dalam kebijakan otorisasi untuk menolak atau mengizinkan permintaan akses dari layanan di namespace demo-frontend ke layanan di namespace demo-server. Dengan cara ini, Anda dapat mengontrol akses layanan lintas namespace.
Buat kebijakan otorisasi untuk menolak permintaan akses dari namespace demo-frontend ke namespace demo-server.
-
Masuk ke Konsol ASM. Di panel navigasi kiri, pilih .
-
Pada halaman Mesh Management, klik nama instans ASM. Di panel navigasi kiri, pilih . Pada halaman yang muncul, klik Create.
Konfigurasikan parameter kebijakan otorisasi dan klik Create.
Parameter
Deskripsi
Name
Nama kebijakan otorisasi.
Policy Type
Pilih DENY.
Namespaces
Pada tab Workload Scope, atur Namespaces ke
demo-server.Effective Scope
Pilih Namespace Scope.
Request Matching Rules
Di bagian Add Request Source, aktifkan sakelar Namespaces dan atur nilainya ke demo-frontend.
-
Akses layanan httpbin.
Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
Pada halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik .
Di bagian atas halaman Pods, pilih demo-frontend dari daftar drop-down Namespaces. Lalu, temukan pod
sleepdan klik di kolom Actions.Jalankan perintah berikut di terminal kontainer sleep untuk mengakses layanan httpbin:
curl -I httpbin.demo-server.svc.cluster.local:8000Output yang diharapkan:
HTTP/1.1 403 Forbidden content-length: 19 content-type: text/plain date: Wed, 11 Oct 2023 08:15:25 GMT server: envoy x-envoy-upstream-service-time: 4Output di atas menunjukkan bahwa layanan di namespace demo-frontend gagal mengakses layanan di namespace demo-server.
Ubah nilai parameter action dalam kebijakan otorisasi menjadi ALLOW untuk mengizinkan permintaan akses dari namespace demo-frontend ke namespace demo-server.
-
Masuk ke Konsol ASM. Di panel navigasi kiri, pilih .
-
Pada halaman Mesh Management, klik nama instans ASM. Di panel navigasi kiri, pilih .
Pada halaman AuthorizationPolicy, temukan kebijakan target dan klik View YAML di kolom Actions.
Di kotak dialog Edit, ubah nilai parameter
actionmenjadi ALLOW dan klik OK.
-
Jalankan perintah berikut di terminal kontainer sleep untuk mengakses layanan httpbin:
curl -I httpbin.demo-server.svc.cluster.local:8000Output yang diharapkan:
HTTP/1.1 200 OK server: envoy date: Wed, 11 Oct 2023 08:21:40 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: 13Output di atas menunjukkan bahwa layanan di namespace demo-frontend berhasil mengakses layanan di namespace demo-server.
Seperti yang terlihat, setelah kebijakan otorisasi dengan Action diatur ke Deny dibuat, layanan di namespace demo-frontend gagal mengakses layanan di namespace demo-server. Setelah Action kebijakan otorisasi diubah menjadi ALLOW, layanan di namespace demo-frontend dapat berhasil mengakses layanan di namespace demo-server. Hal ini menunjukkan bahwa kebijakan otorisasi berhasil mengontrol akses layanan lintas namespace.