すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud Service Mesh:ASMのイングレスゲートウェイでJWT認証を設定する

最終更新日:Jan 13, 2025

Service Mesh (ASM) では、JSON Webトークン (JWT) 認証を設定して、リクエストのソースを認証できます。この方法は、エンドユーザー認証とも呼ばれます。ASMインスタンスのイングレスゲートウェイにJWT認証を設定すると、ASMは、イングレスゲートウェイを使用してサービスにアクセスするリクエストに、リクエストヘッダーに有効なJWTが含まれているかどうかを確認します。有効なJWTが含まれているリクエストのみが許可されます。このトピックでは、イングレスゲートウェイにJWT認証を設定する方法について説明します。

前提条件

背景情報

この例では、httpbinサービスを使用します。httpbinサービスにアクセスしようとするリクエストを制限するために、イングレスゲートウェイにリクエスト認証ポリシーが設定されています。有効なJWTを含むリクエストは、httpbinサービスへのアクセスが許可されます。無効なJWTを含むリクエストは拒否されます。ただし、JWTを含まないリクエストもhttpbinサービスへのアクセスが許可されます。このリクエスト認証ポリシーに基づいて、以下のシナリオでリクエストをさらに制限するための認可ポリシーを作成できます。

  • 有効なJWTを含むリクエストのみがイングレスゲートウェイを使用してサービスにアクセスできるようにする認可ポリシーを作成します。

  • 指定された発行者によって発行されたJWTを含むリクエストのみがイングレスゲートウェイを使用してサービスにアクセスできるようにする認可ポリシーを作成します。

手順 1:httpbinサービスをデプロイする

  1. default名前空間の自動サイドカープロキシインジェクションを有効にします。

    1. ASMコンソールにログインします。

    2. 左側のナビゲーションペインで、[service Mesh] > [メッシュ管理] を選択します。

    3. ASMインスタンスの詳細ページで、左側のナビゲーションペインの[ASMインスタンス] > [グローバル名前空間] を選択します。

    4. [グローバル名前空間] ページで、default名前空間を見つけ、サイドカープロキシの自動挿入を有効にする[自動サイドカーインジェクション] 列の をクリックします。

    5. [送信] メッセージで、[OK] をクリックします。

  2. httpbinサービスをデプロイします。

    1. kubectlを使用してContainer Service for Kubernetes (ACK) クラスターに接続します。詳細については、「クラスターのkubeconfigファイルを取得し、kubectlを使用してクラスターに接続する」をご参照ください。

    2. 以下の内容を含む 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
    3. 以下のコマンドを実行して、httpbinサービスをデプロイします。

      kubectl apply -f httpbin.yaml -n default

手順 2:Istioゲートウェイと仮想サービスを作成する

  1. Istioゲートウェイを作成します。

    1. ASMコンソールにログインします。左側のナビゲーションペインで、[service Mesh] > [メッシュ管理] を選択します。

    2. [メッシュ管理] ページで、ASMインスタンスの名前をクリックします。左側のナビゲーションペインで、[ASMゲートウェイ] > [ゲートウェイ] を選択します。表示されるページで、[YAMLから作成] をクリックします。

    3. [作成] ページで、既定[名前空間] ドロップダウンリストから 作成 を選択し、以下の内容をコードエディターにコピーします。次に、 をクリックします。

      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
  2. 仮想サービスを作成します。

    1. ASMインスタンスの詳細ページで、左側のナビゲーションペインの[トラフィック管理センター] > [virtualservice] を選択します。表示されるページで、[YAMLから作成] をクリックします。

    2. [作成] ページで、既定[名前空間] ドロップダウンリストから 作成 を選択し、以下の内容をコードエディターにコピーします。次に、 をクリックします。

      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:リクエスト認証ポリシーを作成する

  1. JSON Webキー (JWK) を作成します。

    1. OpenSSL で以下のコマンドを実行して、2048ビットのRivest-Shamir-Adleman (RSA) 秘密鍵を生成します。

      openssl genrsa -out rsa-private-key.pem 2048
    2. 以下のコマンドを実行して、秘密鍵ファイルから公開鍵を抽出します。

      openssl rsa -in rsa-private-key.pem -pubout -out rsa-public-key.pem
    3. JWK 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"}
  2. リクエスト認証ポリシーを作成します。

    1. ASMコンソールにログインします。

    2. 左側のナビゲーションペインで、[service Mesh] > [メッシュ管理] を選択します。

    3. [メッシュ管理] ページで、設定するASMインスタンスを見つけます。ASMインスタンスの名前をクリックするか、管理[アクション] 列の をクリックします。

    4. ASMインスタンスの詳細ページで、左側のナビゲーションペインの[メッシュセキュリティセンター] > [requestauthentication] を選択します。表示されるページで、[作成] をクリックします。

    5. [作成] ページで、パラメーターを設定し、[作成] をクリックします。

      Create page

      パラメーター

      説明

      [名前空間]

      リクエスト認証ポリシーを作成する名前空間。この例では、ドロップダウンリストから [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:リクエスト認証ポリシーが有効になっているかどうかを確認する

  1. JWT ツールを使用して、JWTリクエスト情報をJWT文字列にエンコードします。

    [デコード済み] セクションに、以下のJWTリクエスト情報を入力します。すると、JWTリクエスト情報は [エンコード済み] セクションでJWTに自動的に変換されます。

    • HEADER:algパラメーターをRS256に、kidパラメーターを作成したJWKのキーIDに、typパラメーターをJWTに設定します。

    • PAYLOAD:issパラメーターをtesting@asm.test.ioに設定します。ビジネス要件に基づいて追加情報を追加できます。

    • VERIFY SIGNATURE:手順 3:リクエスト認証ポリシーを作成する の最初の手順で作成した公開鍵と秘密鍵を入力します。

    JWT

  2. イングレスゲートウェイを使用してhttpbinサービスにアクセスします。

    1. 以下のコマンドを実行して、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
    2. 以下のコマンドを実行して、無効な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
    3. 以下のコマンドを実行して、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 を含むリクエストのみがサービスにアクセスできるようにする承認ポリシーを作成する

  1. ASMコンソールにログインします。

  2. 左側のナビゲーションペインで、[service Mesh] > [メッシュ管理] を選択します。

  3. [メッシュ管理] ページで、構成する ASM インスタンスを見つけます。[管理] 列で、ASM インスタンスの名前をクリックするか、[アクション] をクリックします。

  4. ASM インスタンスの詳細ページで、左側のナビゲーションペインの [メッシュセキュリティセンター] > [authorizationpolicy] を選択します。表示されるページで、[作成] をクリックします。

  5. [作成] ページで、パラメーターを設定し、[作成] をクリックします。

    Create page

    パラメーター

    説明

    [名前]

    認可ポリシーの名前。

    [ポリシータイプ]

    認可アクション。この例では、値は [許可] に設定されています。

    [ゲートウェイスコープ]

    認可ポリシーが有効になるゲートウェイ。この例では、[ゲートウェイスコープ] タブの [ASM ゲートウェイ] パラメーターが [ingressgateway] に設定されています。[リクエストソースを追加] セクションで、[requestprincipals] をオンにし、フィールドに * を入力します。

  6. 認可ポリシーが有効になっているかどうかを確認します。

    1. 以下のコマンドを実行して、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
    2. 以下のコマンドを実行して、有効な 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 です。

  1. ASMコンソールにログインします。

  2. 左側のナビゲーションペインで、[service Mesh] > [メッシュ管理] を選択します。

  3. [メッシュ管理] ページで、構成する ASM インスタンスを見つけます。[管理] 列で、ASM インスタンスの名前をクリックするか、[アクション] をクリックします。

  4. ASM インスタンスの詳細ページで、左側のナビゲーションペインの [メッシュセキュリティセンター] > [authorizationpolicy] を選択します。表示されるページで、[作成] をクリックします。

  5. [作成] ページで、パラメーターを設定し、[作成] をクリックします。

    Create page

    パラメーター

    説明

    [名前]

    認可ポリシーの名前。

    [ポリシータイプ]

    認可アクション。この例では、値は [許可] に設定されています。

    [ゲートウェイスコープ]

    認可ポリシーが有効になるゲートウェイ。この例では、[ゲートウェイスコープ] タブの [ASM ゲートウェイ] パラメーターが [ingressgateway] に設定されています。[リクエストソースを追加] セクションで、[requestprincipals] がオンになり、値が testing@asm.test.io/demo@asm.test.io に設定されています。

  6. 認可ポリシーが有効になっているかどうかを確認します。

    1. 以下のコマンドを実行して、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 サービスにアクセスすることができません。

    2. JWT の発行者を testing@asm.test.io/demo@asm.test.io に変更します。

      JWT ツールで、[PAYLOAD] セクションに以下のキーと値のペアを入力します。iss: testing@asm.test.io および sub: demo@asm.test.io。 その他の設定は、手順 1 と同じにします。jwt2

    3. 以下のコマンドを実行して、前の手順で生成された 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

      testing@asm.test.io/demo@asm.test.io によって発行された JWT を含むリクエストは、httpbin サービスにアクセスすることが許可されます。これは、認可ポリシーが有効になっていることを示しています。