このトピックでは、API を使用するときに NSX セッションベースの認証を使用して JSESSIONID Cookie を生成する方法について説明します。この方法を使用して、ユーザー名とパスワードの入力の必要回数を減らします。このタイプの認証は、vIDM および LDAP 認証で使用できます。

NSX では、いくつかの異なるメカニズムを使用して NSX ユーザーを認証します。これには以下が含まれます。

  • HTTP 認証
  • セッションベースの認証
  • プリンシパル ID または証明書ベースの認証
  • vIDM および Cloud Service Platform (CSP) を使用したシングル サインオン

NSX では、ユーザー名とパスワードを使用してセッション作成時にセッション Cookie を生成します。セッション Cookie が作成されると、以降の API 要求では、ユーザー名とパスワードの認証情報の代わりに、このセッション Cookie を使用することもできます。これは、セッション状態がセッション Cookie を生成した特定の NSX Manager に固有であることを意味します。クライアントが NSX Manager に要求を送信すると、クライアントから提示されたセッション Cookie がマネージャによって生成された Cookie のいずれかと一致する場合にのみ、クライアントに認証を許可します。ユーザーが NSX Manager からログアウトすると、NSX Manager のリバース プロキシからセッション Cookie が直ちに削除されます。再利用することはできません。アイドル状態のセッションは自動的にタイムアウトになるか、API を使用して削除できます。

API 要求を使用してアクセスすると、監査ログの詳細が生成されます。このログは常に有効になっており、無効にすることはできません。セッションの監査はシステム起動時に開始します。監査ログ メッセージの構造化データの部分に audit="true" というテキストが含まれています。

この例では、cURL を使用して API 呼び出しのセッションベースの認証を作成する方法について説明します。

手順

  1. NSX Manager に対して認証し、ヘッダーから xsrf を取得する新しいセッション Cookie を作成するには、次のように入力します。
    # curl -v -k -c session.txt -X POST -d '[email protected]&j_password=SecretPwsd3c4d' https://<manager-ip>/api/session/create 2>&1 > /dev/null | grep -i xsrf < x-xsrf-token: 5a764b19-5ad2-4727-974d-510acbc171c8

    この例では、cURL コマンドがマネージャに対して認証を行い、セッション Cookie を sessions.txt ファイルに配置し、すべての HTTP 応答ヘッダーを headers.txt ファイルに書き込みます。以降の要求で指定するには、headers.txt のヘッダーの 1 つである x-xsrf-token ヘッダーを使用する必要があります。

    また、ユーザー名の @ に標準の Unicode/URI エンコードを使用することもできます。

    セッションの内容の例を次に示します。

    # cat session.txt
          # Netscape HTTP Cookie File
          # https://curl.haxx.se/docs/http-cookies.html
          # This file was generated by libcurl! Edit at your own
            risk.
          # HttpOnly_172.182.183.135 FALSE / TRUE 0 JSESSIONID CFG588DF6DGF493C0EAEFC62685C42E1
  2. 2 つのセッションを作成する必要がある場合は、両方のセッションが有効になるように session.txt ファイルの名前を変更します。
    # curl -v -k -c session1.txt -X POST -d 'j_username= [email protected]&j_password=SecretPwsd3c4d' https://<manager-ip>/api/session/create 2>&1 > /dev/null | grep -i xsrf < x-xsrf-token: cbce48f3-48fc-46c0-a8e7-f2f55ebf8e15
    # curl -v -k -c session2.txt -X POST -d 'j_username= [email protected]&j_password=SecretPwsd3c4d' https://<manager-ip>/api/session/create 2>&1 > /dev/null | grep -i xsrf < x-xsrf-token: abf1fa2c-86d5-47e4-9a0a-242424dd1761
  3. 以降の呼び出しでは、前の手順のセッション Cookie と xsrf ヘッダーを使用します。
    # curl -k -b session.txt -H "x-xsrf-token: 5a764b19-5ad2-4727-974d-510acbc171c8"
          https://10.182.183.135/policy/api/v1/infra/segments
          {
            "results" : [ {
              "type" : "ROUTED",
              "subnets" : [ {
                "gateway_address" : "192.168.10.1/24",
                "network" : "192.168.10.0/24"
              } ],
              "connectivity_path" :
            "/infra/tier-1s/test_t1",
              "transport_zone_path" :
            "/infra/sites/default/enforcement-points/default/transport-zones/1b3a2f36-bfd1-443e-a0f6-4de01abc963e",
              "advanced_config" : {
                "address_pool_paths" : [ ],
                "hybrid" : false,
                "multicast" : true,
                "inter_router" : false,
                "local_egress" : false,
                "urpf_mode" : "STRICT",
                "connectivity" : "ON"
              },
              "admin_state" : "UP",
              "replication_mode" : "MTEP",
              "resource_type" : "Segment",
              "id" : "seg1",
              "display_name" : "seg1",
              "path" : "/infra/segments/seg1",
              "relative_path" : "seg1",
              "parent_path" : "/infra",
              "unique_id" :
            "6573d2c9-f4f9-4b37-b410-71bded8857c3",
              "marked_for_delete" : false,
              "overridden" : false,
              "_create_user" : "admin",
              "_create_time" : 1633331197569,
              "_last_modified_user" : "admin",
              "_last_modified_time" : 1633331252660,
              "_system_owned" : false,
              "_protection" : "NOT_PROTECTED",
              "_revision" : 1
            } ],
            "result_count" : 1,
            "sort_by" : "display_name",
            "sort_ascending" : true
        
    クラスタ内の別のノードで同じセッション Cookie を使用すると、次のエラー メッセージが表示されてコマンドが失敗します。
    The credentials were incorrect or the account specified has been locked.","error_code":403.

    セッションの有効期限が切れると、NSX Manager は 403 Forbidden HTTP 応答で応答します。その後、新しいセッション Cookie と x-xsrf-token を取得する必要があります。

  4. セッションの有効期限を構成するには、connection_timeout API コマンドを使用します。デフォルトのセッション有効期限は 1,800 秒(30 分)です。
    1. GET https://<nsx-mgr>/api/v1/cluster/api-service を使用して、現在の構成のスナップショットを表示します。
      GET https://<nsx-mgr>/api/v1/cluster/api-service
      {
          "session_timeout": 1800,
          "connection_timeout": 30,
          "protocol_versions": [
              {
                  "name": "TLSv1.1",
                  "enabled": true
              },
              {
                  "name": "TLSv1.2",
                  "enabled": true
              }
          ],
          "cipher_suites": [
              {
                  "name": "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
                  "enabled": true
              },
              {
                  "name": "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256",
                  "enabled": true
              },
              {
                  "name": "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
                  "enabled": true
              },
              {
                  "name": "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
                  "enabled": true
              },
              {
                  "name": "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384",
                  "enabled": true
              },
              {
                  "name": "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
                  "enabled": true
              },
              {
                  "name": "TLS_RSA_WITH_AES_128_CBC_SHA",
                  "enabled": true
              },
              {
                  "name": "TLS_RSA_WITH_AES_128_CBC_SHA256",
                  "enabled": true
              },
              {
                  "name": "TLS_RSA_WITH_AES_128_GCM_SHA256",
                  "enabled": true
              },
              {
                  "name": "TLS_RSA_WITH_AES_256_CBC_SHA",
                  "enabled": true
              },
              {
                  "name": "TLS_RSA_WITH_AES_256_CBC_SHA256",
                  "enabled": true
              },
              {
                  "name": "TLS_RSA_WITH_AES_256_GCM_SHA384",
                  "enabled": true
              }        ,
              {
                  "name": "TLS_ECDSA_WITH_AES_256_GCM_SHA384",
                  "enabled": true
              }
          ],
          "redirect_host": "",
          "client_api_rate_limit": 100,
          "global_api_concurrency_limit": 199,
          "client_api_concurrency_limit": 40,
          "basic_authentication_enabled": true,
          "cookie_based_authentication_enabled": true,
          "resource_type": "ApiServiceConfig",
          "id": "reverse_proxy_config",
          "display_name": "reverse_proxy_config",
          "_create_time": 1658339081246,
          "_create_user": "system",
          "_last_modified_time": 1658339081246,
          "_last_modified_user": "system",
          "_system_owned": false,
          "_protection": "NOT_PROTECTED",
          "_revision": 0
      }
      
    2. 目的の値を使用して JSON を編集し、_revision を除いて、アンダースコアで始まるフィールド (_xxxxx) をすべて削除します。
       GET https://<nsx-mgr>/api/v1/cluster/api-service
      {
          "global_api_concurrency_limit": 199,
          "client_api_rate_limit": 100,
          "client_api_concurrency_limit": 40,
          "connection_timeout": 30,
          "redirect_host": "",
          "cipher_suites": [     
            {"enabled": true, "name": "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384"},
            {"enabled": true, "name": "TLS_RSA_WITH_AES_256_GCM_SHA384"},
            {"enabled": true, "name": "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"},
            {"enabled": true, "name": "TLS_RSA_WITH_AES_128_GCM_SHA256"}
            {"enabled": true, "name": "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384}",
            {"enabled": true, "name": "TLS_RSA_WITH_AES_256_CBC_SHA256"},
            {"enabled": true, "name": "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA"},
            {"enabled": true, "name": "TLS_RSA_WITH_AES_256_CBC_SHA"},
            {"enabled": true, "name": "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256"},
            {"enabled": true, "name": "TLS_RSA_WITH_AES_128_CBC_SHA256"},
            {"enabled": false, "name": "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA"},
            {"enabled": true, "name": "TLS_RSA_WITH_AES_128_CBC_SHA"},
        
            {"enabled": true, "name": "TLS_ECDSA_WITH_AES_256_GCM_SHA384"},
          ],
            "protocol_versions": [
              {"enabled": true, "name": "TLSv1.1"},
          {"enabled": true, "name": "TLSv1.2"}
        ]    
          "_revision": 0
      }
      
    3. PUT https://<nsx-mgr>/api/v1/cluster/api-service を使用して、現在の構成を変更します。
  5. セッション Cookie を削除するには、/api/session/destroy API コマンドを使用します。
    curl -k -b cookies.txt -H "`grep x-xsrf-token headers.txt`" -X POST https://<nsx-manager>/api/session/destroy
    次はその例です。
    curl -k -b cookies.txt -H "`grep x-xsrf-token headers.txt`" https://$TESTHOST/api/session/destroy
    curl -k -b cookies.txt -H "`grep x-xsrf-token headers.txt`" https://$TESTHOST/api/v1/logical-ports
    応答:
    {
        "module_name" : "common-services",
        "error_message" : "The credentials were incorrect or the account specified has been locked.",
        "error_code" : "403"
    }
    

次のタスク

セッションベースのサポートされている認証サービスでユーザーを認証するための要件を確認するには、VMware Identity Manager/Workspace ONE Access との連携またはLDAP との連携を参照してください。