JWTクレームをHTTPヘッダーにコピー

このタスクでは、Istioリクエスト認証ポリシーを使用してJWT認証が正常に完了した後、有効なJWTクレームをHTTPヘッダーにコピーする方法を示します。

始める前に

このタスクを開始する前に、次のことを行ってください。

  • Istioのエンドユーザー認証サポートについて理解を深めてください。

  • Istioインストールガイドを使用してIstioをインストールします。

  • サイドカーインジェクションを有効にした状態で、名前空間foohttpbincurlのワークロードをデプロイします。以下のコマンドを使用して、サンプル名前空間とワークロードをデプロイしてください。

    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
    
  • 以下のコマンドを使用して、curlhttpbinと正常に通信できることを確認します。

    $ 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. 以下のコマンドは、名前空間foohttpbinワークロードに対してjwt-exampleリクエスト認証ポリシーを作成します。このポリシーは、testing@secure.istio.ioによって発行されたJWTを受け入れ、クレーム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. testing@secure.istio.ioによって発行され、キーfooを持つクレームを含むJWTを取得します。

    $ 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. リクエストにJWTクレーム値を含む有効なHTTPヘッダーが含まれていることを確認します。

    $ 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
この情報は役に立ちましたか?
改善のための提案はありますか?

フィードバックありがとうございます!