Copiar Claims JWT a Cabeceras HTTP
Esta tarea muestra cómo copiar claims JWT válidos a cabeceras HTTP después de que la autenticación JWT se haya completado con éxito a través de una política de autenticación de solicitudes de Istio.
Antes de empezar
Antes de comenzar esta tarea, haga lo siguiente:
Familiarícese con el soporte de autenticación de usuario final de Istio.
Instale Istio usando la guía de instalación de Istio.
Despliegue los workloads
httpbinycurlen el namespacefoocon la inyección de sidecar habilitada. Despliegue el namespace y los workloads de ejemplo usando estos comandos:$ kubectl create ns foo $ kubectl label namespace foo istio-injection=enabled $ kubectl apply -f @samples/httpbin/httpbin.yaml@ -n foo $ kubectl apply -f @samples/curl/curl.yaml@ -n fooVerifique que
curlse comunica correctamente conhttpbinusando este comando:$ kubectl exec "$(kubectl get pod -l app=curl -n foo -o jsonpath={.items..metadata.name})" -c curl -n foo -- curl http://httpbin.foo:8000/ip -sS -o /dev/null -w "%{\nhttp_code}" 200
Permitir solicitudes con JWT válido y claims de tipo lista
El siguiente comando crea la política de autenticación de solicitudes
jwt-examplepara el workloadhttpbinen el namespacefoo. Esta política acepta un JWT emitido portesting@secure.istio.ioy copia el valor del claimfooa una cabecera HTTPX-Jwt-Claim-Foo:$ kubectl apply -f - <<EOF apiVersion: security.istio.io/v1 kind: RequestAuthentication metadata: name: "jwt-example" namespace: foo spec: selector: matchLabels: app: httpbin jwtRules: - issuer: "testing@secure.istio.io" jwksUri: "https://raw.githubusercontent.com/istio/istio/master/security/tools/jwt/samples/jwks.json" outputClaimToHeaders: - header: "x-jwt-claim-foo" claim: "foo" EOFVerifique que una solicitud con un JWT inválido es denegada:
$ kubectl exec "$(kubectl get pod -l app=curl -n foo -o jsonpath={.items..metadata.name})" -c curl -n foo -- curl "http://httpbin.foo:8000/headers" -sS -o /dev/null -H "Authorization: Bearer invalidToken" -w "%{\nhttp_code}" 401Obtenga el JWT emitido por
testing@secure.istio.ioy que tiene un claim con la clavefoo.$ TOKEN=$(curl https://raw.githubusercontent.com/istio/istio/master/security/tools/jwt/samples/demo.jwt -s) && echo "$TOKEN" | cut -d '.' -f2 - | base64 --decode - {"exp":4685989700,"foo":"bar","iat":1532389700,"iss":"testing@secure.istio.io","sub":"testing@secure.istio.io"}Verifique que una solicitud con un JWT válido es permitida:
$ kubectl exec "$(kubectl get pod -l app=curl -n foo -o jsonpath={.items..metadata.name})" -c curl -n foo -- curl "http://httpbin.foo:8000/headers" -sS -o /dev/null -H "Authorization: Bearer $TOKEN" -w "%{\nhttp_code}" 200Verifique que una solicitud contiene una cabecera HTTP válida con el valor del claim JWT:
$ kubectl exec "$(kubectl get pod -l app=curl -n foo -o jsonpath={.items..metadata.name})" -c curl -n foo -- curl "http://httpbin.foo:8000/headers" -sS -H "Authorization: Bearer $TOKEN" | jq '.headers["X-Jwt-Claim-Foo"][0]' "bar"
Limpieza
Elimine el namespace foo:
$ kubectl delete namespace foo