Копіювання JWT-заявок до заголовків HTTP

Це завдання показує, як скопіювати дійсні заявки JWT до HTTP заголовків після успішного завершення автентифікації JWT за допомогою політики автентифікації запитів Istio.

Перед початком

Перед початком цього завдання виконайте наступні кроки:

  • Ознайомтеся з автентифікацією кінцевого користувача Istio.

  • Встановіть Istio за допомогою посібника з установки Istio.

  • Розгорніть навантаження httpbin та curl в просторі імен foo з увімкненою інʼєкцією sidecar. Розгорніть приклад простору імен і навантаження за допомогою цих команд:

    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
  • Переконайтеся, що curl успішно взаємодіє з httpbin за допомогою цієї команди:

    $ 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 "%{http_code}\n"
    200

Дозволити запити з дійсним JWT і заявками типу список

  1. Наступна команда створює політику автентифікації запитів jwt-example для навантаження httpbin в просторі імен foo. Ця політика приймає JWT, виданий testing@secure.istio.io, і копіює значення заявки foo в 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.24/security/tools/jwt/samples/jwks.json"
        outputClaimToHeaders:
        - header: "x-jwt-claim-foo"
          claim: "foo"
    EOF
  2. Переконайтеся, що запит з недійсним 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 -o /dev/null -H "Authorization: Bearer invalidToken" -w "%{http_code}\n"
    401
  3. Отримайте JWT, який видано testing@secure.istio.io і має заявку з ключем foo.

    $ TOKEN=$(curl https://raw.githubusercontent.com/istio/istio/release-1.24/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. Переконайтеся, що запит з дійсним 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 -o /dev/null -H "Authorization: Bearer $TOKEN" -w "%{http_code}\n"
    200
  5. Переконайтеся, що запит містить дійсний HTTP-заголовок зі значенням заявки 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"

Очищення

Видаліть простір імен foo:

$ kubectl delete namespace foo
Чи була ця інформація корисною?
Чи є у вас пропозиції щодо покращення?

Дякуємо за ваш відгук!