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 adalah layanan yang mereka klaim?
Otorisasi memverifikasi izin - apakah layanan ini diizinkan untuk melakukan hal tersebut?
Identitas adalah hal mendasar dalam konsep ini. Dengan Cloud Service Mesh, AuthorizationPolicies memungkinkan komunikasi workload-ke-workload di mesh Anda dikontrol untuk meningkatkan keamanan dan akses.
Dalam arsitektur microservice, tempat panggilan dilakukan di seluruh batas jaringan, aturan firewall berbasis IP sering kali tidak memadai untuk mengamankan akses antar-workload. Dengan Cloud Service Mesh, Anda dapat menetapkan aturan otorisasi untuk:
- Mengontrol akses ke workload dalam mesh Anda, baik workload-ke-workload maupun pengguna akhir-ke-workload
- Menentukan kebijakan secara luas atau mendetail, bergantung pada kebutuhan Anda.
Untuk melihat penjelasan mendalam tentang cara mengonfigurasi kebijakan dan praktik terbaik, lihat Otorisasi dengan Cloud Service Mesh.
Biaya
Tutorial ini menggunakan komponen yang dapat ditagih berikut: Google Cloud
Setelah menyelesaikan tutorial ini, Anda dapat menghindari biaya berkelanjutan dengan menghapus resource yang Anda buat. Untuk mengetahui informasi selengkapnya, lihat Pembersihan.
Sebelum memulai
Pastikan penagihan diaktifkan untuk project Anda.
Sediakan Cloud Service Mesh di cluster GKE. Ada berbagai metode penyiapan yang didukung:
Meng-clone repo:
git clone https://github.com/GoogleCloudPlatform/anthos-service-mesh-samples cd anthos-service-mesh-samples
Men-deploy gateway masuk
Tetapkan konteks saat ini untuk
kubectlke cluster:gcloud container clusters get-credentials CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATIONBuat namespace untuk gateway masuk Anda:
kubectl create namespace asm-ingressAktifkan namespace untuk injeksi. Langkah-langkahnya bergantung pada penerapan bidang kontrol Anda.
Terkelola (TD)
Terapkan label injeksi default ke namespace:
kubectl label namespace asm-ingress \ istio.io/rev- istio-injection=enabled --overwriteTerkelola (Istiod)
Direkomendasikan: Jalankan perintah berikut untuk menerapkan label injeksi default ke namespace:
kubectl label namespace asm-ingress \ istio.io/rev- istio-injection=enabled --overwriteJika Anda adalah pengguna yang sudah ada dengan bidang kontrol Istiod Terkelola: 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 controlplanerevisionOutputnya mirip dengan hal berikut ini:
NAME AGE asm-managed-rapid 6d7hDalam output, nilai di kolom
NAMEadalah 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 --overwriteSebaiknya gunakan injeksi default, tetapi injeksi 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_LABELadalah nilai label revisiistiodyang Anda catat pada langkah sebelumnya.kubectl label namespace asm-ingress \ istio-injection- istio.io/rev=REVISION_LABEL --overwrite
Deploy gateway contoh di repositori
anthos-service-mesh-samples:kubectl apply -n asm-ingress \ -f docs/shared/asm-ingress-gatewayOutput yang diharapkan:
serviceaccount/asm-ingressgateway configured service/asm-ingressgateway configured deployment.apps/asm-ingressgateway configured gateway.networking.istio.io/asm-ingressgateway configured
Men-deploy aplikasi contoh Butik Online
Jika belum, tetapkan konteks saat ini untuk
kubectlke cluster:gcloud container clusters get-credentials CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATIONBuat namespace untuk aplikasi contoh:
kubectl create namespace onlineboutiqueBeri label namespace
onlineboutiqueuntuk otomatis memasukkan proxy Envoy:kubectl label namespace onlineboutique \ istio.io/rev- istio-injection=enabled --overwriteDeploy aplikasi contoh,
VirtualServiceuntuk frontend, dan akun layanan untuk workload. Untuk tutorial ini, Anda akan men-deploy Butik Online, aplikasi demo microservice.kubectl apply \ -n onlineboutique \ -f docs/shared/online-boutique/virtual-service.yamlkubectl apply \ -n onlineboutique \ -f docs/shared/online-boutique/service-accounts
Melihat layanan Anda
Lihat pod di namespace
onlineboutique:kubectl get pods -n onlineboutiqueOutput 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 2m7sSemua pod untuk aplikasi Anda harus aktif dan berjalan, dengan
2/2di kolomREADY. Hal ini menunjukkan bahwa pod memiliki proxy sidecar Envoy yang berhasil dimasukkan. Jika tidak menampilkan2/2setelah 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 27mBuka alamat
EXTERNAL-IPdi browser web Anda. Anda akan melihat toko Butik Online di browser Anda.
Otorisasi DenyAll untuk workload
Bagian ini menambahkan AuthorizationPolicy untuk menolak semua traffic masuk ke layanan mata uang. AuthorizationPolicies berfungsi dengan mengubah AuthorizationPolicies menjadi konfigurasi yang dapat dibaca Envoy, dan menerapkan konfigurasi ke proxy sidecar Anda. Hal ini memungkinkan proxy Envoy mengotorisasi atau menolak permintaan masuk ke layanan.
Terapkan
AuthorizationPolicykecurrencyservice. Perhatikan kecocokan pada labelcurrencyservicedalam file YAML.kubectl apply -f docs/authorization/currency-deny-all.yaml -n onlineboutiqueCoba akses
EXTERNAL-IPgateway 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
currencyserviceAnda: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 ke dalam log:
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: traceGunakan
curluntuk mengirim traffic keEXTERNAL_IPAnda guna membuat log:for i in {0..10}; do curl -s -I $FRONTEND_IP ; doneLihat log terkait kontrol akses berbasis peran (RBAC) di istio-proxy Anda:
kubectl logs -n onlineboutique $CURRENCY_POD -c istio-proxy | grep -m5 rbacOutput 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 ditetapkan untuk memblokir permintaan masuk.
Mengizinkan Akses Terbatas
Daripada kebijakan DENYALL, Anda dapat menetapkan akses untuk diizinkan bagi workload tertentu. Hal ini akan relevan dalam arsitektur microservice tempat Anda ingin memastikan bahwa hanya layanan yang diotorisasi yang dapat berkomunikasi satu sama lain.
Di bagian ini, Anda akan mengaktifkan layanan frontend dan checkout untuk dapat 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 onlineboutiqueBuka
EXTERNAL-IPdi browser web Anda, dan sekarang Anda akan dapat mengakses Butik Online.
Pembersihan
Agar tidak perlu membayar biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource tersebut, atau simpan project dan hapus setiap resource.
Agar tidak dikenakan biaya berkelanjutan pada Google Cloud akun Anda untuk resource yang digunakan dalam tutorial ini, Anda dapat menghapus project atau menghapus setiap resource.
Menghapus project
Di Cloud Shell, hapus project:
gcloud projects delete PROJECT_ID
Menghapus resource
Jika Anda ingin menyimpan cluster dan menghapus contoh Butik Online:
Hapus namespace aplikasi:
kubectl delete namespace onlineboutiqueOutput yang diharapkan:
namespace "onlineboutique" deletedHapus namespace Gateway Ingress:
kubectl delete namespace asm-ingressOutput yang diharapkan:
namespace "asm-ingress" deleted
Jika Anda ingin mencegah biaya tambahan, hapus cluster:
gcloud container clusters delete CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATION
Langkah berikutnya
- Untuk panduan umum tentang cara mengonfigurasi
PeerAuthenticationkebijakan, lihat Mengonfigurasi keamanan transportasi. - Jelajahi dasbor keamanan mesh Anda dengan Memantau keamanan mesh.
- Pelajari kebijakan otorisasi secara mendalam dengan Mengonfigurasi fitur lanjutan kebijakan otorisasi.
- Pahami praktik terbaik keamanan Cloud Service Mesh.