Bu konu, Alibaba Cloud Service Mesh (ASM) içindeki JSON Web Token (JWT) kimlik doğrulamasıyla ilgili sıkça sorulan soruları yanıtlar. Yanıtlar arasında JWT algoritma desteği, küme içi ve dışındaki hizmetler için JwksUri yapılandırması ve yol düzeyinde kimlik doğrulama hariç tutma yer alır.
Önkoşullar
Bir ASM örneği oluşturun.
JwksUri ile ilgili yapılandırmalar için ASM 1,13 veya sonraki bir sürüm gereklidir.
kubectlkomutlarını çalıştırmak üzere veri düzlemi kümesi için bir kubeconfig dosyası yapılandırın.
ASM hangi JWT algoritmalarını destekler?
1,13'ten önceki ASM sürümleri yalnızca RSA algoritmasını destekler.
ASM 1,13 ve sonraki sürümler aşağıdaki JWT algoritmalarını destekler: ES256, ES384, ES512, HS256, HS384, HS512, RS256, RS384, RS512, PS256, PS384, PS512 ve EdDSA.
ASM'de JwksUri nasıl kullanılır?
Alibaba Cloud Service Mesh 1,13 veya sonraki bir sürümü kullanmanız gerekir. JwksUri'yi kullanmanın iki yolu vardır:
JwksUri küme içindeki bir hizmeti işaret ediyorsa doğrudan yapılandırabilirsiniz.
-
JwksUri küme dışındaki bir hizmeti işaret ediyorsa karşılık gelen bir ServiceEntry yapılandırmanız gerekir.
Bu konuda resmi Istio JWT ve Jwks örnekleri kullanılmaktadır. Daha fazla bilgi için JWT ve Jwks kaynaklarına bakın.
Küme içindeki bir JwksUri adresini kullanma
Bu konuda JwksUri adresinin Service Mesh tarafından yönetilen bir kümedeki bir adres olduğu varsayılmaktadır. nginx-proxy, küme içindeki bir hizmettir. Bu hizmetin 80 numaralı bağlantı noktasındaki /get_jwks uç noktası jwks genel anahtar bilgilerini döndürür ve JwksUri değeri http://nginx-proxy.{Namespace}.svc.cluster.local:80/get_jwks şeklindedir.
-
Kümenin get_jwks uç noktasının kullanılabilir olup olmadığını kontrol etmek için aşağıdaki komutu çalıştırın.
curl nginx-proxy/get_jwksBeklenen çıktı:
{ "keys":[ {"e":"AQAB","kid":"DHFbpoIUqrY8t2zpA2qXfCmr5VO5ZEr4RzHU_-e****","kty":"RSA","n":"xAE7eB6qugXyCAG3yhh7pkDkT65p****-P7KfIupjf59vsdo91bSP9C8H07pSAGQ****_xFj9VswgsCg4R6otmg5PV2He95lZdHtOcU5****_pbhLdKXbi66GlVeK6ABZOUW3WYt****-91gVuoeJT_DwtGGcp4ignkgXfkiE****-4sfb4qdt5oLbyVpmW6x9cfa7vs2WTfURiCrBoU****_-4WTiULmmHSGZHOjzwa8WtrtOQGsAFjIbno85jp6MnGGGZPYZ****_b3y5u-YpW7ypZrvD8BgtKVjgtQgZhLAGezMt0ua3DRrWnKqT****_EyxOGuHJrLsn00****"}]}Anahtar verileri içeren bir
200yanıtı, get_jwks uç noktasının kullanılabilir olduğunu gösterir. -
Bir istek kimlik doğrulaması oluşturun.
ASM konsolu üzerinde oturum açın.
Sol gezinme bölmesinde seçeneğini tıklayın.
Mesh Management sayfasında yapılandırmak istediğiniz ASM örneğini bulun. ASM örneğinin adını tıklayın veya Actions sütunundaki Manage seçeneğini tıklayın.
Sol gezinme bölmesinde Mesh Security Center > RequestAuthentication seçeneğini tıklayın.
-
RequestAuthentication sayfasında Create from YAML seçeneğini tıklayın, hedef Namespaces ve herhangi bir Scenario Template seçin, aşağıdaki YAML kodunu yapılandırın ve ardından Create seçeneğini tıklayın.
apiVersion: security.istio.io/v1beta1 kind: RequestAuthentication metadata: name: jwt-example namespace: foo spec: jwtRules: - issuer: testing@secure.istio.io jwksUri: 'http://nginx-proxy/get_jwks' selector: matchLabels: app: httpbin
Veri düzlemi kubeconfig dosyasını kullanarak httpbin hizmetine erişmek için aşağıdaki komutu çalıştırın.
# Set the TOKEN environment variable.
TOKEN=$(curl https://raw.githubusercontent.com/istio/istio/release-1.14/security/tools/jwt/samples/demo.jwt -s) && echo "$TOKEN" | cut -d '.' -f2 - | base64 --decode -
# Access the httpbin service with the JWT from the sleep pod.
kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- curl "http://httpbin.foo:8000/headers" -sS -o /dev/null -H "Authorization: Bearer $TOKEN" -w "%{http_code}\n"
200 durum kodu, isteğin başarılı olduğunu doğrular.
Küme dışındaki bir JwksUri adresini kullanma
Aşağıdaki örnek HTTP protokolüne dayanmaktadır. Jwks'i almak için HTTPS kullanmanız gerekiyorsa ServiceEntry için ek bir destination rule yapılandırın.
-
Uzak adres için bir ServiceEntry oluşturun.
a. service-entry.yaml dosyasını oluşturmak için aşağıdaki YAML içeriğini kullanın.
apiVersion: networking.istio.io/v1beta1 kind: ServiceEntry metadata: name: external-svc-https namespace: foo spec: addresses: - 11.11.XX.XX # Replace with the address of your external Jwks service. endpoints: - address: 11.11.XX.XX # Replace with the address of your external Jwks service. hosts: - 11.11.XX.XX # Replace with the address of your external Jwks service. location: MESH_EXTERNAL ports: - name: http number: 80 protocol: HTTP - name: https number: 443 protocol: HTTPS resolution: STATICb. ServiceEntry'i dağıtmak için aşağıdaki komutu çalıştırın.
kubectl apply -f service-entry.yaml(İsteğe bağlı) Jwks hizmetiniz HTTPS protokolü gerektiriyorsa ServiceEntry için ek bir destination rule yapılandırmanız gerekir.
apiVersion: networking.istio.io/v1beta1 kind: DestinationRule metadata: name: external-svc-https namespace: foo spec: host: <your-service-entry-host> trafficPolicy: loadBalancer: simple: ROUND_ROBIN portLevelSettings: - port: number: 443 tls: mode: SIMPLE -
Bir istek kimlik doğrulaması oluşturun.
ASM konsolu üzerinde oturum açın.
Sol gezinme bölmesinde seçeneğini tıklayın.
Mesh Management sayfasında yapılandırmak istediğiniz ASM örneğini bulun. ASM örneğinin adını tıklayın veya Actions sütunundaki Manage seçeneğini tıklayın.
Sol gezinme bölmesinde Mesh Security Center > RequestAuthentication seçeneğini tıklayın.
-
RequestAuthentication sayfasında Create from YAML seçeneğini tıklayın, hedef Namespaces ve herhangi bir Scenario Template seçin, aşağıdaki YAML kodunu yapılandırın ve ardından Create seçeneğini tıklayın.
apiVersion: security.istio.io/v1beta1 kind: RequestAuthentication metadata: name: jwt-example namespace: foo spec: jwtRules: - issuer: testing@secure.istio.io jwksUri: '${YOUR_EXTERNAL_JWKS_URI}' selector: matchLabels: app: httpbin
TOKEN ortam değişkenini ayarlamak ve sleep pod içinde bir erişim testi yapmak için aşağıdaki komutları çalıştırın.
# Set the TOKEN environment variable.
TOKEN=$(curl https://raw.githubusercontent.com/istio/istio/release-1.14/security/tools/jwt/samples/demo.jwt -s)
# Access the httpbin service with the JWT from the sleep pod.
kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- curl "http://httpbin.foo:8000/headers" -sS -o /dev/null -H "Authorization: Bearer $TOKEN" -w "%{http_code}\n"
200 durum kodu, isteğin başarılı olduğunu doğrular.
Belirli yollara yönelik istekler için JWT kimlik doğrulaması nasıl atlanır?
ASM konsolu yetkilendirme ilkesi özelliğini sunar. Yetkilendirme ilkesinde bir dışlama eşleşmesi yapılandırarak belirtilen yollar dışındaki yollara yönelik isteklerin kimlik doğrulamasını sağlayabilirsiniz.
-
Hizmetleri dağıtın ve erişin.
a. ASM örneğiyle ilişkili kümede Bookinfo örnek uygulamasını dağıtın. Daha fazla bilgi için ASM örneğiyle ilişkili bir kümede uygulama dağıtma konusuna bakın.
b. Aşağıdaki üç hizmete erişmek ve her yolun kullanılabilir olduğundan emin olmak için aşağıdaki komutları çalıştırın.
curl "http://${ASM_GATEWAY_ADDRESS}/productpage" -sS -o /dev/null -w "%{http_code}\n" curl "http://${ASM_GATEWAY_ADDRESS}/api/v1/products/0" -sS -o /dev/null -w "%{http_code}\n" curl "http://${ASM_GATEWAY_ADDRESS}/api/v1/products/1" -sS -o /dev/null -w "%{http_code}\n"Üç hizmet de
200döndürür; bu, hizmetlere erişilebildiğini gösterir. -
Bir RequestAuthentication oluşturun.
ASM konsolu üzerinde oturum açın.
Sol gezinme bölmesinde seçeneğini tıklayın.
Mesh Management sayfasında yapılandırmak istediğiniz ASM örneğini bulun. ASM örneğinin adını tıklayın veya Actions sütunundaki Manage seçeneğini tıklayın.
Sol gezinme bölmesinde Mesh Security Center > RequestAuthentication seçeneğini tıklayın.
-
RequestAuthentication sayfasında Create from YAML seçeneğini tıklayın, hedef Namespaces ve herhangi bir Scenario Template seçin, aşağıdaki YAML kodunu yapılandırın ve ardından Create seçeneğini tıklayın.
apiVersion: security.istio.io/v1beta1 kind: RequestAuthentication metadata: name: jwt-example namespace: istio-system spec: jwtRules: - issuer: testing@secure.istio.io jwks: >- { "keys":[ {"e":"AQAB","kid":"DHFbpoIUqrY8t2zpA2qXfCmr5VO5ZEr4RzHU_-e****","kty":"RSA","n":"xAE7eB6qugXyCAG3yhh7pkDkT65pHymX-P7KfIupjf59vsdo91bSP9C8H07pSAGQ****_xFj9VswgsCg4R6otmg5PV2He95lZdHtOcU5****_pbhLdKXbi66GlVeK6ABZOUW3WYtnNHD-91gVu****_DwtGGcp4ignkgXfkiEm4sw-4sfb4qdt5oLbyVpmW6x9cfa7vs2WTfURiCrBoU****_-4WTiULmmHSGZHOjzwa8WtrtOQGsAFjIbno85jp6MnGGGZPYZ****_b3y5u-YpW7ypZrvD8BgtKVjgtQgZhLAGezMt0ua3DRrWnKqT****_EyxOGuHJrLsn00****"}]} selector: matchLabels: app: istio-ingressgatewayBu istek kimlik doğrulaması ASM ağ geçidine uygulanır ve ağ geçidinden geçen tüm isteklerde etkili olur. RequestAuthentication yapılandırıldıktan sonra JWT içermeyen istekler ve doğru JWT içeren isteklerin her ikisine de izin verilir. Yalnızca hatalı JWT taşıyan istekler reddedilir.
-
Bir AuthorizationPolicy oluşturun.
Belirli yollara yönelik isteklerin JWT taşımasına gerek olmamasını, diğer yollara yönelik isteklerin ise JWT taşımasını sağlayacak şekilde yapılandırın. Bu konuda /productpage yolu örnek olarak kullanılmıştır. /productpage yolu için JWT kimlik doğrulaması yapılmaz. /productpage yolu dışındaki iki yol için isteklerin geçebilmesi amacıyla doğru bir JWT taşımaları gerekir.
ASM konsolu üzerinde oturum açın.
Sol gezinme bölmesinde seçeneğini tıklayın.
Mesh Management sayfasında yapılandırmak istediğiniz ASM örneğini bulun. ASM örneğinin adını tıklayın veya Actions sütunundaki Manage seçeneğini tıklayın.
Sol gezinme bölmesinde Mesh Security Center > AuthorizationPolicy seçeneğini tıklayın.
-
AuthorizationPolicy sayfasında Create from YAML seçeneğini tıklayın, hedef Namespaces ve herhangi bir Scenario Template seçin, aşağıdaki YAML kodunu yapılandırın ve ardından Create seçeneğini tıklayın.
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: test-exclude namespace: istio-system spec: action: DENY rules: - from: - source: notRequestPrincipals: - '*' to: - operation: notPaths: - /productpage selector: matchLabels: app: istio-ingressgatewayBu AuthorizationPolicy de ASM ağ geçidine uygulanır. Temel olarak bir DENY kuralı yapılandırır: /productpage yolu dışındaki yollara yönelik istekler doğru bir JWT taşımıyorsa erişim reddedilir.
Bir erişim testi yapın.
a. İsteklerde taşınan JWT'yi TOKEN ortam değişkeni olarak ayarlamak için aşağıdaki komutu çalıştırın.
export TOKEN=eyJhbGciOiJSUzI1NiIsImtpZCI6IkRIRmJwb0lVcXJZOHQyenBBMnFYZkNtcjVWTzVaRXI0UnpIVV8tZW52dlEiLCJ0eXAiOiJKV1****.eyJleHAiOjQ2ODU5ODk3MDAsImZvbyI6ImJhciIsImlhdCI6MTUzMjM4OTcwMCwiaXNzIjoidGVzdGluZ0BzZWN1cmUuaXN0aW8uaW8iLCJzdWIiOiJ0ZXN0aW5nQHNlY3VyZS5pc3Rpby5p****.CfNnxWP2tcnR9q0vxyxweaF3ovQYHYZl82hAUsn21bwQd9****-LS9qd_vpdLG4Tn1A15NxfCjp5f7Q****-KC9PJqYpgGbaXhaGx7bEdFWjcwv3nZz****__ZpaCERdwU7igUmJqYGBYQ51vr2njU9ZimyKkfDe3axcyiBZde7G6dabliUosJvvKOPcKIWPccCg****_GNfwIip3-SsFdlR7BtbVUcqR-yv-XOxJ3Uc1MI0tz3uMiiZcyPV7sNCU4KRnemRIMHVOfuvH****_GhGbiSFzgPTAa9WTltbnarTbxudb_YEOx12JiwYToeX0DCPb43W1tzIBxgm8****
b. Üç hizmet yoluna erişmek için aşağıdaki komutları çalıştırın.
Hiçbir istek JWT taşımaz:
curl "http://${ASM_GATEWAY_ADDRESS}/productpage" -sS -o /dev/null -w "%{http_code}\n"
curl "http://${ASM_GATEWAY_ADDRESS}/api/v1/products/0" -sS -o /dev/null -w "%{http_code}\n"
curl "http://${ASM_GATEWAY_ADDRESS}/api/v1/products/1" -sS -o /dev/null -w "%{http_code}\n"
Beklenen çıktı:
200
403
403
Yalnızca /productpage yoluna erişilebilir. Diğer tüm yollar 403 döndürür.
Tüm istekler JWT taşır:
curl "http://${ASM_GATEWAY_ADDRESS}/productpage" -H "Authorization: Bearer $TOKEN" -sS -o /dev/null -w "%{http_code}\n"
curl "http://${ASM_GATEWAY_ADDRESS}/api/v1/products/0" -H "Authorization: Bearer $TOKEN" -sS -o /dev/null -w "%{http_code}\n"
curl "http://${ASM_GATEWAY_ADDRESS}/api/v1/products/1" -H "Authorization: Bearer $TOKEN" -sS -o /dev/null -w "%{http_code}\n"
Beklenen çıktı:
200
200
200
Üç yol da 200 döndürür; bu, tüm yollara erişilebildiğini gösterir.