このトピックでは、セルフマネージド Keycloak を ID プロバイダー(IdP)として使用して、Service Mesh(ASM)インスタンス内のすべてのアプリケーションへのシングルサインオン(SSO)を実装する方法について説明します。 ASM インスタンス内の各アプリケーションに個別にログオンする必要はありません。代わりに、ASM のカスタム認証サービスを使用して OpenID Connect(OIDC)クライアントタイプの Keycloak IdP を承認し、認証に承認済み IdP を使用します。認証されたリクエストは、Keycloak のユーザー情報とともにアプリケーションに送信されます。
前提条件
ASM インスタンスが作成されていること。詳細については、「ASM インスタンスの作成」をご参照ください。
ACK マネージドクラスターが作成されていること。詳細については、「ACK マネージドクラスターの作成」をご参照ください。
クラスターが ASM インスタンスに追加されていること。詳細については、「ASM インスタンスへのクラスターの追加」をご参照ください。
デフォルトの名前空間で自動サイドカープロキシインジェクションが有効になっていること。詳細については、「自動サイドカープロキシインジェクションの有効化」をご参照ください。
概念
概念 | 説明 |
IdP | IdP は、デジタル ID を保存および検証するシステムです。たとえば、アカウントとパスワードを使用して ID を検証できます。Alipay アカウントとパスワードを使用して Youku にログオンする場合、Alipay が IdP です。 |
OIDC | OIDC は、OAuth 2.0 プロトコルに基づく標準 ID 認証プロトコルです。詳細については、OpenID 公式 Web サイトをご覧ください。 |
スコープ | スコープは OIDC の概念です。各 IdP は、メールアドレスなど、さまざまな種類のユーザー情報を保存します。各タイプはスコープに対応しています。アプリケーションにアクセスするために IdP を使用して ID を検証する場合、アプリケーションは指定されたタイプの情報のみを取得できます。 |
手順
ステップ 1:サンプルアプリケーションと Keycloak アプリケーションをデプロイする
ステップ 2:イングレスゲートウェイを使用して httpbin アプリケーションと Keycloak アプリケーションをインターネットに公開する
この例では、httpbin アプリケーションへのアクセスには HTTPS ポート 443 を使用し、Keycloak コンソールへのアクセスには HTTP ポート 80 を使用します。
myexample-credential という名前の証明書を HTTPS サービス用に作成します。詳細については、「イングレスゲートウェイを使用して HTTPS を有効にする」をご参照ください。
次の YAML ファイルを使用して ACK クラスターに Istio ゲートウェイと仮想サービスを作成し、Keycloak アプリケーションをインターネットに公開します。
ブラウザーのアドレスバーに http://${イングレスゲートウェイの IP アドレス} と入力して、Keycloak アプリケーションにアクセスします。
[管理コンソール] をクリックし、Keycloak アプリケーションのデプロイ時に指定した管理者アカウントとパスワードを使用して Keycloak コンソールにログオンします。
ステップ 3:Keycloak を構成する
Keycloak コンソールの左側のナビゲーションペインで、[マスター] をクリックし、次に [レルムの作成] をクリックします。
新しいレルムの構成ページで、次の図に示すようにクライアントを作成します。
次の図に示すように、ユーザーを作成します。[保存] をクリックします。
[ユーザーの詳細] ページで、[認証情報] タブをクリックします。
表示されるダイアログボックスで、ログオンパスワードを設定します。[保存] をクリックします。
次の図に示すように、レルムロールを作成します。[保存] をクリックします。
[ユーザーの詳細] ページで、[ロールマッピング] タブをクリックします。
[ロールマッピング] タブで、[ロールの割り当て] をクリックして、ロールをユーザーに割り当てます。
次の図に示すように、クライアントスコープを作成します。[保存] をクリックします。
[クライアントスコープ] ページで、[マッパー] をクリックし、次の図に示すようにマッパーを追加します。[保存] をクリックします。
[スコープ] タブをクリックし、サブステップ 6 で作成したロールを選択して、[割り当て] をクリックします。
クライアント設定ページで、[クライアントスコープ] タブをクリックし、[クライアントスコープの追加] をクリックします。表示されるダイアログボックスで、[追加] をクリックします。
oauth2-proxy クライアントの詳細ページで、[設定] タブをクリックし、有効なリダイレクト URI パラメーターを設定して、[保存] をクリックします。
この例では、Keycloak サービスのみが HTTP プロトコルを使用し、他のすべてのサービスは HTTPS を使用します。したがって、有効なリダイレクト URL の形式は https://${イングレスゲートウェイの IP アドレス}/oauth2/callback です。
Keycloak の構成が完了しました。次の情報を記録する必要があります。
レルム ID:Test-oidc
クライアント ID:oauth2proxy
クライアント設定ページの [認証情報] タブにある クライアントシークレット
ステップ 4:ASM コンソールでカスタム認証サービスを有効にし、OIDC ベースの SSO を構成する
ASM コンソール にログオンします。左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションペインで、 を選択します。
[カスタム認証サービス] ページで、[カスタム認証サービスの定義] をクリックし、[OIDC 認証および承認サービス] タブをクリックします。パラメーターを設定し、[作成] をクリックします。
上記の図のパラメーターは、作成した OIDC アプリケーションの情報に基づいて設定します。ログオン試行をイングレスゲートウェイの IP アドレスにリダイレクトできます。Cookie シークレットの詳細については、「Cookie シークレットの生成」をご参照ください。
Idp OIDC 発行者 URI:http://${イングレスゲートウェイの IP アドレス}/realms/${Keycloak で作成したレルムの ID}
クライアント ID および クライアントシークレット:記録したパラメーター値を使用します。
スコープ:このパラメーターでは 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
説明host の値を、route フィールドで、ACK クラスタ内の istio-system 名前空間 に対応する OAuth2 Proxy サービスの名前に置き換えます。
プレフィックスが /oauth2 であるパスに他の仮想サービスをルーティングしないでください。
ステップ 5:認証ポリシーを作成する
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションペインで、 を選択します。
AuthorizationPolicy ページで、[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
説明認証ポリシーは、ポート 80 に送信されたリクエスト以外のすべてのリクエストを認証する必要があることを指定します。
プロバイダー名は、関連付けられているカスタム認証サービスの名前です。カスタム認証サービスリストでサービス名を取得できます。
ステップ 6:SSO を検証する
ブラウザーで ${外部アクセス用イングレスゲートウェイの IP アドレス:80} にアクセスします。
予期される結果:
前の図に示すページが表示された場合は、SSO が有効になっています。
[openid Connect でサインイン] をクリックします。Keycloak でのログオンのページで、ステップ 3 で作成したテストユーザー名とパスワードを入力し、ログオンボタンをクリックします。
予期される結果:
[リクエストの検査] をクリックし、 を選択します。
予期される結果:
前のステップで bearer 認証後のリクエストに含まれる JSON Web トークン(JWT)を JWT デバッガーで解析します。 JWT デバッガーの詳細については、JWT 公式 Web サイトをご参照ください。
予期される結果:
前の図の情報は、JWT が解析された後に表示されます。これには、Keycloak に保存されているユーザー情報が含まれます。JWT は ASM によって検証されます。