Service Mesh (ASM) では、JSON Webトークン (JWT) 認証を設定して、リクエストのソースを認証できます。この方法は、エンドユーザー認証とも呼ばれます。ASMインスタンスのイングレスゲートウェイにJWT認証を設定すると、ASMは、イングレスゲートウェイを使用してサービスにアクセスするリクエストに、リクエストヘッダーに有効なJWTが含まれているかどうかを確認します。有効なJWTが含まれているリクエストのみが許可されます。このトピックでは、イングレスゲートウェイにJWT認証を設定する方法について説明します。
前提条件
クラスターがASMインスタンスに追加されていること。詳細については、「ASMインスタンスにクラスターを追加する」をご参照ください。
イングレスゲートウェイがデプロイされていること。詳細については、「イングレスゲートウェイを作成する」をご参照ください。
背景情報
この例では、httpbinサービスを使用します。httpbinサービスにアクセスしようとするリクエストを制限するために、イングレスゲートウェイにリクエスト認証ポリシーが設定されています。有効なJWTを含むリクエストは、httpbinサービスへのアクセスが許可されます。無効なJWTを含むリクエストは拒否されます。ただし、JWTを含まないリクエストもhttpbinサービスへのアクセスが許可されます。このリクエスト認証ポリシーに基づいて、以下のシナリオでリクエストをさらに制限するための認可ポリシーを作成できます。
有効なJWTを含むリクエストのみがイングレスゲートウェイを使用してサービスにアクセスできるようにする認可ポリシーを作成します。
指定された発行者によって発行されたJWTを含むリクエストのみがイングレスゲートウェイを使用してサービスにアクセスできるようにする認可ポリシーを作成します。
手順 1:httpbinサービスをデプロイする
default名前空間の自動サイドカープロキシインジェクションを有効にします。
ASMコンソールにログインします。
左側のナビゲーションペインで、 を選択します。
ASMインスタンスの詳細ページで、左側のナビゲーションペインの を選択します。
[グローバル名前空間] ページで、default名前空間を見つけ、サイドカープロキシの自動挿入を有効にする[自動サイドカーインジェクション] 列の をクリックします。
[送信] メッセージで、[OK] をクリックします。
httpbinサービスをデプロイします。
kubectlを使用してContainer Service for Kubernetes (ACK) クラスターに接続します。詳細については、「クラスターのkubeconfigファイルを取得し、kubectlを使用してクラスターに接続する」をご参照ください。
以下の内容を含む httpbin.yaml ファイルを作成します。
apiVersion: v1 kind: ServiceAccount metadata: name: httpbin --- apiVersion: v1 kind: Service metadata: name: httpbin labels: app: httpbin service: httpbin spec: ports: - name: http port: 8000 targetPort: 80 selector: app: httpbin --- apiVersion: apps/v1 kind: Deployment metadata: name: httpbin spec: replicas: 1 selector: matchLabels: app: httpbin version: v1 template: metadata: labels: app: httpbin version: v1 spec: serviceAccountName: httpbin containers: - image: docker.io/kennethreitz/httpbin imagePullPolicy: IfNotPresent name: httpbin ports: - containerPort: 80以下のコマンドを実行して、httpbinサービスをデプロイします。
kubectl apply -f httpbin.yaml -n default
手順 2:Istioゲートウェイと仮想サービスを作成する
Istioゲートウェイを作成します。
ASMコンソールにログインします。左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、ASMインスタンスの名前をクリックします。左側のナビゲーションペインで、 を選択します。表示されるページで、[YAMLから作成] をクリックします。
[作成] ページで、既定[名前空間] ドロップダウンリストから 作成 を選択し、以下の内容をコードエディターにコピーします。次に、 をクリックします。
apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: httpbin-gateway namespace: default spec: selector: istio: ingressgateway servers: - hosts: - '*' port: name: http number: 80 protocol: HTTP
仮想サービスを作成します。
ASMインスタンスの詳細ページで、左側のナビゲーションペインの を選択します。表示されるページで、[YAMLから作成] をクリックします。
[作成] ページで、既定[名前空間] ドロップダウンリストから 作成 を選択し、以下の内容をコードエディターにコピーします。次に、 をクリックします。
apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: httpbin namespace: default spec: gateways: - httpbin-gateway hosts: - '*' http: - route: - destination: host: httpbin port: number: 8000
手順 3:リクエスト認証ポリシーを作成する
JSON Webキー (JWK) を作成します。
OpenSSL で以下のコマンドを実行して、2048ビットのRivest-Shamir-Adleman (RSA) 秘密鍵を生成します。
openssl genrsa -out rsa-private-key.pem 2048以下のコマンドを実行して、秘密鍵ファイルから公開鍵を抽出します。
openssl rsa -in rsa-private-key.pem -pubout -out rsa-public-key.pemJWK to PEM Convertor online ツールで、[pem-to-jwk (RSA Only)] を選択し、コードエディターに公開鍵を入力して、[submit] をクリックして公開鍵をJWKに変換します。
{"kty":"RSA","e":"AQAB","kid":"59399e22-7a9a-45ed-8c76-7add7863915c","n":"2dnwOlDKEwII9Cyh9w7o59a5y3RS2gWUKYC3HSBJL1FhYIZa7sjTCKxwEuG-vCRQkR6augWxYWseSDfgtyivzi3CxxkF8WnQbECOCGm5xAYKmMcXeOpv0zsJTHN122Tt_tsd6K2OC3yGwKtmp7m-MOpHagqWRqFtvyEOm_1JW1-t0n1VsGSeWww8dvcmnJPKAKHbAU40jdV1hMn9AA3RfSpDY6nfrUkpXA5-aQ6rJRjMn36DatZ5ykVL4LKPOUxZdfK_yNIPkCnwIKesqiOpr4s-iCM8pMiZuejDZ1qoX-uBjggESf4G9_L-laDSeoDmXeOZ9kzN3Jw8ay69ihIFEQ"}
リクエスト認証ポリシーを作成します。
ASMコンソールにログインします。
左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、設定するASMインスタンスを見つけます。ASMインスタンスの名前をクリックするか、管理[アクション] 列の をクリックします。
ASMインスタンスの詳細ページで、左側のナビゲーションペインの を選択します。表示されるページで、[作成] をクリックします。
[作成] ページで、パラメーターを設定し、[作成] をクリックします。

パラメーター
説明
[名前空間]
リクエスト認証ポリシーを作成する名前空間。この例では、ドロップダウンリストから [istio-system] が選択されています。
[名前]
リクエスト認証ポリシーの名前。
[一致ラベル]
リクエスト認証ポリシーが適用されるサービスを指定するために使用されるラベル。
[一致ラベルを追加] をクリックします。[名前] パラメーターを istio に、[値] パラメーターを ingressgateway に設定します。
[JWTルールセット]
JWTルール。[JWTルールセット] の横にある [追加] をクリックし、以下のパラメーターを設定します。
issuer:JWTの発行者。この例では、値は testing@asm.test.io に設定されています。
audiences:JWTの対象者。このパラメーターは、JWTを使用して目的のサービスにアクセスできるサービスを指定します。このパラメーターを設定しない場合、すべてのサービスが目的のサービスにアクセスできます。
jwks:JWTに関する情報。
{"keys":[手順 1 で作成した JWK]}形式。たとえば、手順 1 で作成したJWKが{"kty":"RSA","e":"AQAB","kid":"59399e22-7a9a-45ed-8c76-7add786****"}の場合、このパラメーターを{"keys":[{"kty":"RSA","e":"AQAB","kid":"59399e22-7a9a-45ed-8c76-7add786****"}]}に設定します。
手順 4:リクエスト認証ポリシーが有効になっているかどうかを確認する
JWT ツールを使用して、JWTリクエスト情報をJWT文字列にエンコードします。
[デコード済み] セクションに、以下のJWTリクエスト情報を入力します。すると、JWTリクエスト情報は [エンコード済み] セクションでJWTに自動的に変換されます。
HEADER:algパラメーターをRS256に、kidパラメーターを作成したJWKのキーIDに、typパラメーターをJWTに設定します。
PAYLOAD:issパラメーターをtesting@asm.test.ioに設定します。ビジネス要件に基づいて追加情報を追加できます。
VERIFY SIGNATURE:手順 3:リクエスト認証ポリシーを作成する の最初の手順で作成した公開鍵と秘密鍵を入力します。

イングレスゲートウェイを使用してhttpbinサービスにアクセスします。
以下のコマンドを実行して、httpbinサービスにアクセスするリクエストを送信します。リクエストには、手順 1 で作成したJWTが含まれています。
curl -I -H "Authorization: Bearer $TOKEN" http://{IP address of the ingress gateway}/期待される出力:
HTTP/1.1 200 OK server: istio-envoy date: Fri, 18 Mar 2022 07:27:54 GMT以下のコマンドを実行して、無効なJWTを含むリクエストをhttpbinサービスにアクセスするために送信します。
curl -I -H "Authorization: Bearer invalidToken" http://{IP address of the ingress gateway}/期待される出力:
HTTP/1.1 401 Unauthorized www-authenticate: Bearer realm="http://47.98.25*.***/", error="invalid_token" content-length: 79 content-type: text/plain date: Fri, 18 Mar 2022 07:59:00 GMT server: istio-envoy以下のコマンドを実行して、JWTを含まないリクエストをhttpbinサービスにアクセスするために送信します。
curl -I http://{IP address of the ingress gateway}/期待される出力:
HTTP/1.1 200 OK server: istio-envoy date: Fri, 18 Mar 2022 07:27:54 GMT
上記の結果は、リクエストに有効なJWTが含まれている場合、またはJWTが含まれていない場合、httpbinサービスにアクセスするリクエストが許可され、無効なJWTを含むリクエストは許可されないことを示しています。これは、リクエスト認証ポリシーが有効になっていることを示しています。
手順 5:認可ポリシーを作成する
シナリオ 1:有効な JWT を含むリクエストのみがイングレスゲートウェイを使用してサービスにアクセスできるようにする認可ポリシーを作成するシナリオ 1:イングレスゲートウェイを使用して、有効な JWT を含むリクエストのみがサービスにアクセスできるようにする承認ポリシーを作成する
ASMコンソールにログインします。
左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、構成する ASM インスタンスを見つけます。[管理] 列で、ASM インスタンスの名前をクリックするか、[アクション] をクリックします。
ASM インスタンスの詳細ページで、左側のナビゲーションペインの を選択します。表示されるページで、[作成] をクリックします。
[作成] ページで、パラメーターを設定し、[作成] をクリックします。

パラメーター
説明
[名前]
認可ポリシーの名前。
[ポリシータイプ]
認可アクション。この例では、値は [許可] に設定されています。
[ゲートウェイスコープ]
認可ポリシーが有効になるゲートウェイ。この例では、[ゲートウェイスコープ] タブの [ASM ゲートウェイ] パラメーターが [ingressgateway] に設定されています。[リクエストソースを追加] セクションで、[requestprincipals] をオンにし、フィールドに * を入力します。
認可ポリシーが有効になっているかどうかを確認します。
以下のコマンドを実行して、JWT を含まないリクエストを httpbin サービスにアクセスするために送信します。
curl -I http://{IP address of the ingress gateway}/期待される出力:
HTTP/1.1 401 Unauthorized www-authenticate: Bearer realm="http://47.98.25*.***/", error="invalid_token" content-length: 79 content-type: text/plain date: Fri, 18 Mar 2022 07:59:00 GMT server: istio-envoy以下のコマンドを実行して、有効な JWT を含むリクエストを httpbin サービスにアクセスするために送信します。
curl -I -H "Authorization: Bearer $TOKEN" http://{IP address of the ingress gateway}/期待される出力:
HTTP/1.1 200 OK server: istio-envoy date: Fri, 18 Mar 2022 07:27:54 GMT
上記の結果は、リクエストに有効な JWT が含まれている場合、httpbin サービスにアクセスするリクエストが許可され、JWT を含まないリクエストは許可されないことを示しています。これは、認可ポリシーが有効になっていることを示しています。
シナリオ 2:指定された発行者によって発行された JWT を含むリクエストのみがイングレスゲートウェイを使用してサービスにアクセスできるようにする認可ポリシーを作成するシナリオ 2:イングレスゲートウェイを使用して、指定された発行者によって発行された JWT を含むリクエストのみがサービスにアクセスできるようにする承認ポリシーを作成する
この例では、発行者は testing@asm.test.io です。
ASMコンソールにログインします。
左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、構成する ASM インスタンスを見つけます。[管理] 列で、ASM インスタンスの名前をクリックするか、[アクション] をクリックします。
ASM インスタンスの詳細ページで、左側のナビゲーションペインの を選択します。表示されるページで、[作成] をクリックします。
[作成] ページで、パラメーターを設定し、[作成] をクリックします。

パラメーター
説明
[名前]
認可ポリシーの名前。
[ポリシータイプ]
認可アクション。この例では、値は [許可] に設定されています。
[ゲートウェイスコープ]
認可ポリシーが有効になるゲートウェイ。この例では、[ゲートウェイスコープ] タブの [ASM ゲートウェイ] パラメーターが [ingressgateway] に設定されています。[リクエストソースを追加] セクションで、[requestprincipals] がオンになり、値が testing@asm.test.io/demo@asm.test.io に設定されています。
認可ポリシーが有効になっているかどうかを確認します。
以下のコマンドを実行して、testing@asm.test.io によって発行された JWT を含むリクエストを httpbin サービスにアクセスするために送信します。
curl -I -H "Authorization: Bearer $TOKEN" http://{IP address of the ingress gateway}/期待される出力:
HTTP/1.1 401 Unauthorized www-authenticate: Bearer realm="http://47.98.25*.***/", error="invalid_token" content-length: 79 content-type: text/plain date: Fri, 18 Mar 2022 07:59:00 GMT server: istio-envoy認可ポリシーは、testing@asm.test.io/demo@asm.test.io を許可された JWT 発行者として指定しています。したがって、testing@asm.test.io によって発行された JWT を含むリクエストは、httpbin サービスにアクセスすることができません。
JWT の発行者を testing@asm.test.io/demo@asm.test.io に変更します。
以下のコマンドを実行して、前の手順で生成された JWT を含むリクエストを httpbin サービスにアクセスするために送信します。
curl -I -H "Authorization: Bearer $TOKEN" http://{IP address of the ingress gateway}/期待される出力:
HTTP/1.1 200 OK server: istio-envoy date: Fri, 18 Mar 2022 07:27:54 GMTtesting@asm.test.io/demo@asm.test.io によって発行された JWT を含むリクエストは、httpbin サービスにアクセスすることが許可されます。これは、認可ポリシーが有効になっていることを示しています。
