このトピックでは、Service Mesh (ASM) 内のアプリケーションへのシングルサインオン (SSO) を実装する方法について説明します。
前提条件
Enterprise Edition の ASM インスタンスが作成されていること。詳細については、「ASM インスタンスの作成」をご参照ください。
ACK マネージドクラスターが作成されていること。詳細については、「ACK マネージドクラスターの作成」をご参照ください。
クラスターが ASM インスタンスに追加されていること。詳細については、「ASM インスタンスへのクラスターの追加」をご参照ください。
デフォルトの名前空間で自動サイドカーインジェクションが有効になっていること。詳細については、「自動サイドカープロキシインジェクションの有効化」をご参照ください。
背景情報
ほとんどの場合、アクセス制御メカニズムのため、アプリケーションにアクセスするにはログオンする必要があります。システムには多くのアプリケーションが存在する可能性があります。SSO を使用すると、1 つのログオン資格情報のセットですべてのアプリケーションにアクセスできます。資格情報を一度送信し、カスタム認証サービスを使用してコードを変更することなく、ASM インスタンス内のすべてのアプリケーションにアクセスできます。
この機能は、アプリケーションの変換と O&M のコストを削減するのに役立ちます。この例では、Alibaba Cloud IDaaS インスタンスを ID プロバイダー (IdP) として使用して、ASM インスタンス内のすべてのアプリケーションへの SSO を実装します。メッシュ内のアプリケーションの認証メカニズムを実装する必要はありません。代わりに、Alibaba Cloud IDaaS インスタンスまたは任意の OpenID Connect (OIDC) IdP を ASM のカスタム認証サービスに登録することで、認証を IdP に委任できます。ユーザーが IdP によって認証されると、IdP は認証の詳細とユーザーリクエストをアプリケーションに送信し、信頼されたユーザーがアプリケーションにアクセスできるようにします。
概念
概念 | 説明 |
IdP | IdP は、デジタル ID を保存および検証するシステムです。たとえば、アカウントとパスワードを使用して ID を検証できます。Alipay アカウントとパスワードを使用して Youku にログオンする場合、Alipay が IdP です。 |
OIDC | OIDC は、OAuth 2.0 プロトコルに基づく標準 ID 認証プロトコルです。詳細については、OpenID 公式 Web サイト をご参照ください。 |
スコープ | スコープは OIDC の概念です。各 IdP は、メールアドレスなど、さまざまな種類のユーザー情報を保存します。各タイプはスコープに対応しています。IdP を使用してアプリケーションにアクセスするための ID を検証する場合、アプリケーションは指定された種類の情報のみを取得できます。 |
手順 1:IDaaS インスタンスとテストアカウントを作成する
IDaaS コンソール にログオンし、IDaaS インスタンスを作成します。
IDaaS インスタンスは独立したアカウントシステムと見なされます。
EIAM ページの [idaas] タブで、IDaaS インスタンスの ID をクリックします。
左側のナビゲーションペインで、 を選択します。
[アカウント] ページの [アカウント] タブで、[ユーザーの作成] をクリックします。
[ユーザーの作成] パネルで、パラメーターを設定し、[確認] をクリックします。
手順 2:OIDC アプリケーションを追加および設定する
SSO を実装するために IDaaS インスタンスを公開するインターフェースとして、IDaaS インスタンスにアプリケーションを追加できます。IDaaS はさまざまな種類のアプリケーションをサポートしています。この例では、OIDC アプリケーションを使用します。
IDaaS インスタンスの詳細ページの左側のナビゲーションペインで、[アプリケーション] をクリックします。
[アプリケーション] ページで、[アプリケーションの追加] をクリックします。
[アプリケーションの追加] ページで、[標準プロトコル] タブをクリックします。[OIDC] カードで、[アプリケーションの追加] をクリックします。
表示される [アプリケーションの追加 - OIDC] ダイアログボックスで、アプリケーション名を入力し、[追加] をクリックします。
OIDC アプリケーションの詳細ページで、[サインイン] をクリックし、次に [SSO] タブをクリックします。
[SSO] タブで、[リダイレクト URI] を設定します。[詳細設定を表示] をクリックします。[スコープ] セクションで、アプリケーションが取得できる情報の種類を選択します。次に、[保存] をクリックします。
説明この例では、リダイレクト URI パラメーターを
http://${イングレスゲートウェイにバインドされている CLB インスタンスの IP アドレス}/oauth2/callback
に設定します。${}
プレースホルダーを、イングレスゲートウェイにバインドされている SLB インスタンスの実際の IP アドレスに置き換えます。OIDC アプリケーションの詳細ページで、[サインイン] をクリックし、次に [アプリケーション権限の付与] タブをクリックします。[アプリケーション権限の付与] タブで、[承認] をクリックします。
[承認] ダイアログボックスで、手順 1 で作成したアカウントを承認し、[確認] をクリックします。
OIDC アプリケーションが設定されています。発行者、client_id、および client_secret の値を記録します。これらの値は、ASM インスタンスで SSO を設定するときに使用されます。
発行者:発行者の値を取得するには、OIDC アプリケーションの詳細ページの [SSO] タブに移動し、[アプリケーション設定] セクションを表示します。
client_id および client_secret:client_id および client_secret の値を取得するには、OIDC アプリケーションの詳細ページの [一般] タブに移動します。
手順 3:テストアプリケーションをデプロイし、イングレスゲートウェイを使用して公開する
この例では、httpbin アプリケーションがデプロイされています。このアプリケーションを使用すると、ログオン認証中に IdP から取得した情報を含むリクエストコンテンツを表示できます。
ACK クラスターのデフォルトの名前空間に httpbin アプリケーションをデプロイするために、次のコンテンツを含む YAML ファイルを作成します。
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
ASM インスタンスの Istio ゲートウェイを設定するために、次のコンテンツを含む YAML ファイルを作成します。詳細については、「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
ASM インスタンスの仮想サービスを作成するために、次のコンテンツを含む 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
curl -I http://${イングレスゲートウェイの IP アドレス:80}
コマンドを実行して、httpbin アプリケーションにアクセスします。出力例:
手順 4:カスタム認証サービスを登録し、ASM インスタンスで OIDC SSO を設定する
ASM コンソール にログオンします。左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションペインで、 を選択します。表示されるページで、[カスタム認証サービスの定義] をクリックします。
[カスタム認証サービスの登録] ページで、[OIDC Authz And Authn Service] タブをクリックし、パラメーターを設定して、[作成] をクリックします。
手順 2 で作成した OIDC アプリケーションの情報に基づいてパラメーターを設定します。ログオン試行をイングレスゲートウェイの IP アドレスにリダイレクトできます。Cookie シークレットの詳細については、「Cookie シークレットの生成」をご参照ください。
kubeconfig ファイルを使用してデータプレーン上の ACK クラスターに接続し、次のコマンドを実行して OIDC 認証サービスのドメイン名を取得します。
kubectl get svc -n istio-system|grep oauth2proxy|awk -F' ' '{print $1}'
イングレスゲートウェイからの認証リクエストを受信する仮想サービスを作成します。次のサンプルコードは、仮想サービスを作成する方法を示しています。
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 認証サービスのドメイン名。 port: number: 4180
重要他の仮想サービスで定義されているルーティングルールで、一致するプレフィックスを
/oauth2
に設定しないでください。これにより、仮想サービス間の競合を防ぎます。
手順 5:認証ポリシーを作成する
ASM インスタンスの詳細ページで、左側のナビゲーションペインの を選択します。表示されるページで、[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://${イングレスゲートウェイの IP アドレス:80} にアクセスします。
次のページが表示された場合は、SSO が有効になっていることを示します。
[openid Connect でサインイン] をクリックします。
予期される結果:
[alibaba Cloud Idaas] のログオンページで、手順 1 で作成したテストアカウントとパスワードを入力し、[ログオン] をクリックします。
予期される結果:
[リクエスト検査] をクリックし、 を選択します。
予期される結果:
JWT デバッガーで JSON Web トークン (JWT) を解析します。JWT はリクエストを認証するために使用され、前手順で返されたレスポンスの Bearer の後に表示されます。
JWT デバッガーの詳細については、JWT 公式 Web サイト をご参照ください。
予期される結果:
前の図の情報は、JWT の解析後に表示されます。これには、IDaaS に保存されているユーザー情報が含まれます。JWT は ASM によって検証されます。