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 y curl en el namespace foo con la inyección de sidecar habilitada. Despliegue el namespace y los workloads de ejemplo usando estos comandos:

    ZipZip
    $ 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 con httpbin 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

  1. El siguiente comando crea la política de autenticación de solicitudes jwt-example para el workload httpbin en el namespace foo. Esta política acepta un JWT emitido por testing@secure.istio.io y copia el valor del claim foo a una cabecera HTTP X-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
  2. 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
  3. Obtenga el JWT emitido por testing@secure.istio.io y que tiene un claim con la clave foo.

    $ 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"}
  4. 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
  5. 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
¿Fue útil esta información?
¿Tienes alguna sugerencia para mejorar?

¡Gracias por tus comentarios!