このトピックでは、セルフマネージドの Keycloak インスタンスを ID プロバイダー (IdP) として使用し、ID サービスを提供し、サービスメッシュ内のアプリケーションに対してシングルサインオン (SSO) を有効にする方法について説明します。サービスメッシュ内のアプリケーションは、独自の認証または権限付与ロジックを実装する必要はありません。ASM のカスタム権限付与サービスを設定して Keycloak と OpenID Connect (OIDC) プロトコルを使用し、SSO を実装できます。認証後、リクエストは Keycloak からのユーザー情報とともにアプリケーションに転送されます。
前提条件
ASM インスタンスが作成されていること。詳細については、「ASM インスタンスの作成」をご参照ください。
ACK マネージドクラスターが作成されていること。詳細については、「ACK マネージドクラスターの作成」をご参照ください。
デフォルトの名前空間で自動サイドカーインジェクションが有効になっていること。詳細については、「自動インジェクションの有効化」をご参照ください。
基本概念
概念 | 説明 |
IdP | IdP は、デジタル ID を保存および検証するシステムです。たとえば、アカウントとパスワードを使用して ID を検証できます。Alipay アカウントとパスワードを使用して Youku にログインする場合、Alipay が IdP です。 |
OIDC | OIDC は、OAuth 2.0 プロトコルに基づく標準の ID 認証プロトコルです。詳細については、OpenID 公式ウェブサイトをご参照ください。 |
スコープ | スコープは OIDC の概念です。各 IdP は、メールアドレスなど、さまざまな種類のユーザー情報を保存します。各タイプはスコープに対応します。IdP を使用して ID を検証し、アプリケーションにアクセスする場合、アプリケーションは指定された種類の情報のみを取得できます。 |
操作手順
ステップ1:デモアプリケーションと Keycloak のデプロイ
次の YAML ファイルを使用し、kubectl apply -n default -f <your_yaml_file>.yaml コマンドを実行して、httpbin アプリケーションを ACK クラスターの `default` 名前空間にデプロイします。
次の YAML ファイルを使用し、kubectl apply -n default -f <your_yaml_file>.yaml コマンドを実行して、Keycloak アプリケーションを ACK クラスターの `default` 名前空間にデプロイします。
ステップ2:ASM ゲートウェイを介してデモアプリケーションと Keycloak をインターネットに公開
この例では、ポート 443 の HTTPS を使用してデモアプリケーションにアクセスし、ポート 80 の HTTP を使用して Keycloak コンソールにアクセスします。
HTTPS サービス用に myexample-credential という名前の証明書を作成します。詳細については、「ASM ゲートウェイを使用してセキュアな HTTPS サービスを有効にする」をご参照ください。
次の YAML ファイルを使用して、ASM インスタンスにゲートウェイルールと仮想サービスを作成し、Keycloak をインターネットに公開します。
ASM コンソールで、次の YAML ファイルを使用して ASM インスタンスのゲートウェイルールを設定します。詳細については、「ゲートウェイルールの管理」をご参照ください。
次の YAML ファイルを使用して、ASM インスタンスの仮想サービスを作成します。詳細については、「仮想サービスの管理」をご参照ください。
ブラウザで http://${ingress_gateway_address} にアクセスして Keycloak アプリケーションにアクセスします。

[管理コンソール] をクリックします。Keycloak のデプロイ時に指定した管理者ユーザー名とパスワードでログインします。
ステップ3:Keycloak の設定
Keycloak コンソールの左側のナビゲーションウィンドウで、[Master] ドロップダウンリストから [レルムの作成] をクリックします。

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


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

[ユーザー詳細] ページで、[認証情報] タブをクリックします。
ダイアログボックスで、ログインパスワードを設定し、[保存] をクリックします。

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

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

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

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

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

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

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

この例では、Keycloak サービスのみが HTTP を使用します。他のすべてのサービスは HTTPS を使用します。したがって、リダイレクト URI のフォーマットは https://${your_ASM_gateway_address}/oauth2/callback です。
Keycloak の設定は完了です。次の情報を記録してください:
新しいレルムの ID:Test-oidc。
レルムで作成されたクライアント ID:oauth2proxy。
クライアント設定ページの [認証情報] タブにあるクライアントシークレット。
ステップ4:ASM カスタム権限付与の有効化と OIDC シングルサインオンの設定
ASM コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
[カスタム権限付与サービス] ページで、[カスタム権限付与サービスの関連付け] をクリックし、[OIDC ID 認証・権限付与サービス] を選択し、サービスのパラメーターを設定してから [作成] をクリックします。

作成した OpenID Connect (OIDC) アプリケーションの情報に基づいてパラメーターを設定します。ASM ゲートウェイをログインリダイレクトアドレスとして使用できます。Cookie シークレットの詳細については、「Cookie シークレットの生成」をご参照ください。
[IdP OIDC 発行者 URL]:http://${ASM_gateway_address}/realms/${realm_created_in_Keycloak}。
[ClientID] および [Client Secret]:前のステップで記録したパラメーターを入力します。
[スコープ]:OpenID スコープは必須です。必要に応じて他のスコープを追加できます。
次の 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:権限付ポリシーの作成
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
権限付与ポリシー詳細ページで、[YAML で作成] をクリックします。
[作成] ページで、[名前空間] と [シナリオテンプレート] を選択し、次の 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:検証
ブラウザで ${External_IP_of_ASM_gateway:80} にアクセスします。
期待される結果:
前の図に示すページが表示されます。これは、シングルサインオン (SSO) が有効になっていることを示します。[OpenID Connect でサインイン] をクリックします。[Keycloak] ログインページで、ステップ 3 で作成したテストアカウントとパスワードを入力し、[ログイン] をクリックします。
期待される結果:

[リクエストインスペクション] をクリックし、 を選択します。
期待される結果:

JWT デバッガーで、前のステップのリクエストから JSON Web トークン (JWT) を解析します。トークンは Bearer に続く値です。詳細については、「JWT Debugger」をご参照ください。
期待される結果:
トークンが解析されると、Keycloak からのユーザー情報が表示されます。これは、ASM が JWT を検証したことを示します。