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

Alibaba Cloud Service Mesh:Keycloak と ASM を統合して SSO を実装する

最終更新日:Jan 14, 2025

このトピックでは、セルフマネージド Keycloak を ID プロバイダー(IdP)として使用して、Service Mesh(ASM)インスタンス内のすべてのアプリケーションへのシングルサインオン(SSO)を実装する方法について説明します。 ASM インスタンス内の各アプリケーションに個別にログオンする必要はありません。代わりに、ASM のカスタム認証サービスを使用して OpenID Connect(OIDC)クライアントタイプの Keycloak IdP を承認し、認証に承認済み IdP を使用します。認証されたリクエストは、Keycloak のユーザー情報とともにアプリケーションに送信されます。

前提条件

概念

概念

説明

IdP

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

OIDC

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

スコープ

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

手順

ステップ 1:サンプルアプリケーションと Keycloak アプリケーションをデプロイする

  • 次の内容を含む YAML ファイルを作成し、kubectl apply -n default -f xxx.yaml コマンドを実行して、Container Service for Kubernetes(ACK)クラスターのデフォルトの名前空間に httpbin アプリケーションをデプロイします。

    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
  • 次の内容を含む YAML ファイルを作成し、kubectl apply -n default -f xxx.yaml コマンドを実行して、ACK クラスターのデフォルトの名前空間に Keycloak アプリケーションをデプロイします。

    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:イングレスゲートウェイを使用して httpbin アプリケーションと Keycloak アプリケーションをインターネットに公開する

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

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

  2. 次の YAML ファイルを使用して ACK クラスターに Istio ゲートウェイと仮想サービスを作成し、Keycloak アプリケーションをインターネットに公開します。

    • 次の内容を含む YAML ファイルを作成して、ASM コンソールで ASM インスタンスの Istio ゲートウェイを構成します。詳細については、「Istio ゲートウェイの管理」をご参照ください。

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

      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://${イングレスゲートウェイの IP アドレス} と入力して、Keycloak アプリケーションにアクセスします。

  4. [管理コンソール] をクリックし、Keycloak アプリケーションのデプロイ時に指定した管理者アカウントとパスワードを使用して Keycloak コンソールにログオンします。

ステップ 3:Keycloak を構成する

  1. Keycloak コンソールの左側のナビゲーションペインで、[マスター] をクリックし、次に [レルムの作成] をクリックします。

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

  3. 次の図に示すように、ユーザーを作成します。[保存] をクリックします。331

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

  5. 表示されるダイアログボックスで、ログオンパスワードを設定します。[保存] をクリックします。

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

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

  8. [ロールマッピング] タブで、[ロールの割り当て] をクリックして、ロールをユーザーに割り当てます。381

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

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

  11. [スコープ] タブをクリックし、サブステップ 6 で作成したロールを選択して、[割り当て] をクリックします。3111

  12. クライアント設定ページで、[クライアントスコープ] タブをクリックし、[クライアントスコープの追加] をクリックします。表示されるダイアログボックスで、[追加] をクリックします。3121

  13. oauth2-proxy クライアントの詳細ページで、[設定] タブをクリックし、有効なリダイレクト URI パラメーターを設定して、[保存] をクリックします。3131

説明

この例では、Keycloak サービスのみが HTTP プロトコルを使用し、他のすべてのサービスは HTTPS を使用します。したがって、有効なリダイレクト URL の形式は https://${イングレスゲートウェイの IP アドレス}/oauth2/callback です。

Keycloak の構成が完了しました。次の情報を記録する必要があります。

  • レルム ID:Test-oidc

  • クライアント ID:oauth2proxy

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

ステップ 4:ASM コンソールでカスタム認証サービスを有効にし、OIDC ベースの SSO を構成する

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

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

  3. [カスタム認証サービス] ページで、[カスタム認証サービスの定義] をクリックし、[OIDC 認証および承認サービス] タブをクリックします。パラメーターを設定し、[作成] をクリックします。

    Define Custom Authorization Service

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

    • Idp OIDC 発行者 URIhttp://${イングレスゲートウェイの IP アドレス}/realms/${Keycloak で作成したレルムの ID}

    • クライアント ID および クライアントシークレット:記録したパラメーター値を使用します。

    • スコープ:このパラメーターでは 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
    説明
    • host の値を、route フィールドで、ACK クラスタ内の istio-system 名前空間 に対応する OAuth2 Proxy サービスの名前に置き換えます。

    • プレフィックスが /oauth2 であるパスに他の仮想サービスをルーティングしないでください。

ステップ 5:認証ポリシーを作成する

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

  2. AuthorizationPolicy ページで、[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
    説明
    • 認証ポリシーは、ポート 80 に送信されたリクエスト以外のすべてのリクエストを認証する必要があることを指定します。

    • プロバイダー名は、関連付けられているカスタム認証サービスの名前です。カスタム認証サービスリストでサービス名を取得できます。

ステップ 6:SSO を検証する

  1. ブラウザーで ${外部アクセス用イングレスゲートウェイの IP アドレス:80} にアクセスします。

    予期される結果:1前の図に示すページが表示された場合は、SSO が有効になっています。

  2. [openid Connect でサインイン] をクリックします。Keycloak でのログオンのページで、ステップ 3 で作成したテストユーザー名とパスワードを入力し、ログオンボタンをクリックします。

    予期される結果:httpbin

  3. [リクエストの検査] をクリックし、[/headers] > [試してみる] > [実行] を選択します。

    予期される結果:

  4. 前のステップで bearer 認証後のリクエストに含まれる JSON Web トークン(JWT)を JWT デバッガーで解析します。 JWT デバッガーの詳細については、JWT 公式 Web サイトをご参照ください。

    予期される結果:JWT前の図の情報は、JWT が解析された後に表示されます。これには、Keycloak に保存されているユーザー情報が含まれます。JWT は ASM によって検証されます。