Dalam tutorial ini, Anda akan mempelajari apa itu otorisasi, dan cara mengaktifkannya dengan Cloud Service Mesh di aplikasi contoh untuk mempelajari cara mengaktifkan kebijakan otorisasi ke microservice Anda. Anda akan membuat
AuthorizationPolicy
untuk DENY
akses ke microservice, lalu membuat
AuthorizationPolicy
untuk ALLOW
akses tertentu ke microservice.
Apa yang dimaksud dengan otorisasi?
Autentikasi memverifikasi identitas -- apakah layanan ini sesuai dengan yang diklaim?
Otorisasi memverifikasi izin - apakah layanan ini diizinkan untuk melakukannya?
Identitas adalah hal mendasar dalam ide ini. Dengan Cloud Service Mesh, komunikasi workload-ke-workload di mesh Anda dapat dikontrol untuk meningkatkan keamanan dan akses.AuthorizationPolicies
Dalam arsitektur microservice, tempat panggilan dilakukan di seluruh batas jaringan, aturan firewall berbasis IP sering kali tidak memadai untuk mengamankan akses antar-beban kerja. Dengan Cloud Service Mesh, Anda dapat menetapkan aturan otorisasi untuk:
- Mengontrol akses ke workload dalam mesh Anda, baik workload-ke-workload atau pengguna akhir-ke-workload
- Tentukan kebijakan secara luas atau terperinci, bergantung pada kebutuhan Anda.
Untuk melihat penjelasan mendalam tentang cara mengonfigurasi kebijakan dan praktik terbaik, lihat Otorisasi dengan Cloud Service Mesh.
Men-deploy gateway masuk
Tetapkan konteks saat ini untuk
kubectl
ke cluster:gcloud container clusters get-credentials CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATION
Buat namespace untuk gateway masuk Anda:
kubectl create namespace asm-ingress
Aktifkan namespace untuk injeksi. Langkah-langkahnya bergantung pada implementasi bidang kontrol Anda.
Terkelola (TD)
Terapkan label injeksi default ke namespace:
kubectl label namespace asm-ingress \ istio.io/rev- istio-injection=enabled --overwrite
Dikelola (Istiod)
Direkomendasikan: Jalankan perintah berikut untuk menerapkan label injeksi default ke namespace:
kubectl label namespace asm-ingress \ istio.io/rev- istio-injection=enabled --overwrite
Jika Anda adalah pengguna lama dengan Managed Istiod control plane: Sebaiknya gunakan injeksi default, tetapi injeksi berbasis revisi didukung. Gunakan petunjuk berikut:
Jalankan perintah berikut untuk menemukan saluran rilis yang tersedia:
kubectl -n istio-system get controlplanerevision
Outputnya mirip dengan hal berikut ini:
NAME AGE asm-managed-rapid 6d7h
Dalam output, nilai di kolom
NAME
adalah label revisi yang sesuai dengan saluran rilis yang tersedia untuk versi Cloud Service Mesh.Terapkan label revisi ke namespace:
kubectl label namespace asm-ingress \ istio-injection- istio.io/rev=REVISION_LABEL --overwrite
Dalam cluster
Direkomendasikan: Jalankan perintah berikut untuk menerapkan label injeksi default ke namespace:
kubectl label namespace asm-ingress \ istio.io/rev- istio-injection=enabled --overwrite
Sebaiknya gunakan penyisipan default, tetapi penyisipan berbasis revisi didukung: Gunakan petunjuk berikut:
Gunakan perintah berikut untuk menemukan label revisi di
istiod
:kubectl get deploy -n istio-system -l app=istiod -o \ jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'
Terapkan label revisi ke namespace. Dalam perintah berikut,
REVISION_LABEL
adalah nilai label revisiistiod
yang Anda catat di langkah sebelumnya.kubectl label namespace asm-ingress \ istio-injection- istio.io/rev=REVISION_LABEL --overwrite
Deploy gateway contoh di repo
anthos-service-mesh-samples
:kubectl apply -n asm-ingress \ -f docs/shared/asm-ingress-gateway
Output yang diharapkan:
serviceaccount/asm-ingressgateway configured service/asm-ingressgateway configured deployment.apps/asm-ingressgateway configured gateway.networking.istio.io/asm-ingressgateway configured
Men-deploy contoh aplikasi Butik Online
Jika belum, tetapkan konteks saat ini untuk
kubectl
ke cluster:gcloud container clusters get-credentials CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATION
Buat namespace untuk aplikasi contoh:
kubectl create namespace onlineboutique
Beri label pada namespace
onlineboutique
untuk otomatis memasukkan proxy Envoy. Ikuti langkah-langkah untuk mengaktifkan injeksi sidecar otomatis.Deploy aplikasi contoh,
VirtualService
untuk frontend, dan akun layanan untuk workload. Untuk tutorial ini, Anda akan men-deploy Online Boutique, aplikasi demo microservice.kubectl apply \ -n onlineboutique \ -f docs/shared/online-boutique/virtual-service.yaml kubectl apply \ -n onlineboutique \ -f docs/shared/online-boutique/service-accounts
Melihat layanan Anda
Lihat pod di namespace
onlineboutique
:kubectl get pods -n onlineboutique
Output yang diharapkan:
NAME READY STATUS RESTARTS AGE adservice-85598d856b-m84m6 2/2 Running 0 2m7s cartservice-c77f6b866-m67vd 2/2 Running 0 2m8s checkoutservice-654c47f4b6-hqtqr 2/2 Running 0 2m10s currencyservice-59bc889674-jhk8z 2/2 Running 0 2m8s emailservice-5b9fff7cb8-8nqwz 2/2 Running 0 2m10s frontend-77b88cc7cb-mr4rp 2/2 Running 0 2m9s loadgenerator-6958f5bc8b-55q7w 2/2 Running 0 2m8s paymentservice-68dd9755bb-2jmb7 2/2 Running 0 2m9s productcatalogservice-84f95c95ff-c5kl6 2/2 Running 0 114s recommendationservice-64dc9dfbc8-xfs2t 2/2 Running 0 2m9s redis-cart-5b569cd47-cc2qd 2/2 Running 0 2m7s shippingservice-5488d5b6cb-lfhtt 2/2 Running 0 2m7s
Semua pod untuk aplikasi Anda harus aktif dan berjalan, dengan
2/2
di kolomREADY
. Hal ini menunjukkan bahwa proxy file bantuan Envoy telah berhasil disuntikkan ke pod. Jika2/2
tidak muncul setelah beberapa menit, buka Panduan pemecahan masalah.Dapatkan IP eksternal, dan tetapkan ke variabel:
kubectl get services -n asm-ingress export FRONTEND_IP=$(kubectl --namespace asm-ingress \ get service --output jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}' \ )
Anda akan melihat output yang mirip dengan berikut ini:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE asm-ingressgateway LoadBalancer 10.19.247.233 35.239.7.64 80:31380/TCP,443:31390/TCP,31400:31400/TCP 27m
Buka alamat
EXTERNAL-IP
di browser web Anda. Anda akan melihat toko Online Boutique di browser Anda.
Otorisasi DenyAll untuk beban kerja
Bagian ini menambahkan AuthorizationPolicy
untuk menolak semua traffic masuk ke
layanan mata uang. AuthorizationPolicies
bekerja dengan mengubah
AuthorizationPolicies
menjadi konfigurasi yang dapat dibaca Envoy, dan menerapkan konfigurasi ke
proxy sidecar Anda. Hal ini memungkinkan proxy Envoy mengizinkan atau menolak permintaan masuk ke layanan.
Terapkan
AuthorizationPolicy
kecurrencyservice
. Perhatikan kecocokan pada labelcurrencyservice
dalam file YAML.kubectl apply -f docs/authorization/currency-deny-all.yaml -n onlineboutique
Coba akses
EXTERNAL-IP
gateway Anda untuk melihat Butik Online di browser web. Anda akan melihat error otorisasi (500 Internal Service Error) daricurrency service
.
Mengamati log proxy sidecar
Untuk melihat apa yang terjadi di proxy sidecar, Anda dapat meninjau log di pod.
Dapatkan nama pod
currencyservice
Anda:CURRENCY_POD=$(kubectl get pod -n onlineboutique |grep currency|awk '{print $1}')
Tetapkan proxy Envoy untuk mengizinkan log tingkat pelacakan. Secara default, panggilan otorisasi yang diblokir tidak dicatat:
kubectl debug --image istio/base --target istio-proxy -it $CURRENCY_POD -n onlineboutique -- curl -X POST "http://localhost:15000/logging?level=trace"
Output yang diharapkan:
none {:.devsite-disable-click-to-copy} active loggers: admin: trace alternate_protocols_cache: trace ... tracing: trace upstream: trace udp: trace wasm: trace
Gunakan
curl
untuk mengirim traffic keEXTERNAL_IP
Anda guna membuat log:for i in {0..10}; do curl -s -I $FRONTEND_IP ; done
Melihat log terkait role-based access control (RBAC) di istio-proxy Anda:
kubectl logs -n onlineboutique $CURRENCY_POD -c istio-proxy | grep -m5 rbac
Output yang diharapkan:
2022-07-08T14:19:20.442920Z debug envoy rbac checking request: requestedServerName: outbound_.7000_._.currencyservice.onlineboutique.svc.cluster.local, sourceIP: 10.8.8.5:34080, directRemoteIP: 10.8.8.5:34080, remoteIP: 10.8.8.5:34080,localAddress: 10.8.0.6:7000, ssl: uriSanPeerCertificate: spiffe://christineskim-tf-asm.svc.id.goog/ns/onlineboutique/sa/default, dnsSanPeerCertificate: , subjectPeerCertificate: OU=istio_v1_cloud_workload,O=Google LLC,L=Mountain View,ST=California,C=US, headers: ':method', 'POST' 2022-07-08T14:19:20.442944Z debug envoy rbac enforced denied, matched policy none 2022-07-08T14:19:20.442965Z debug envoy http [C73987][S13078781800499437460] Sending local reply with details rbac_access_denied_matched_policy[none] ```
Anda akan melihat pesan enforced denied
di log, yang menunjukkan bahwa
currencyservice
disetel untuk memblokir permintaan masuk.
Mengizinkan Akses Terbatas
Daripada kebijakan DENYALL
, Anda dapat menetapkan akses agar diizinkan untuk workload tertentu. Hal ini akan relevan dalam arsitektur microservice di mana Anda ingin
memastikan bahwa hanya layanan yang diberi otorisasi yang dapat berkomunikasi satu sama lain.
Di bagian ini, Anda akan mengaktifkan kemampuan layanan frontend
dan checkout
untuk berkomunikasi dengan layanan currency
.
- Dalam file berikut, lihat bahwa
source.principal
(klien) tertentu diizinkan untuk mengaksescurrencyservice
:
Terapkan kebijakan:
kubectl apply -f docs/authorization/currency-allow-frontend-checkout.yaml -n onlineboutique
Buka
EXTERNAL-IP
di browser web Anda, dan sekarang Anda seharusnya dapat mengakses Online Boutique.