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
httpbin
ycurl
en el namespacefoo
con 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 foo
Verifique que
curl
se comunica correctamente conhttpbin
usando 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-example
para el workloadhttpbin
en el namespacefoo
. Esta política acepta un JWT emitido portesting@secure.istio.io
y copia el valor del claimfoo
a 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/release-1.27/security/tools/jwt/samples/jwks.json" outputClaimToHeaders: - header: "x-jwt-claim-foo" claim: "foo" EOF
Verifique 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}" 401
Obtenga el JWT emitido por
testing@secure.istio.io
y que tiene un claim con la clavefoo
.$ TOKEN=$(curl https://raw.githubusercontent.com/istio/istio/release-1.27/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}" 200
Verifique 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