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

Alibaba Cloud Service Mesh:Keycloak と ASM を統合し、メッシュアプリケーションのシングルサインオンを有効化

最終更新日:Dec 03, 2025

このトピックでは、セルフマネージドの Keycloak インスタンスを ID プロバイダー (IdP) として使用し、ID サービスを提供し、サービスメッシュ内のアプリケーションに対してシングルサインオン (SSO) を有効にする方法について説明します。サービスメッシュ内のアプリケーションは、独自の認証または権限付与ロジックを実装する必要はありません。ASM のカスタム権限付与サービスを設定して Keycloak と OpenID Connect (OIDC) プロトコルを使用し、SSO を実装できます。認証後、リクエストは Keycloak からのユーザー情報とともにアプリケーションに転送されます。

前提条件

基本概念

概念

説明

IdP

IdP は、デジタル ID を保存および検証するシステムです。たとえば、アカウントとパスワードを使用して ID を検証できます。Alipay アカウントとパスワードを使用して Youku にログインする場合、Alipay が IdP です。

OIDC

OIDC は、OAuth 2.0 プロトコルに基づく標準の ID 認証プロトコルです。詳細については、OpenID 公式ウェブサイトをご参照ください。

スコープ

スコープは OIDC の概念です。各 IdP は、メールアドレスなど、さまざまな種類のユーザー情報を保存します。各タイプはスコープに対応します。IdP を使用して ID を検証し、アプリケーションにアクセスする場合、アプリケーションは指定された種類の情報のみを取得できます。

操作手順

ステップ1:デモアプリケーションと Keycloak のデプロイ

  1. 次の YAML ファイルを使用し、kubectl apply -n default -f <your_yaml_file>.yaml コマンドを実行して、httpbin アプリケーションを ACK クラスターの `default` 名前空間にデプロイします。

    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
  2. 次の YAML ファイルを使用し、kubectl apply -n default -f <your_yaml_file>.yaml コマンドを実行して、Keycloak アプリケーションを ACK クラスターの `default` 名前空間にデプロイします。

    YAML を展開して表示

    apiVersion: v1
    kind: Service
    metadata:
      name: keycloak
      labels:
        app: keycloak
    spec:
      ports:
      - name: http
        port: 8080
        targetPort: 8080
      selector:
        app: keycloak
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: keycloak
      labels:
        app: keycloak
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: keycloak
      template:
        metadata:
          labels:
            app: keycloak
        spec:
          containers:
          - name: keycloak
            image: quay.io/keycloak/keycloak:latest
            args: ["start-dev"]
            env:
            - name: KEYCLOAK_ADMIN
              value: "admin"
            - name: KEYCLOAK_ADMIN_PASSWORD
              value: "admin"
            - name: KC_PROXY
              value: "edge"
            ports:
            - name: http
              containerPort: 8080
            readinessProbe:
              httpGet:
                path: /realms/master
                port: 8080

ステップ2:ASM ゲートウェイを介してデモアプリケーションと Keycloak をインターネットに公開

この例では、ポート 443 の HTTPS を使用してデモアプリケーションにアクセスし、ポート 80 の HTTP を使用して Keycloak コンソールにアクセスします。

  1. HTTPS サービス用に myexample-credential という名前の証明書を作成します。詳細については、「ASM ゲートウェイを使用してセキュアな HTTPS サービスを有効にする」をご参照ください。

  2. 次の YAML ファイルを使用して、ASM インスタンスにゲートウェイルールと仮想サービスを作成し、Keycloak をインターネットに公開します。

    1. ASM コンソールで、次の YAML ファイルを使用して ASM インスタンスのゲートウェイルールを設定します。詳細については、「ゲートウェイルールの管理」をご参照ください。

      YAML を展開して表示

      apiVersion: networking.istio.io/v1beta1
      kind: Gateway
      metadata:
        name: ingressgateway
        namespace: istio-system
      spec:
        selector:
          app: istio-ingressgateway # このセレクターが既存のゲートウェイと一致することを確認してください。
        servers:
          - hosts:
              - '*'
            port:
              name: http-httpbin # ポート 443 の HTTPS を使用してデモアプリケーションにアクセスします。
              number: 443
              protocol: HTTPS
            tls:
              credentialName: myexample-credential
              mode: SIMPLE
          - hosts:
              - '*'
            port:
              name: keycloak # ポート 80 の HTTP を使用して Keycloak コンソールにアクセスします。
              number: 80
              protocol: HTTP
                                      
    2. 次の YAML ファイルを使用して、ASM インスタンスの仮想サービスを作成します。詳細については、「仮想サービスの管理」をご参照ください。

      YAML を展開して表示

      apiVersion: networking.istio.io/v1beta1
      kind: VirtualService
      metadata:
        name: ingressgateway-vs
        namespace: istio-system
      spec:
        gateways:
          - ingressgateway
        hosts:
          - '*'
        http:
          - match:
              - port: 80
            name: keycloak
            route:
              - destination:
                  host: keycloak.default.svc.cluster.local
                  port:
                    number: 8080
          - name: httpbin
            route:
              - destination:
                  host: httpbin.default.svc.cluster.local
                  port:
                    number: 8000
  3. ブラウザで http://${ingress_gateway_address} にアクセスして Keycloak アプリケーションにアクセスします。3

  4. [管理コンソール] をクリックします。Keycloak のデプロイ時に指定した管理者ユーザー名とパスワードでログインします。

ステップ3:Keycloak の設定

  1. Keycloak コンソールの左側のナビゲーションウィンドウで、[Master] ドロップダウンリストから [レルムの作成] をクリックします。2

  2. 新しいレルム設定ページで、次の図に示すようにクライアントを作成します。43

  3. クライアントが作成されたら、レルムページでユーザーを作成します。次の図に示すように、[保存] をクリックします。4

  4. [ユーザー詳細] ページで、[認証情報] タブをクリックします。

  5. ダイアログボックスで、ログインパスワードを設定し、[保存] をクリックします。设置登录密码

  6. 次の図に示すようにレルムロールを作成し、[保存] をクリックします。Role

  7. [ユーザー詳細] ページで、[ロールマッピング] タブをクリックします。

  8. [ロールマッピング] ページで、[ロールの割り当て] をクリックします。ステップ 6 で作成したロールを現在のユーザーに割り当てます。5

  9. 次の図に示すようにクライアントスコープを作成できます。[保存] をクリックします。创建ClientScope

  10. [クライアントスコープ] ページで、[マッパー] タブをクリックし、次の図に示すようにマッパーを追加して、[保存] をクリックします。13

  11. [スコープ] タブをクリックします。ステップ 6 で作成したロールのチェックボックスをオンにして、[割り当て] をクリックします。8

  12. クライアント設定ページで、[クライアントスコープ] タブをクリックし、デフォルトスコープを追加します。9

  13. 次の図に示すように、[有効なリダイレクト URL] ボックスに、クラスターの oauth2-proxy のリダイレクト URL を追加します。[保存] をクリックします。10

説明

この例では、Keycloak サービスのみが HTTP を使用します。他のすべてのサービスは HTTPS を使用します。したがって、リダイレクト URI のフォーマットは https://${your_ASM_gateway_address}/oauth2/callback です。

Keycloak の設定は完了です。次の情報を記録してください:

  • 新しいレルムの ID:Test-oidc

  • レルムで作成されたクライアント ID:oauth2proxy

  • クライアント設定ページの [認証情報] タブにあるクライアントシークレット

ステップ4:ASM カスタム権限付与の有効化と OIDC シングルサインオンの設定

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

  2. [メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、[メッシュセキュリティセンター] > [カスタム権限付与サービス] を選択します。

  3. [カスタム権限付与サービス] ページで、[カスタム権限付与サービスの関連付け] をクリックし、[OIDC ID 認証・権限付与サービス] を選択し、サービスのパラメーターを設定してから [作成] をクリックします。

    关联外部授权服务

    作成した OpenID Connect (OIDC) アプリケーションの情報に基づいてパラメーターを設定します。ASM ゲートウェイをログインリダイレクトアドレスとして使用できます。Cookie シークレットの詳細については、「Cookie シークレットの生成」をご参照ください。

    • [IdP OIDC 発行者 URL]http://${ASM_gateway_address}/realms/${realm_created_in_Keycloak}

    • [ClientID] および [Client Secret]:前のステップで記録したパラメーターを入力します。

    • [スコープ]:OpenID スコープは必須です。必要に応じて他のスコープを追加できます。

  4. 次の YAML ファイルを使用して仮想サービスを作成します。

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: oauth2-vs
      namespace: istio-system
    spec:
      gateways:
        - ingressgateway
      hosts:
        - '*'
      http:
        - match:
            - uri:
                prefix: /oauth2
          name: oauth2
          route:
            - destination:
                host: asm-oauth2proxy-httpextauth-oidc.istio-system.svc.cluster.local
                port:
                  number: 4180
    説明
    • route フィールドで、host を ACK クラスターの istio-system 名前空間にある Oauth2Proxy サービスの名前に置き換えます。

    • 仮想サービスの競合を防ぐため、他の仮想サービスが /oauth2 プレフィックスを持つパスと一致しないことを確認してください。

ステップ5:権限付ポリシーの作成

  1. [メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、[メッシュセキュリティセンター] > [AuthorizationPolicy] を選択します。

  2. 権限付与ポリシー詳細ページで、[YAML で作成] をクリックします。

  3. [作成] ページで、[名前空間][シナリオテンプレート] を選択し、次の YAML ファイルを設定して、[作成] をクリックします。

    apiVersion: security.istio.io/v1beta1
    kind: AuthorizationPolicy
    metadata:
      name: oidc
      namespace: istio-system
    spec:
      action: CUSTOM
      provider:
        name: httpextauth-oidc
      rules:
        - to:
            - operation:
                notPorts:
                  - '80'
      selector:
        matchLabels:
          istio: ingressgateway
    説明
    • AuthorizationPolicy は、ポート 80 を除くすべてのポートへのアクセスに権限付与が必要であることを指定します。

    • provider name には、関連付けられたカスタム権限付与サービスの名前を入力します。名前はカスタム権限付与サービスのリストで確認できます。

ステップ6:検証

  1. ブラウザで ${External_IP_of_ASM_gateway:80} にアクセスします。

    期待される結果:1前の図に示すページが表示されます。これは、シングルサインオン (SSO) が有効になっていることを示します。

  2. [OpenID Connect でサインイン] をクリックします。[Keycloak] ログインページで、ステップ 3 で作成したテストアカウントとパスワードを入力し、[ログイン] をクリックします。

    期待される結果:httpbin

  3. [リクエストインスペクション] をクリックし、[/headers] > [試してみる] > [実行] を選択します。

    期待される結果:11

  4. JWT デバッガーで、前のステップのリクエストから JSON Web トークン (JWT) を解析します。トークンは Bearer に続く値です。詳細については、「JWT Debugger」をご参照ください。

    期待される結果:JWTトークンが解析されると、Keycloak からのユーザー情報が表示されます。これは、ASM が JWT を検証したことを示します。