JWTクレームをHTTPヘッダーにコピー
このタスクでは、Istioリクエスト認証ポリシーを使用してJWT認証が正常に完了した後、有効なJWTクレームをHTTPヘッダーにコピーする方法を示します。
始める前に
このタスクを開始する前に、次のことを行ってください。
Istioのエンドユーザー認証サポートについて理解を深めてください。
Istioインストールガイドを使用してIstioをインストールします。
サイドカーインジェクションを有効にした状態で、名前空間
foo
にhttpbin
とcurl
のワークロードをデプロイします。以下のコマンドを使用して、サンプル名前空間とワークロードをデプロイしてください。$ 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およびリスト型クレームを持つリクエストを許可
以下のコマンドは、名前空間
foo
のhttpbin
ワークロードに対して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
無効な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
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"}
有効な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
リクエストに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