Mengintegrasikan IAP dengan Cloud Service Mesh
Panduan ini menjelaskan cara mengintegrasikan Identity-Aware Proxy (IAP) dengan Cloud Service Mesh. Tujuan Integrasi IAP dengan Cloud Service Mesh memungkinkan Anda mengakses layanan dengan aman berdasarkan Prinsip BeyondCorp. IAP memverifikasi identitas pengguna dan konteks dari permintaan tersebut untuk menentukan apakah pengguna harus diizinkan untuk mengakses aplikasi atau resource Anda. Integrasi IAP dengan Cloud Service Mesh memberikan manfaat berikut:
Selesaikan kontrol akses kontekstual ke workload yang berjalan di Cloud Service Mesh. Anda dapat mengatur kebijakan akses berdasarkan atribut permintaan asal, seperti identitas pengguna, IP alamat, dan jenis perangkat. Anda dapat menggabungkan kebijakan akses dengan batasan berdasarkan nama host dan jalur URL permintaan.
Mengaktifkan dukungan untuk klaim kontekstual dalam otorisasi Cloud Service Mesh.
Akses yang skalabel, aman, dan sangat tersedia ke aplikasi Anda melalui Load balancer Google Cloud. Load balancing berperforma tinggi menyediakan fitur bawaan perlindungan terhadap serangan distributed denial-of-service (DDoS) dan dukungan terhadap pengalamatan IP anycast global.
Prasyarat
Ikuti langkah-langkah di artikel Menginstal alat dependen dan memvalidasi cluster menjadi:- Menginstal alat yang diperlukan
- Download
asmcli
- Memberikan izin admin cluster
- Memvalidasi project dan cluster
Selain itu, panduan ini mengasumsikan bahwa Anda telah:
Menyiapkan cluster dengan Anthos Service Mesh
Bagian ini menjelaskan cara menyiapkan integrasi IAP untuk penginstalan baru Cloud Service Mesh dan upgrade.
Penginstalan baru
Aktifkan
iap.googleapis.com
. Pada perintah berikut, gantiPROJECT_ID
dengan project yang akan Anda instal Cloud Service Mesh dalam:gcloud services enable \ --project=PROJECT_ID \ iap.googleapis.com
Cluster yang Anda update harus memiliki
--addons=HttpLoadBalancing
set opsi. Add-onHttpLoadBalancing
memungkinkan pemuatan HTTP (L7) pengontrol penyeimbang untuk cluster. Jalankan perintah berikut untuk mengupdate cluster dengan opsi yang diperlukan oleh Cloud Service Mesh. Kecuali Anda sudah menetapkan zona atau region default, Anda harus menyediakan region (--region=REGION) atau zona (--zone=ZONE) dalam perintah.gcloud container clusters update CLUSTER_NAME \ --project=PROJECT_ID \ --update-addons=HttpLoadBalancing=ENABLED
Secara default, file
iap-operator.yaml
menetapkan port 31223 sebagai status porta, dan porta 31224 yang ditetapkan sebagai porta http. Jika port 31223 sudah digunakan di cluster Anda, jalankan perintah berikut untuk menyetel port status lainnya:kpt cfg set asm gcloud.container.cluster.ingress.statusPort STATUS_PORT
Jika port 31224 sudah digunakan di cluster Anda, jalankan perintah berikut untuk menetapkan porta http lainnya:
kpt cfg set asm gcloud.container.cluster.ingress.httpPort HTTP_PORT
Ikuti langkah-langkah di Menginstal fitur default dan Mesh CA untuk menggunakan skrip yang disediakan Google untuk menginstal Cloud Service Mesh. Saat Anda menjalankan {i>script<i}, sertakan opsi berikut:
--option iap-operator
Contoh:
./asmcli install \ --project_id "PROJECT_ID" \ --cluster_name "CLUSTER_NAME" \ --cluster_location "CLUSTER_LOCATION" \ --fleet_id FLEET_PROJECT_ID \ --output_dir DIR_PATH \ --enable_all \ --option iap-operator
Saat Anda menginstal Cloud Service Mesh,
iap-operator.yaml
file menetapkan kolomtype
di layananistio-ingressgateway
menjadiNodePort
, yang mengonfigurasi gateway untuk membuka port tertentu di jaringan layanan. Dengan begitu, Anda dapat menyiapkan load balancer, yang merutekan lalu lintas yang dikirim ke nama domain Anda ke porta ini.Jika Anda menginstal Cloud Service Mesh terkelola, selesaikan juga langkah-langkah langkah-langkah berikut:
Menambahkan label revisi ke namespace
istio-system
.Unduh Spesifikasi layanan gateway masuk Istio untuk IAP dan beri nama
iap_operator.yaml
.Instal traffic masuk sebagai layanan NodePort. Untuk informasi selengkapnya, lihat Bermigrasi dari IstioOperator.
asmcli experimental mcp-migrate-check -f iap_operator.yaml istioctl install -f /asm-generated-configs/gateways-istiooperator/"GATEWAY_NAME".yaml
Setelah menginstal Cloud Service Mesh, kembali ke panduan ini dan lanjutkan dengan bagian berikutnya untuk menyiapkan integrasi dengan IAP.
Upgrade
Bagian ini membahas kasus penggunaan upgrade berikut:
Anda telah menyiapkan integrasi IAP dan mengupgrade Cloud Service Mesh. Dalam kasus ini, Anda sudah mengaktifkan
iap.googleapis.com
di project Anda dan add-onHttpLoadBalancing
pada cluster Anda. Lanjutkan ke langkah 3, untuk mendownload paketasm
dan upgrade Cloud Service Mesh.Anda mengupgrade Cloud Service Mesh dan ingin menyiapkan integrasi dengan pembelian dalam aplikasi (IAP) untuk pertama kalinya. Dalam hal ini, Anda harus menyelesaikan semua langkah berikut, upgrade Cloud Service Mesh, dan kembali ke panduan ini setelah upgrade untuk menyelesaikan integrasi.
Aktifkan
iap.googleapis.com
. Pada perintah berikut, gantiPROJECT_ID
dengan project yang akan Anda instal dan Cloud Service Mesh.gcloud services enable \ --project=PROJECT_ID \ iap.googleapis.com
Cluster yang Anda update harus memiliki
--addons=HttpLoadBalancing
set opsi. Add-onHttpLoadBalancing
memungkinkan pemuatan HTTP (L7) pengontrol penyeimbang untuk cluster. Jalankan perintah berikut untuk mengupdate cluster dengan opsi yang diperlukan oleh Cloud Service Mesh. Kecuali Anda sudah menetapkan zona atau region default, Anda harus menyediakan region (--region=REGION) atau zona (--zone=ZONE) dalam perintah.gcloud container clusters update CLUSTER_NAME \ --project=PROJECT_ID --update-addons=HttpLoadBalancing=ENABLED
Jika Anda mengupdate Cloud Load Balancer HTTP yang ada dan berfungsi, jalankan hal berikut untuk mempertahankan port http dan status yang ada:
kpt cfg set asm gcloud.container.cluster.ingress.httpPort $(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
kpt cfg set asm gcloud.container.cluster.ingress.statusPort $(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="status-port")].nodePort}')
Ikuti langkah-langkah di Mengupgrade Mesh Layanan Cloud untuk menggunakan skrip yang disediakan Google guna mengupgrade Cloud Service Mesh.
Saat Anda mengupgrade Cloud Service Mesh, file
iap-operator.yaml
menetapkan Kolomtype
pada layananistio-ingressgateway
keNodePort
, yang mengonfigurasi gateway untuk membuka porta tertentu pada mesh layanan. Ini Anda dapat menyiapkan load balancer, yang merutekan traffic ke nama domain Anda ke porta ini.Secara default, file
iap-operator.yaml
menetapkan port 31223 sebagai status porta, dan porta 31224 yang ditetapkan sebagai porta http.Saat Anda menjalankan skrip, sertakan opsi berikut:
--option iap-operator
Contoh:
./asmcli install \ --project_id "PROJECT_ID" \ --cluster_name "CLUSTER_NAME" \ --cluster_location "CLUSTER_LOCATION" \ --fleet_id FLEET_PROJECT_ID \ --output_dir DIR_PATH \ --enable_all \ --option iap-operator
Selesaikan upgrade dengan memicu injeksi proxy file bantuan otomatis di workload Anda. Untuk mengetahui detailnya, lihat Men-deploy dan men-deploy ulang workload.
Setelah menyelesaikan upgrade, kembali ke panduan ini dan lanjutkan dengan bagian berikutnya untuk menyiapkan integrasi dengan IAP.
Melakukan reservasi alamat IP statis dan mengonfigurasi DNS
Untuk mengintegrasikan Identity-Aware Proxy dengan Cloud Service Mesh, Anda harus menyiapkan Load balancer HTTP(S) Google Cloud, yang memerlukan nama domain yang menunjuk ke alamat IP statis. Anda dapat memesan alamat IP eksternal statis, yang menetapkan alamat ke project Anda tanpa batas waktu sampai Anda secara eksplisit melepaskannya.
Mencadangkan alamat IP eksternal statis:
gcloud compute addresses create example-static-ip --global
Dapatkan alamat IP statis:
gcloud compute addresses describe example-static-ip --global
Di registrar nama domain, konfigurasi nama domain yang sepenuhnya memenuhi syarat (FQDN) dengan alamat IP statis. Biasanya, Anda menambahkan data
A
ke Setelan DNS. Langkah-langkah konfigurasi dan terminologi untuk menambahkanA
untuk FQDN bervariasi tergantung pada pencatatan nama domain Anda.Diperlukan waktu 24 hingga 48 jam untuk menerapkan setelan DNS. Anda dapat lanjutkan menyiapkan semuanya dalam panduan ini, tetapi Anda tidak akan dapat menguji penyiapan sampai setelan DNS diterapkan.
Men-deploy aplikasi contoh
Sebelum mengaktifkan IAP, Anda perlu menjalankan aplikasi di ke cluster GKE Anda sehingga Anda dapat memverifikasi bahwa semua permintaan memiliki identitas Anda. Panduan ini menggunakan contoh Bookinfo untuk menunjukkan cara menyiapkan Load balancer HTTP(S) dan mengaktifkan IAP.
Ikuti langkah-langkah untuk men-deploy Bookinfo. Sampai Anda men-deploy load balancer, aplikasi Bookinfo tidak dapat diakses di luar dari cluster GKE Anda (misalnya dari browser).
Permintaan eksternal
Resource Gateway Bookinfo (ditentukan di
samples/bookinfo/networking/bookinfo-gateway.yaml
) menggunakan konfigurasi
istio-ingressgateway
.
Ingat bahwa saat men-deploy Cloud Service Mesh, Anda menentukan NodePort
untuk
istio-ingressgateway
, yang membuka port tertentu pada mesh layanan.
Meskipun node dalam cluster Anda memiliki alamat IP eksternal, permintaan akan datang
dari luar cluster Anda akan diblokir oleh aturan firewall Google Cloud. Dengan
IAP, cara benar untuk mengekspos aplikasi ke publik
internet adalah dengan menggunakan load balancer. Jangan perlihatkan alamat node menggunakan
aturan {i>firewall<i}, yang akan melewati IAP.
Untuk merutekan permintaan ke Bookinfo, Anda menyiapkan load balancer HTTP(S) di project Google Cloud Anda. Karena load balancer ada di project Anda, di dalam firewall dan dapat mengakses node di cluster Anda. Setelah Anda mengonfigurasi load balancer dengan alamat IP statis dan nama domain, Anda dapat mengirim permintaan ke nama domain, dan load balancer meneruskan ke node dalam cluster.
Mengaktifkan IAP
Langkah-langkah berikut menjelaskan cara mengaktifkan IAP.
Gunakan client ID (
CLIENT_ID
pada langkah di atas) danCLIENT_SECRET
untuk mengaktifkan Cloud Service Mesh. Membuat rahasia kubernetes menggunakan material dari Klien OAuth Anda:kubectl create secret generic -n istio-system my-secret --from-literal=client_id=CLIENT_ID \ --from-literal=client_secret=CLIENT_SECRET
Men-deploy load balancer
Anda dapat menggunakan Resource masuk untuk membuat Load balancer HTTP(S) dengan konfigurasi otomatis Sertifikat SSL. Sertifikat SSL terkelola adalah disediakan, diperpanjang, dan dikelola untuk domain Anda.
Buat resource ManagedCertificate. Sumber daya ini menentukan domain untuk sertifikat SSL. Daftar
spec.domains
hanya boleh berisi satu domain. Domain karakter pengganti tidak didukung. Pada YAML berikut, gantiDOMAIN_NAME
dengan nama domain yang Anda konfigurasi untuk alamat IP statis eksternal.cat <<EOF | kubectl apply -f - apiVersion: networking.gke.io/v1 kind: ManagedCertificate metadata: name: example-certificate namespace: istio-system spec: domains: - DOMAIN_NAME EOF
Membuat resource BackendConfig. Sumber daya ini menginstruksikan GCLB cara melakukan Health Check di Gateway Ingress, serta mengonfigurasi Identity-Aware {i>Proxy<i}. Pertama, kumpulkan beberapa nilai dari Gateway Ingress tentang kesehatan pemeriksaan:
Port masuk health check: Ini adalah port health check dari istio-ingress.
export HC_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="status-port")].nodePort}')
Jalur masuk health check: Ini adalah jalur health check istio-ingress.
export HC_INGRESS_PATH=$(kubectl get pods -n istio-system -l app=istio-ingressgateway -o jsonpath='{.items[0].spec.containers[?(@.name=="istio-proxy")].readinessProbe.httpGet.path}')
cat <<EOF | kubectl apply -n istio-system -f - apiVersion: cloud.google.com/v1 kind: BackendConfig metadata: name: http-hc-config spec: healthCheck: checkIntervalSec: 2 timeoutSec: 1 healthyThreshold: 1 unhealthyThreshold: 10 port: ${HC_INGRESS_PORT} type: HTTP requestPath: ${HC_INGRESS_PATH} iap: enabled: true oauthclientCredentials: secretName: my-secret EOF
Anotasi layanan masuk dengan BackendConfig.
kubectl annotate -n istio-system service/istio-ingressgateway --overwrite \ cloud.google.com/backend-config='{"default": "http-hc-config"}' \ cloud.google.com/neg='{"ingress":false}'
Buat load balancer dengan menentukan resource Ingress.
Setel anotasi
networking.gke.io/managed-certificates
ke nama dari sertifikat yang Anda buat pada langkah sebelumnya,example-certificate
.Setel anotasi
kubernetes.io/ingress.global-static-ip-name
ke nama alamat IP statis yang Anda pesan,example-static-ip
.Setel
serviceName
keistio-ingressgateway
, yang digunakan di sumber daya {i>Gateway<i} untuk contoh Bookinfo.
cat <<EOF | kubectl apply -f - apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress namespace: istio-system annotations: kubernetes.io/ingress.global-static-ip-name: example-static-ip networking.gke.io/managed-certificates: example-certificate spec: defaultBackend: service: name: istio-ingressgateway port: number: 80 EOF
Di Konsol Google Cloud, buka Kubernetes Engine > Layanan & Ingress.
Anda akan melihat tombol "Membuat traffic masuk" di kolom Status. Tunggu hingga GKE menyediakan Ingress sepenuhnya sebelum melanjutkan. Muat ulang halaman setiap beberapa menit untuk mendapatkan informasi terbaru status Ingress Anda. Setelah Ingress disediakan, Anda mungkin melihat "Oke" atau pesan error "All backend services are in UNHEALTHY state". Salah satu resource yang disediakan GKE adalah respons default . Jika Anda melihat pesan {i>error<i}, yang menunjukkan bahwa Ingress dan bahwa health check default berjalan. Jika Anda melihat "Oke" atau error, lanjutkan ke bagian berikutnya untuk mengonfigurasi health check untuk load balancer.
Mengonfigurasi daftar akses IAP
Tambahkan pengguna ke kebijakan akses untuk IAP:
gcloud beta iap web add-iam-policy-binding \ --member=user:EMAIL_ADDRESS \ --role=roles/iap.httpsResourceAccessor
dengan EMAIL_ADDRESS
adalah alamat email lengkap pengguna
seperti alice@example.com
.
Menguji load balancer. Arahkan browser Anda ke:
http://DOMAIN_NAME/productpage
dengan
DOMAIN_NAME
adalah nama domain yang Anda dengan alamat IP statis eksternal.Anda akan melihat
productpage
aplikasi Bookinfo. Jika Anda memuat ulang beberapa kali, Anda akan melihat versi ulasan yang berbeda, yang ditampilkan dengan gaya round robin: bintang merah, bintang hitam, tanpa bintang.Anda juga harus menguji akses
https
ke Bookinfo.
Mengaktifkan dukungan RCToken pada mesh layanan
Secara default, IAP menghasilkan Token Web JSON (JWT) yang dicakupkan ke klien OAuth. Untuk Cloud Service Mesh, Anda dapat mengonfigurasi IAP untuk menghasilkan RequestContextToken (RCToken), yang merupakan JWT tetapi dengan audiens yang dapat dikonfigurasi. Dengan RCToken, Anda dapat mengkonfigurasi audiens JWT ke string arbitrer, yang dapat digunakan dalam kebijakan Cloud Service Mesh untuk otorisasi terperinci.
Untuk mengonfigurasi RCToken:
Buat variabel lingkungan untuk audiens RCToken. Dapat berupa {i>string<i} apa pun yang Anda inginkan.
export RCTOKEN_AUD="your-rctoken-aud"
Opsional: Langkah berikut memerlukan
BACKEND_SERVICE_ID
. Jika Anda perlu mengetahuiBACKEND_SERVICE_ID
, jalankan perintah berikut:kubectl -n istio-system get Ingress example-ingress -o json | jq \ '.metadata.annotations."ingress.kubernetes.io/backends"'
Output yang diharapkan mirip dengan
"{\"BACKEND_SERVICE_ID\":\"HEALTHY\"}"
. Misalnya,"ingress.kubernetes.io/backends": "{\"k8s-be-31224--51f3b55cd1457fb6\":\"HEALTHY\"}"
.BACKEND_SERVICE_ID
dalam contoh ini adalahk8s-be-31224--51f3b55cd1457fb6
.Ambil setelan IAP yang ada.
gcloud iap settings get --format json \ --project=${PROJECT_ID} --resource-type=compute --service=BACKEND_SERVICE_ID > iapSettings.json
Update
IapSettings
dengan audiens RCToken.cat iapSettings.json | jq --arg RCTOKEN_AUD_STR $RCTOKEN_AUD \ '. + {applicationSettings: {csmSettings: {rctokenAud: $RCTOKEN_AUD_STR}}}' \ > updatedIapSettings.json
gcloud iap settings set updatedIapSettings.json --format json \ --project=${PROJECT_ID} --resource-type=compute --service=BACKEND_SERVICE_ID
Aktifkan autentikasi RCToken di gateway masuk Istio.
cat <<EOF | kubectl apply -f - apiVersion: "security.istio.io/v1beta1" kind: "RequestAuthentication" metadata: name: "ingressgateway-jwt-policy" namespace: "istio-system" spec: selector: matchLabels: app: istio-ingressgateway jwtRules: - issuer: "https://cloud.google.com/iap" jwksUri: "https://www.gstatic.com/iap/verify/public_key-jwk" audiences: - $RCTOKEN_AUD fromHeaders: - name: ingress-authorization prefix: "Istio " outputPayloadToHeader: "verified-jwt" forwardOriginalToken: true EOF
Opsional: Pastikan permintaan yang tidak memiliki JWT yang valid akan ditolak:
cat <<EOF | kubectl apply -f - apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: iap-gateway-require-jwt namespace: istio-system spec: selector: matchLabels: app: istio-iap-ingressgateway action: DENY rules: - from: - source: notRequestPrincipals: ["*"] EOF
Pastikan permintaan ke Bookinfo
productpage
masih berhasil:http://DOMAIN_NAME/productpage
Untuk menguji kebijakan:
Membuat permintaan
IapSettings
tetapi setelrctokenAud
ke string yang berbeda:cat iapSettings.json | jq --arg RCTOKEN_AUD_STR wrong-rctoken-aud \ '. + {applicationSettings: {csmSettings: {rctokenAud: $RCTOKEN_AUD_STR}}}' \ > wrongIapSettings.json
Panggil
IapSettings
API untuk menetapkan audiens RCtoken.gcloud beta iap settings set wrongIapSettings.json --project=PROJECT_ID --resource-type=compute --service=BACKEND_SERVICE
Buat permintaan ke Bookinfo
productpage
dan permintaan itu akan gagal:http://DOMAIN_NAME/productpage
Pembersihan
Setelah menyelesaikan tutorial ini, hapus referensi berikut untuk mencegah tagihan tidak diinginkan yang timbul di akun Anda:
Hapus sertifikat yang dikelola:
kubectl delete managedcertificates example-certificate
Hapus Ingress, yang membatalkan alokasi resource load balancing:
kubectl -n istio-system delete ingress example-ingress
Hapus alamat IP statis:
gcloud compute addresses delete example-static-ip --global
Jika Anda melakukannya, pastikan untuk menghapus alamat IP dari registrar domain.
Hapus cluster, yang akan menghapus resource yang membentuk seperti instance compute, disk, dan resource jaringan:
gcloud container clusters delete CLUSTER_NAME