サービスメッシュ内のアプリケーションでは、多くの場合、ユーザー認証が必要となります。しかし、各アプリケーションにログインロジックを実装するのは、コストがかかり、エラーも発生しやすくなります。Service Mesh (ASM) は、ゲートウェイレベルで認証を外部の ID プロバイダー (IdP) に委任します。これにより、イングレスゲートウェイの背後にあるすべてのアプリケーションは、コードを一切変更することなく、単一のシングルサインオン (SSO) フローを共有できます。このガイドでは、OpenID Connect (OIDC) を介して、Alibaba Cloud Identity as a Service (IDaaS) を IdP として使用します。
仕組み
ユーザーが ASM イングレスゲートウェイ経由でアプリケーションにリクエストを送信すると、次のようになります。
OIDC 権限付与サービスがリクエストをインターセプトし、有効なセッションがあるか確認します。
有効なセッションが存在しない場合、ユーザーは IDaaS のログインページにリダイレクトされます。
認証後、IDaaS は JSON Web トークン (JWT) を発行し、ユーザーをアプリケーションにリダイレクトして戻します。
ASM は JWT を検証し、認証されたユーザー ID とともにリクエストをアプリケーションに転送します。
IDaaS (または任意の OIDC 互換 IdP) を ASM のカスタム権限付与サービスとして登録すると、メッシュがゲートウェイの背後にあるすべてのアプリケーションの認証を処理します。
基本概念
| 概念 | 説明 |
|---|---|
| IdP (ID プロバイダー) | デジタル ID を保存および検証するシステムです。たとえば、Alipay アカウントとパスワードを使用して Youku にログインする場合、Alipay が IdP となります。 |
| OIDC | OAuth 2.0 上に構築された標準の ID 認証プロトコルです。詳細については、OpenID 公式ウェブサイトをご参照ください。 |
| スコープ | アプリケーションがアクセスできるユーザー情報の種類を制御する OIDC パラメーターです。メールアドレスなどの各情報タイプは、それぞれ 1 つのスコープに対応します。 |
前提条件
開始する前に、次のものが揃っていることを確認してください。
Enterprise Edition の ASM インスタンス。詳細については、「ASM インスタンスの作成」をご参照ください。
ACK マネージドクラスター。詳細については、「ACK マネージドクラスターの作成」をご参照ください。
default 名前空間でサイドカーの自動インジェクションが有効になっていること。詳細については、「サイドカープロキシの自動インジェクションを有効にする」をご参照ください。
ステップ 1:IDaaS インスタンスとテストアカウントの作成
IDaaS インスタンスは独立したアカウントシステムとして機能します。後で SSO を検証するために、インスタンスを作成し、テストユーザーを追加します。
IDaaS コンソールにログインし、IDaaS インスタンスを作成します。
EIAM ページの [IDaaS] タブで、IDaaS インスタンスの [ID] をクリックします。
左側のナビゲーションウィンドウで、[アカウント] > [アカウントと組織] を選択します。
「アカウント」ページの[アカウント]タブで、[ユーザーの作成]をクリックします。
[ユーザーの作成] パネルで、パラメーターを設定し、[確認] をクリックします。
ステップ 2:OIDC アプリケーションの追加と設定
IDaaS はさまざまな種類のアプリケーションをサポートしています。この例では、OIDC アプリケーションが ID システムをメッシュアプリケーションに公開し、SSO を実現します。
IDaaS インスタンスの詳細ページの左側のナビゲーションウィンドウで、[アプリケーション] をクリックします。
「[アプリケーション]」ページで、「[アプリケーションの追加]」をクリックします。
[アプリケーションの追加] ページで、[標準プロトコル] タブをクリックします。[OIDC] カードで、[アプリケーションの追加] をクリックします。
[アプリケーションの追加 - OIDC] ダイアログボックスで、アプリケーション名を入力し、[追加] をクリックします。
OIDC アプリケーションの詳細ページで、[サインイン] をクリックし、次に [SSO] タブをクリックします。
[シングルサインオン (SSO)] タブで、[リダイレクト URI] を設定します。[詳細設定を表示] をクリックします。[スコープ] セクションで、アプリケーションがアクセスできる情報の種類を選択します。その後、[保存] をクリックします。
説明リダイレクト URI パラメーターを
http://<CLB-instance-IP>/oauth2/callbackに設定します。<CLB-instance-IP>は、イングレスゲートウェイにバインドされている CLB インスタンスの IP アドレスに置き換えてください。OIDC アプリケーションの詳細ページで、[サインイン] をクリックし、次に [アプリケーション権限の付与] タブをクリックします。[アプリケーション権限の付与] タブで、[承認] をクリックします。
「[承認]」ダイアログボックスで、ステップ 1 で作成したアカウントを承認し、[確認] をクリックします。
OIDC アプリケーションの設定後、次の値を記録します。これらの値は、ASM インスタンスで SSO を設定する際に必要になります。
| 値 | 場所 |
|---|---|
| 発行者 | OIDC アプリケーション詳細ページの [SSO] タブの [アプリケーション設定] セクション。![]() |
| client_id と client_secret | [一般]OIDC アプリケーション詳細ページの タブ。![]() |
ステップ 3:テストアプリケーションのデプロイとイングレスゲートウェイ経由での公開
SSO の設定を検証するために、httpbin アプリケーションをデプロイします。httpbin は、認証後に IdP が付加する ID 情報を含むリクエストの詳細を表示します。
Istio ゲートウェイの設定
次の内容で YAML ファイルを作成し、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
number: 80
protocol: HTTP仮想サービスの作成
次の内容で YAML ファイルを作成し、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デプロイメントの検証
次のコマンドを実行して、httpbin がイングレスゲートウェイ経由でアクセス可能であることを確認します。
curl -I http://<ingress-gateway-IP>:80<ingress-gateway-IP> をご利用のイングレスゲートウェイの IP アドレスに置き換えます。期待される出力は、次のような HTTP 200 応答です。
HTTP/1.1 200 OK
server: istio-envoy
ステップ 4:カスタム権限付与サービスの登録と OIDC SSO の設定
OIDC 権限付与サービスの登録
「ASM コンソール」にログインします。左側のナビゲーションウィンドウで、Service Mesh > メッシュ管理 を選択します。
[メッシュ管理]ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、[メッシュセキュリティセンター] > [カスタム認可サービス]を選択します。表示されたページで、[カスタム認可サービスの定義]をクリックします。
[カスタム認可サービスの登録] ページで、[OIDC 認可・認証サービス] タブをクリックし、パラメーターを構成してから [作成] をクリックします。 ステップ 2 の Issuer、client_id、および client_secret の値を使用します。 リダイレクト URL をイングレスゲートウェイの IP アドレスに設定します。 cookie シークレットの生成の詳細については、Cookie シークレットの生成をご参照ください。
権限付与サービスのドメイン名の取得
kubeconfig ファイルを使用してデータプレーン上の ACK クラスターに接続し、次のコマンドを実行します。
kubectl get svc -n istio-system | grep oauth2proxy | awk -F' ' '{print $1}'出力は OIDC 権限付与サービスのドメイン名です。例:
oauth2proxy-xxxx次のステップのためにこの値を記録しておきます。
認証リクエスト用の仮想サービスの作成
イングレスゲートウェイから OIDC 権限付与サービスへの認証リクエストをルーティングするための仮想サービスを作成します。<OIDC-authorization-service-domain-name> を前のステップで取得したドメイン名に置き換えます。
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: <OIDC-authorization-service-domain-name>
port:
number: 4180他の仮想サービスのルーティングルールで、マッチングプレフィックスを /oauth2 に設定しないでください。これにより、仮想サービス間の競合を防ぐことができます。
ステップ 5:権限付与ポリシーの作成
イングレスゲートウェイを通過するすべてのリクエストに OIDC 認証を強制する権限付与ポリシーを適用します。
ASM インスタンスの詳細ページで、左側のナビゲーションウィンドウから [Mesh Security Center] > [AuthorizationPolicy] を選択します。表示されるページで、[YAML から作成] をクリックします。
[作成] ページで、istio-system 名前空間を選択し、テンプレートを選択し、次の YAML をコードエディタに貼り付け、[作成] をクリックします。
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: oidc
namespace: istio-system
spec:
action: CUSTOM
provider:
name: httpextauth-oidc # ステップ 4 で登録した権限付与サービスの名前。
rules:
- {}
selector:
matchLabels:
istio: ingressgatewayこの権限付与ポリシーは、イングレスゲートウェイに送信されるすべてのリクエストに適用されます。
ステップ 6:SSO の検証
ブラウザで
http://<ingress-gateway-IP>:80を開きます。<ingress-gateway-IP>をご利用のイングレスゲートウェイの IP アドレスに置き換えます。SSO が正しく設定されている場合、次のページが表示されます。
[OpenID Connectでサインイン]をクリックします。Alibaba Cloud IDaaS ログインページが表示されます。

手順 1 のテストアカウントとパスワードを入力し、[ログオン] をクリックします。認証後、httpbin アプリケーションページが表示されます:

[検査のリクエスト] をクリックし、次に [/headers] > [試す] > [実行] を選択します。レスポンスヘッダーには、IDaaS によって発行された JWT が含まれます:

JWT (応答内の
Bearerの後の文字列) をコピーし、JWT デバッガーに貼り付けてトークンをデコードします。デコードされた JWT には、IDaaS に保存されているユーザー情報が含まれています。この JWT は ASM によって検証されます。

