NSX Advanced Load Balancer は、OAuth/OIDC のユースケースではクライアントおよびリソース サーバとして機能することがあります。

クライアントおよびリソース サーバ NSX Advanced Load Balancer では、要求があると、認可コードをエンド ユーザーから取得し、認可コードを access_token に交換し、その access_token を検証し、トークン検証および認可ポリシーに基づいてクライアントがリソースにアクセスするのを許可します。

同じく仮想サービスもクライアントおよびリソース サーバとして機能します。

要求フロー

要求フローは、次のように説明できます。



  1. リソースの所有者がアプリケーションへのアクセスを試みます。

  2. クライアント (NSX Advanced Load Balancer) では、リソースの所有者のユーザー エージェントを認可エンドポイントに送信して、フローを開始します。NSX Advanced Load Balancer ではクライアントとして、セッション情報を格納します。このセッション情報には、そのクライアント ID や、アクセス権が付与(または拒否)されると認可サーバのユーザー エージェント返送先となるリダイレクト URI/コールバック URI などがあります。

  3. リソースの所有者が、認可エンドポイントの認可サーバに要求を送信します。

  4. 認可サーバでは(ユーザー エージェントを使用して)リソースの所有者を認証し、リソースの所有者がクライアントの要求するアクセス権を付与するか拒否するかを定めます。リソースの所有者がアクセス権を付与すると仮定すれば、認可サーバから、先に(要求で、またはクライアント登録時)指定したリダイレクト URI/コールバック URI を使用して、ユーザー エージェントをクライアントにリダイレクトして返します。このリダイレクト URI には認可コードが含まれています。

  5. リソースの所有者が、クライアント リダイレクト URL と認可コードを含む要求を送信します。

  6. クライアントでは、認可サーバのトークン エンドポイントからの access_token を要求します。要求には、前の手順で受信した認可コードを含めます。要求を行う際、クライアントでは client_idclient_secret を使用して、認可サーバによる認証を受けます。

  7. 認可サーバでクライアントを認証し、認可コードを検証します。有効であれば、認可サーバから access_token で応答し、オプションで、更新トークンが提供されます。OIDC が有効化されていれば、id_token も認可サーバによって発行されます。

  8. NSX Advanced Load Balancer はクライアントとして、セッション Cookie を設定し、リソース URL を使用してリソースの所有者に要求を送信します。

  9. リソースの所有者は、セッション Cookie を使用して要求を送信します。要求を受信すると、NSX Advanced Load Balancer は、セッション Cookie を使用して access_token を取得します。

  10. リソース サーバ NSX Advanced Load Balancer では、access_token を検証します。アクセス トークンのタイプが JWT の場合、NSX Advanced Load Balancer 単独で access_token を検証します。アクセス トークンのタイプが opaque の場合、NSX Advanced Load Balancer から認可サーバのイントロスペクション エンドポイントに要求を送信して、opaque トークンを検証します。NSX Advanced Load Balancer 22.1.3 以降はイントロスペクション データのキャッシュがサポートされているため、NSX Advanced Load Balancer(リソース サーバ)と認可サーバ間の通信を要求ごとに回避することができます。

  11. 検証結果に基づいて、NSX Advanced Load Balancer でアクセス権を付与するか拒否します。

  12. access_token が検証されると、要求はバックエンド サーバに送信されます。

  13. サーバが応答します。

  14. NSX Advanced Load Balancer からリソースの所有者に応答が送信されます。これより後の要求では、セッション ID を伝達する必要があり、手順 10 ~ 14 に従わなければなりません。

クライアントおよびリソース サーバとしての NSX Advanced Load Balancer 仮想サービスの役割

OAuth クライアントの役割は次のとおりです。

  1. 非認証クライアントをプロバイダの認可エンドポイントにリダイレクトすること - 同所の状態とノンスのパラメータを生成すること。現在、ノンスは認可コード フローに必須ではないため生成されません。

  2. コードをトークンと交換してアクセス トークンと ID トークンを取得すること(OIDC の場合)。

  3. ID トークン検証 (JWT) - OIDC ではアクセス トークン ハッシュの検証を必須としています。

  4. セッション情報(アクセス トークンやリフレッシュ トークン、ID トークンによる関連詳細情報など)を保存すること。

  5. セッション Cookie を作成し、クライアント応答を設定すること。

  6. エンド ユーザーが適切なセッション Cookie を提示したら、要求をリソース サーバに委任する。

  7. access_tokens の期限が切れたら更新すること。

OAuth リソース サーバの役割は次のとおりです。

  • 次の方法を使用して access_token を検証すること。

    • jwks_uri からダウンロードした JWKS URI による JWT 検証。

    • opaque トークンの場合はイントロスペクションベースの検証。

リフレッシュ トークンを使用した新規アクセス トークンの取得(NSX Advanced Load Balancer を使用)



要求が NSX Advanced Load Balancer 仮想サービスに送信されると、アクセス トークンがセッション Cookie を使用して取得されます。アクセス トークンが期限切れの場合、NSX Advanced Load Balancer は更新トークンを認可サーバのトークン エンドポイントに送信して新しい access_token を取得します。認可サーバからは access_tokenid_token で応答します。NSX Advanced Load Balancer(クライアント)は、id_token を検証し、id_tokenaccess_token を格納し、セッション Cookie を更新します。続いて access_token が検証されます。検証が正常に完了すると、リソースへのアクセス権が付与されます。

UserInfo エンドポイントの使用



注:

Cookie がクライアントに発行された後の要求フローは、前述の要求フロー図に示したものと同じです。

[UserInfo] エンドポイントを使用すると、ユーザーに関する ID 情報を取得できます。ユーザー情報を [UserInfo] エンドポイントから抽出するのは、[UserInfo] フラグが OIDC パラメータに構成されている場合です。[UserInfo] フラグが OIDC パラメータに構成されていない場合、ユーザー情報は id_token のいずれかの要求から抽出されます。

ユーザー インターフェイスを使用した構成

この後に示す一意のホストは、認可プロファイルで使用されるさまざまなエンドポイントに関連付けられています。たとえば、この構成ガイドで認可サーバとして使用されているのは Okta です。

Okta エンドポイントは次のとおりです。

エンドポイントのタイプ

エンドポイント

認可エンドポイント

https://dev-477407.oktapreview.com/oauth2/v1/authorize

トークン エンドポイント

https://dev-477407.oktapreview.com/oauth2/v1/token

イントロスペクション エンドポイント

https://dev-477407.oktapreview.com/oauth2/v1/introspect

jwks_uri

https://dev-477407.oktapreview.com/oauth2/v1/keys

発行者

https://dev-477407.oktapreview.com

UserInfo エンドポイント

https://dev-477407.oktapreview.com/oauth2/v1/userinfo

ここで、

  1. unique_fqdn = dev-477407.oktapreview.com

  2. 作成するのは、サーバを含むプール = 一意のホスト/FQDN または IP アドレス + 手順 2 に示したポート。

注:
  • OAuth は HTTPS と併用することが推奨されます。そのため、プールでは SSL をポート 443 で有効化しておく必要があります。

  • 一部の認可サーバでは、エンドポイントごとに異なる FQDN/ホストを持つことができます。その場合、すべてのホストをプール構成にサーバとして追加する必要があります。

プールの構成

プールを構成する手順は次のとおりです。

  • [アプリケーション] > [プール] の順に移動します。

  • [プールの作成] をクリックするか、既存のプールを編集します。

  • 詳細をフィールドに指定します。完全な構成手順については、「[プールの作成]」を参照してください。

  • [タイプ][OAuth] を選択します。

  • [サーバ] タブで、[サーバの選択基準] フィールドに詳細を入力し、[追加] をクリックします。



  • [保存] をクリックします。

認証プロファイルの構成

認証プロファイルを構成する手順は次のとおりです。

  • [アプリケーション] > [仮想サービス] の順に移動します。

  • [作成] をクリックするか、既存の仮想サービスを編集します。

  • [ポリシー ] > [アクセス] の順に移動します。

  • [アクセス ポリシー] で、[OAuth] を選択します。

  • [認証プロファイル] ドロップダウン メニューで [プロファイルの作成] を選択します。



  • [認証プロファイルの作成] 画面で、目的の [名前][タイプ][OAuth/OIDC] として入力します。

  • 次のいずれかの手順を実行してエンドポイントを構成します。

    • エンドポイントを自動的に構成して取得するには、次の手順を実行します。

      • URL を [エンドポイントのインポート] に入力します。



      • [インポート] をクリックします。

    • エンドポイントを手動で構成するには、必要な詳細情報を入力します。

  • プールを [プール] から選択します。

  • Save をクリックします。

SSO ポリシーの構成

SSO ポリシーを構成する手順は次のとおりです。

  • [アプリケーション] > [仮想サービス] の順に移動します。

  • [作成] をクリックするか、既存の仮想サービスを編集します。

  • [ポリシー ] > [アクセス] の順に移動します。

  • [アクセス ポリシー] で、[OAuth] を選択します。

  • [SSO ポリシー] ドロップダウン メニューから [SSO ポリシーの作成] を選択するか、既存の SSO ポリシーを編集します。



  • [SSO ポリシーの編集] 画面で、必要な詳細情報を入力します。



  • [保存] をクリックします。

仮想サービスの OAuth 設定の構成

注:

これは仮想サービスがすでに構成されていることを前提としています。仮想サービスで OAuth/OIDC 固有の構成を有効化します。

  • [アプリケーション] > [仮想サービス] の順に移動します。

  • [作成] をクリックするか、既存の仮想サービスを編集します。

  • [ポリシー ] > [アクセス] の順に移動します。

  • [アクセス ポリシー] で、[OAuth] を選択します。

  • [SSO ポリシー] ドロップダウン メニューから [SSO ポリシーの作成] を選択するか、既存の SSO ポリシーを編集します。

  • 必要な詳細情報を入力します。



    注:

    OAuth 仮想サービスを構成するのにユーザー インターフェイスを使用する場合は、範囲を少なくとも 1 つ構成する必要があります。展開で範囲を必要としない場合は、プレースホルダ範囲をユーザー インターフェイスで構成し、後で CLI を使用して削除します。

  • [保存] をクリックします。

CLI を使用したプールの構成

CLI を使用してプールを構成するには、次に示すようにします。

[admin: ctrl]: > configure pool okta-pool
[admin: ctrl]: pool> default_server_port 443
[admin: ctrl]: pool> ssl_profile_ref System-Standard
[admin: ctrl]: pool> servers
[admin: ctrl]: pool:servers> hostname dev-477407.oktapreview.com
[admin:ctrl]: pool:servers> resolve_server_by_dns
[admin:ctrl]: pool:servers> resolve_server_by_dns 
[admin:ctrl]: pool:servers> save
[admin:ctrl]: pool> save
+-------------------------------------------+------------------------------------------------+
| Field                                     | Value                                          |
+-------------------------------------------+------------------------------------------------+
| uuid                                      | pool-ae3e31cb-eaf9-4014-b3f0-2a7391b9f767      |
| name                                      | okta-pool                                      |
| default_server_port                       | 443                                            |
| graceful_disable_timeout                  | 1 min                                          |
| connection_ramp_duration                  | 10 min                                         |
| max_concurrent_connections_per_server     | 0                                              |
| servers[1]                                |                                                |
|   ip                                      | 34.236.241.37                                  |
|   hostname                                | dev-477407.oktapreview.com                     |
|   enabled                                 | True                                           |
|   ratio                                   | 1                                              |
|   verify_network                          | False                                          |
|   resolve_server_by_dns                   | True                                           |
|   static                                  | False                                          |
|   rewrite_host_header                     | False                                          |
| servers[2]                                |                                                |
|   ip                                      | 34.236.241.36                                  |
|   hostname                                | dev-477407.oktapreview.com                     |
|   enabled                                 | True                                           |
|   ratio                                   | 1                                              |
|   verify_network                          | False                                          |
|   resolve_server_by_dns                   | True                                           |
|   static                                  | False                                          |
|   rewrite_host_header                     | False                                          |
| servers[3]                                |                                                |
|   ip                                      | 34.236.241.38                                  |
|   hostname                                | dev-477407.oktapreview.com                     |
|   enabled                                 | True                                           |
|   ratio                                   | 1                                              |
|   verify_network                          | False                                          |
|   resolve_server_by_dns                   | True                                           |
|   static                                  | False                                          |
|   rewrite_host_header                     | False                                          |
| lb_algorithm                              | LB_ALGORITHM_LEAST_CONNECTIONS                 |
| lb_algorithm_hash                         | LB_ALGORITHM_CONSISTENT_HASH_SOURCE_IP_ADDRESS |
| ssl_profile_ref                           | System-Standard                                |
| inline_health_monitor                     | True                                           |
| use_service_port                          | False                                          |
| capacity_estimation                       | False                                          |
| capacity_estimation_ttfb_thresh           | 0 milliseconds                                 |
| vrf_ref                                   | global                                         |
| fewest_tasks_feedback_delay               | 10 sec                                         |
| enabled                                   | True                                           |
| request_queue_enabled                     | False                                          |
| request_queue_depth                       | 128                                            |
| host_check_enabled                        | False                                          |
| sni_enabled                               | True                                           |
| rewrite_host_header_to_sni                | False                                          |
| rewrite_host_header_to_server_name        | False                                          |
| lb_algorithm_core_nonaffinity             | 2                                              |
| lookup_server_by_name                     | False                                          |
| analytics_profile_ref                     | System-Analytics-Profile                       |
| tenant_ref                                | admin                                          |
| cloud_ref                                 | Default-Cloud                                  |
| server_timeout                            | 0 milliseconds                                 |
| delete_server_on_dns_refresh              | True                                           |
| enable_http2                              | False                                          |
| ignore_server_port                        | False                                          |
| routing_pool                              | False                                          |
| append_port                               | NON_DEFAULT_80_443                             |
| http2_properties                          |                                                |
|   max_http2_control_frames_per_connection | 0                                              |
|   max_http2_header_field_size             | 4096 bytes                                     |
| server_disable_type                       | DISALLOW_NEW_CONNECTION                        |
| use_service_ssl_mode                      | False                                          |
+-------------------------------------------+------------------------------------------------+

CLI を使用した認証プロファイルの構成

CLI を使用して認証プロファイルを構成するには、次に示すようにします。

[admin:ctrl]: > configure authprofile Okta-OAuth
[admin:ctrl]: authprofile> type auth_profile_oauth
[admin:ctrl]: authprofile> oauth_profile
[admin:ctrl]: authprofile:oauth_profile>
authorization_endpoint   URL of authorization server.
cancel                   Exit the current submode without saving
do                       Execute a show command
introspection_endpoint   URL of token introspection server.
issuer                   Uniquely identifiable name of the Token Issuer.
jwks_timeout             Lifetime of the cached JWKS keys.
jwks_uri                 JWKS URL of the endpoint that hosts the public keys that can be used to verify any JWT issued by...
no                       Remove field
oauth_resp_buffer_sz     Buffering size for the responses from the OAUTH enpoints.
pool_ref                 Pool object to interface with Authorization Server endpoints.
save                     Save and exit the current submode
show_schema              show object schema
token_endpoint           URL of token exchange server.
userinfo_endpoint        URL of the Userinfo Endpoint.
watch                    Watch a given show command
where                    Display the in-progress object
[admin:ctrl]: authprofile:oauth_profile> authorization_endpoint https://dev-477407.oktapreview.com/oauth2/v1/authorize
[admin:ctrl]: authprofile:oauth_profile> token_endpoint https://dev-477407.oktapreview.com/oauth2/v1/token
[admin:ctrl]: authprofile:oauth_profile> introspection_endpoint https://dev-477407.oktapreview.com/oauth2/v1/introspect
[admin:ctrl]: authprofile:oauth_profile> jwks_uri https://dev-477407.oktapreview.com/oauth2/v1/keys
[admin:ctrl]: authprofile:oauth_profile> issuer https://dev-477407.oktapreview.com    
[admin:ctrl]: authprofile:oauth_profile> userinfo_endpoint https://dev-477407.oktapreview.com/oauth2/v1/userinfo
[admin:ctrl]: authprofile:oauth_profile> pool_ref okta-pool
[admin:ctrl]: authprofile:oauth_profile> save
[admin:ctrl]: authprofile> save

+--------------------------+---------------------------------------------------------+
| Field                    | Value                                                   |
+--------------------------+---------------------------------------------------------+
| uuid                     | authprofile-4b335ccf-8385-48bd-a438-51e72726cc14        |
| name                     | okta                                                    |
| type                     | AUTH_PROFILE_OAUTH                                      |
| oauth_profile            |                                                         |
|   authorization_endpoint | https://dev-477407.oktapreview.com/oauth2/v1/authorize  |
|   token_endpoint         | https://dev-477407.oktapreview.com/oauth2/v1/token      |
|   introspection_endpoint | https://dev-477407.oktapreview.com/oauth2/v1/introspect |
|   jwks_uri               | https://dev-477407.oktapreview.com/oauth2/v1/keys       |
|   issuer                 | https://dev-477407.oktapreview.com                      |
|   pool_ref               | OKTA                                                    |
|   oauth_resp_buffer_sz   | 102400                                                  |
|   userinfo_endpoint      | https://dev-477407.oktapreview.com/oauth2/v1/userinfo   |
| tenant_ref               | admin                                                   |
+--------------------------+---------------------------------------------------------+

CLI を使用した SSO ポリシーの構成

CLI を使用して SSO ポリシーを構成するには、次に示すようにします。

[admin:ctrl]: > configure ssopolicy oauth
[admin:ctrl]: ssopolicy> type sso_type_oauth
[admin:ctrl]: ssopolicy> save
+------------+------------------------------------------------+
| Field      | Value                                          |
+------------+------------------------------------------------+
| uuid       | ssopolicy-8a4cb441-c819-4153-a247-d78f3a2585b3 |
| name       | oauth                                          |
| type       | SSO_TYPE_OAUTH                                 |
| tenant_ref | admin                                          |
+------------+------------------------------------------------+

仮想サービスの OAuth 設定の構成

  • sso_policy_ref を次に示すように構成します。

    [admin:ctrl]: > configure virtualservice OAuth-VS
    [admin:ctrl]: > virtualservice> sso_policy_ref oauth
  • oauth_vs_config を次に示すように構成します。

    [admin:ctrl]: virtualservice> oauth_vs_config
     [admin:ctrl]: virtualservice:oauth_vs_config> redirect_uri   https://100.64.94.61/oauth/callback
     [admin:ctrl]: virtualservice:oauth_vs_config> oauth_settings
     New object being created
     [admin:ctrl]: virtualservice:oauth_vs_config:oauth_settings> auth_profile_ref okta
     [admin:ctrl]: virtualservice:oauth_vs_config:oauth_settings> app_settings
     [admin:ctrl]: virtualservice:oauth_vs_config:oauth_settings:app_settings> oidc_config
     [admin:ctrl]: virtualservice:oauth_vs_config:oauth_settings:app_settings:oidc_config> oidc_enable
     [admin:ctrl]: virtualservice:oauth_vs_config:oauth_settings:app_settings:oidc_config> save
     [admin:ctrl]: virtualservice:oauth_vs_config:oauth_settings:app_settings> client_id xxxxxxxxxxxxxxx
     [admin:ctrl]: virtualservice:oauth_vs_config:oauth_settings:app_settings> client_secret xxxxxxxxxxxxxxx
注:

認可サーバから提供された実際の client_idclient_secret を追加してください。

[admin:ctrl]: virtualservice:oauth_vs_config:oauth_settings:app_settings> save
 [admin:ctrl]: virtualservice:oauth_vs_config:oauth_settings:resource_server>
 [admin:ctrl]: virtualservice:oauth_vs_config:oauth_settings:resource_server> access_type access_token_type_opaque
注:

この例では、opaque トークンが Okta で使用されます。必要に応じて、opaque トークンの代わりに JWT トークンを選択することもできます。

[admin:ctrl]: virtualservice:oauth_vs_config:oauth_settings:resource_server> opaque_token_params
 [admin:ctrl]: virtualservice:oauth_vs_config:oauth_settings:resource_server:opaque_token_params>
 [admin:ctrl]: virtualservice:oauth_vs_config:oauth_settings:resource_server:opaque_token_params> server_id xxxxxxxxxxxxxxx
 [admin:ctrl]: virtualservice:oauth_vs_config:oauth_settings:resource_server:opaque_token_params> server_secret xxxxxxxxxxxxxxx
注:

ほとんどの場合、server_idserver_secret はそれぞれ client_idclient_secret と同じです。

[admin:ctrl]: virtualservice:oauth_vs_config:oauth_settings:resource_server:opaque_token_params> save
 [admin:ctrl]: virtualservice:oauth_vs_config:oauth_settings:resource_server> save
 [admin:ctrl]: virtualservice:oauth_vs_config:oauth_settings> save
 [admin:ctrl]: virtualservice:oauth_vs_config> save
 [admin:ctrl]: virtualservice> save

OAuth の構成は次のとおりです。

| sso_policy_ref                     | oauth                                               |
 | oauth_vs_config                    |                                                     |
 |   redirect_uri                     | https://okta-test.auth.com/oauth/callback           |
 |   cookie_name                      | OAUTH_IUPKWGLH                                      |
 |   cookie_timeout                   | 1 min                                               |
 |   oauth_settings[1]                |                                                     |
 |     auth_profile_ref               | okta-oauth                                          |
 |     app_settings                   |                                                     |
 |       oidc_config                  |                                                     |
 |         oidc_enable                | True                                                |
 |         profile                    | True                                                |
 |         userinfo                   | True                                                |
 |       client_id                    | xxxxxxxxxxxxxxx                                     |
 |       client_secret                | <sensitive>                                   |
 |     resource_server                |                                                     |
 |       access_type                  | ACCESS_TOKEN_TYPE_OPAQUE                            |
 |       opaque_token_params          |                                                     |
 |         server_id                  | xxxxxxxxxxxxxxx                                     |
 |         server_secret              | <sensitive>                                   |
 |   key[1]                           |                                                     |
 |     name                           | dc7dde0a-8a64-45b4-8ded-f65adb03c2a4                |
 |     aes_key                        | b'sdZFYlVECVu9aW7XK4IhVaC8TfakvNSvp6m861tyVNc='     |
 +------------------------------------+-----------------------------------------------------+