このトピックでは、Alibaba Cloud Service Mesh (ASM) を使用して、メッシュ内のアプリケーションでシングルサインオン (SSO) を有効にする方法について説明します。
前提条件
ASM エンタープライズインスタンスを作成します。詳細については、「ASM インスタンスの作成」をご参照ください。
ACK マネージドクラスターが作成されています。詳細については、「ACK マネージドクラスターの作成」をご参照ください。
クラスターが ASM インスタンスに追加されている必要があります。
デフォルト名前空間で自動サイドカー注入を有効にします。詳細については、「自動注入の有効化」をご参照ください。
背景情報
多くのアプリケーションでは、認証済みユーザーのみがアクセスできるようにアクセスの制御が必要です。システムが複雑になるにつれて、シングルサインオン (SSO) が実用的なソリューションとして普及しています。SSO を使用すると、1 つのアカウントで複数のシステムにログインできます。ASM はカスタム権限付与サービスを提供し、メッシュ内のアプリケーションに対して非侵入型の SSO を実現します。
ASM を使用した SSO により、アプリケーションの修正および運用コストを削減できます。このトピックでは、ID プロバイダー (IdP) として Alibaba Cloud IDaaS インスタンスを使用して、メッシュ内のアプリケーションで SSO を有効にします。メッシュ内のアプリケーションは、認証または権限付与ロジックを実装する必要はありません。代わりに、ASM のカスタム権限付与サービスを構成して、Alibaba Cloud IDaaS または OpenID Connect (OIDC) プロトコルをサポートする任意の IdP と統合します。認証が成功すると、ASM は元のリクエストをユーザー ID 情報とともにアプリケーションに転送します。アプリケーションは、この ID データに基づいてリクエストを処理できます。
基本概念
概念 | 説明 |
IdP | ID プロバイダー (Identity Provider) の略です。IdP はユーザー名やパスワードなどを使用してユーザーの ID を検証します。たとえば、Alipay アカウントで Youku にログインする場合、Alipay が IdP として機能します。 |
OIDC | OIDC は OpenID Connect の略称であり、OAuth 2.0 上に構築された身分認証プロトコルです。詳細については、「OpenID Connect」をご参照ください。 |
Scope | OIDC の概念です。各 IdP はメールアドレスやプロファイルなどのさまざまな種類のユーザー情報を保存しています。これらのカテゴリはスコープと呼ばれます。認証 (ログイン) 時に、一部の IdP はアプリケーションがアクセスできるユーザーデータをユーザーが選択するよう求めます。各カテゴリはスコープに対応しています。 |
ステップ 1:EIAM クラウド ID サービスインスタンスとテストアカウントの作成
EIAM クラウド ID サービスコンソールにログインし、IDaaS インスタンスを作成します。
説明IDaaS インスタンスは独立したアカウントシステムとして機能します。IDaaS インスタンスの作成は、スタンドアロンのアカウントシステムを構築することと同等です。
EIAM ページで、対象の IDaaS インスタンスの名前をクリックします。
左側のナビゲーションウィンドウで、を選択します。
AccountページのAccountタブで、Create Userをクリックします。
Create Userパネルで、アカウトの詳細を設定し、OKをクリックします。
ステップ 2:OIDC アプリケーションの追加と構成
IDaaS インスタンス内のアプリケーションは API エンドポイントと考えてください。IDaaS インスタンスは、個別のアプリケーションを通じて異なるエンドポイントを公開し、さまざまな SSO 方式をサポートできます。このトピックでは、OIDC アプリケーションを例として使用します。
クラウド ID サービスコンソールの左側のナビゲーションウィンドウで、Application Managementをクリックします。
Application Managementページで、Add Applicationをクリックします。
Add Applicationページで、Standard Protocolsタブをクリックし、OIDCカードのAdd Applicationをクリックします。
Add Application - OIDCダイアログボックスで、Application Nameを設定し、Addをクリックします。
OIDC Applicationの詳細ページで、を選択します。
SSO構成ページで、Redirect URIsを設定します。Show Advanced Settingsをクリックします。scopesの下で取得したい情報を選択し、Saveをクリックします。
説明この例では、リダイレクト URIを
http://${ASM gateway CLB address}/oauth2/callbackに設定します。${}を実際のアドレスに置き換えてください。OIDC Applicationの詳細ページで、を選択し、Authorizeをクリックします。
[Authorize]ダイアログボックスで、手順 1 で作成したユーザーに権限を付与し、[Confirm]をクリックします。
OIDC アプリケーションの構成が完了したら、現在のアプリケーションのIssuer、client_id、client_secretなどの構成情報を記録し、ASM でのシングルサインオン構成時に使用します。
Issuer: にあります。

client_idおよびclient_secret: Generalセクションにあります。

ステップ 3:テストアプリケーションのデプロイとゲートウェイ経由での公開
このトピックでは、テストに httpbin アプリケーションを使用します。httpbin はリクエストの内容を確認できるため、ログイン後に IdP から取得したユーザー情報を検証しやすくなります。
次の YAML を使用して、ご利用の ACK クラスターのデフォルト名前空間に httpbin アプリケーションをデプロイします。
ASM コンソールで次の YAML を使用して、ご利用の ASM インスタンスのゲートウェイルールを構成します。詳細については、「ゲートウェイルールの管理」をご参照ください。
apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: ingressgateway namespace: istio-system spec: selector: app: istio-ingressgateway servers: - hosts: - '*' port: name: http number: 80 protocol: HTTP次の仮想サービスを ASM インスタンスに適用します。詳細については、「仮想サービスの管理」をご参照ください。
この仮想サービスは、httpbin アプリケーションへのデフォルトルーティングルールを定義します。
apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: ingressgateway-vs namespace: istio-system spec: gateways: - ingressgateway hosts: - '*' http: - name: default route: - destination: host: httpbin.default.svc.cluster.local port: number: 8000ゲートウェイルールと仮想サービスの構成後、コマンド
curl -I http://${ASM gateway external IP}:80を実行して、直接 httpbin サービスにアクセスします。出力例:

ステップ 4:ASM カスタム権限付与サービスの有効化と OIDC シングルサインオンの構成
-
ASM コンソールにログインします。左側のナビゲーションウィンドウで、を選択します。
-
メッシュ管理ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、を選択します。表示されたページで、カスタム権限付与サービスの定義をクリックします。
Define External Authorization Serviceページで、OIDC Authz and Authn Serviceタブをクリックし、必要な設定を行って、Createをクリックします。
説明OIDC アプリケーションの詳細はステップ 2から取得します。ログインリダイレクトアドレスとして ASM ゲートウェイを使用できます。Cookie Secret の詳細については、「Generating a Cookie Secret」をご参照ください。
データプレーンクラスターの KubeConfig を使用して、次のコマンドを実行し、OIDC 外部権限付与サービスのドメイン名を取得します。
kubectl get svc -n istio-system|grep oauth2proxy|awk -F' ' '{print $1}'次の YAML を使用して、ASM ゲートウェイからの認証リクエストを処理する仮想サービスを作成します。
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: # 前のステップで取得した外部権限付与サービスのドメイン名。 port: number: 4180重要競合を避けるため、プレフィックス
/oauth2を持つパスに一致する他の仮想サービスがないことを確認してください。
ステップ 5:権限付与ポリシーの作成
-
ASM インスタンスの詳細ページで、左側のナビゲーションウィンドウからを選択します。表示されたページで、YAML から作成をクリックします。
Createページで、NamespacesとScenario Templateを選択します。次の YAML を構成し、Createをクリックします。
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: oidc namespace: istio-system spec: action: CUSTOM provider: name: httpextauth-oidc # 以前に作成したカスタム権限付与ポリシーの名前。 rules: - {} selector: matchLabels: istio: ingressgateway説明この権限付与ポリシーは、ASM ゲートウェイに入るすべてのリクエストに適用されます。
ステップ 6:結果の検証
ブラウザでhttp://${ASM gateway external IP}:80にアクセスします。
次のページが表示された場合、SSO は正常に動作しています。

OpenID Connect でサインインをクリックします。
期待される結果:

Alibaba Cloud IDaaSログインページで、ステップ 1で作成したテストアカウトとパスワードを入力し、ログインをクリックします。
期待される結果:

リクエストの検査をクリックし、/headers > try it out > Executeを選択します。
期待される結果:

Bearerの後のリクエストに含まれる JWT トークンを JWT デバッガーを使用して解析します。
JWT デバッガーの詳細については、「JWT debugger」をご参照ください。
期待される結果:
正常に解析されると、IDaaS に保存されているユーザー情報が表示されます。JWT は ASM によっても検証されています。