このトピックでは、NSX Advanced Load Balancer で使用可能な DataScript SSL 関数の仕様について説明します。
機能 |
説明 |
---|---|
SSL 暗号と設定を返します。 |
|
クライアントの証明書またはその一部を返します。 |
|
SSL バージョンを返します。 |
|
SNI 名フィールドを返します。 |
|
この API を使用すると、クライアント IP アドレス、TLS サーバ名などのいくつかの要因に基づいて、SSL プロファイルを別のプロファイルに変更できます。 |
|
この API を使用すると、クライアント IP アドレス、TLS サーバ名などの要因に基づいて、SSL キーと証明書を別のオブジェクトに変更できます。 |
|
この API を使用して、クライアント IP アドレス、TLS サーバ名、HTTP ホストまたは URI などの要因に基づいて、初期または再ネゴシエーションされた TLS セッションの PKI プロファイルを変更できます。 |
|
この API は、クライアント IP アドレス、TLS サーバ名、HTTP ホストまたは URI などの要因に基づいて PKI プロファイル、モード、頻度を変更した後に、クライアントとの TLS 接続を再ネゴシエーションするために使用できます。 |
|
この API は、クライアント証明書認証と CRL チェックの結果を取得するために使用されます。 |
|
この API は検証エラー コードを受け入れ、そのエラー コードに関連付けられているエラー文字列を返します。 |
|
この API は、クライアント証明書認証モードを取得するために使用されます。 |
|
この API は、クライアント証明書の検証が完了しているかどうかを確認するために使用されます。 |
|
この API は、TLS 接続で SSL クライアント証明書検証エラーをクリアするために使用されます。 |
|
この API は、クライアント証明書認証の失敗をログに記録するために使用されます。このエラーは、重要なログとしてアプリケーション ログに追加されます。 |
|
この API は、TLS 接続の SSL セッション キャッシュ エントリをクリアするために使用されます。 |
|
この API は、クライアント証明書認証と CRL チェックの結果を取得するために使用されます。 |
|
この API は、クライアントと仮想サービス間の SSL または TLS 接続についてネゴシエートされる暗号スイートの長さを決定するために使用されます。 |
|
この API は、確立された SSL 接続の PEM 形式でクライアント証明書を取得するために使用されます。 |
avi.ssl.cipher
機能 |
|
説明 |
クライアントと仮想サービス間の SSL/TLS 接続のためにネゴシエートされる暗号スイートの名前を返します。必要に応じて、バージョン、キー交換方法 (Kx)、認証方法 (Au)、暗号化方法 (Enc)、選択した MAC (Mac) を含めることができます。返される暗号スイート情報は OpenSSL 形式です。OpenSSL 形式の暗号スイートの例については、www.openssl.org/docs/manmaster/apps/ciphers.html を参照してください。 |
イベント |
|
パラメータ |
オプションのブール値 |
戻り値 |
SSL/TLS 接続の暗号情報を含む文字列値。 |
例 1 |
サポートされていない暗号を使用して接続しているクライアントを拒否します。 cipher_name = avi.ssl.cipher() if cipher_name == "RC4-SHA" then avi.http.response(200, {content_type="text/html"}, "Upgrade your client to use modern and secure ciphers." ) end |
例 2 |
クライアントとネゴシエートされたキー交換方法を示すヘッダーをサーバに挿入します。 cipher = avi.ssl.cipher(true) -- get the key exchange method from the cipher detail using pattern matching -- %w matches alphanumeric characters kx = string.match(cipher, "Kx=(%w+)") if kx then avi.http.add_header("X-KeyExchange", kx) end |
avi.ssl.client_cert
新しい API の引数 |
avi.ssl.client_cert( [[avi.CLIENT_CERT] [, avi.CLIENT_CERT_FINGERPRINT] [, avi.CLIENT_CERT_SUBJECT] [, avi.CLIENT_CERT_ISSUER] [, avi.CLIENT_CERT_SERIAL][, avi.CLIENT_CERT_NOTVALIDBEFORE] [, avi.CLIENT_CERT_NOTVALIDAFTER] [, avi.CLIENT_CERT_VERSION][, avi.CLIENT_CERT_SIGALG] ] ) |
説明 |
確立された SSL 接続のクライアント証明書を PEM 形式で返します。オプションのパラメータは、クライアント証明書から返されたフィールドをフィルタリングします。 |
イベント |
|
パラメータ |
引数や avi.CLIENT_CERT が指定されていない場合に、クライアントから仮想サービスへの確立された SSL 接続用の PEM 形式のクライアント証明書を返します。最初の行を除く各行の先頭にタブ文字を付加します。
|
戻り値 |
クライアント証明書とそのフィールドに関連する最大 9 つの引数。 |
例 1 |
証明書の発行者が正しくない場合は、発行者をヘッダーに追加し、検疫サーバ プールに転送します。 if avi.ssl.client_cert(avi.CLIENT_CERT_ISSUER) ~= "/C=US/O=foo/OU=www.foo.com/CN=www.foo.com/[email protected]" then avi.http.add_header("client_cert_issuer", avi.ssl.client_cert(avi.CLIENT_CERT_ISSUER)) avi.pool.select("Quarantine-Pool") end |
例 2 |
SSL 接続のクライアント証明書属性をログに記録します。 if avi.http.secure() then -- test if the connection is secure fingerprint = avi.ssl.client_cert(avi.CLIENT_CERT_FINGERPRINT) avi.vs.log(fingerprint) end |
avi.ssl.protocol
機能 |
avi.ssl.protocol() |
説明 |
確立された SSL 接続のプロトコルを返します。たとえば、TLSv1.1 です。 |
イベント |
|
パラメータ |
なし |
戻り値 |
SSL/TLS のバージョンまたは unknown の文字列を返します |
例 |
if avi.ssl.protocol() == "TLSv1.0" then avi.http.response(404, {content_type="text/html"}, "Your browser's SSL version, " .. avi.ssl.protocol() .. " is old. Upgrade your browser and try again.") end |
avi.ssl.server_name
機能 |
avi.ssl.protocol() |
説明 |
確立された SSL 接続のプロトコルを返します。たとえば、TLSv1.1 です。 |
イベント |
HTTP_REQ HTTP_RESP |
パラメータ |
なし |
戻り値 |
要求された SNI 名の文字列。 |
例 |
クライアントによって要求された SNI 名を宣言するヘッダーを挿入します。 avi.http.add_header("X-SNI ", avi.ssl.server_name()) |
avi.ssl.set_ssl_profile
機能 |
avi.ssl.set_ssl_profile(<SSL Profile Name>) |
説明 |
この関数は、クライアント IP アドレス、TLS サーバ名などのいくつかの要因に基づいて、SSL プロファイルを別のプロファイルに変更するために使用されます。 |
イベント |
|
パラメータ |
SSL パラメータの名前 |
戻り値 |
なし |
例 |
if avi.ssl.server_name() == "legacy.example.com" then avi.ssl.set_ssl_profile("legacy_ssl_profile") end
|
avi.ssl.set_ssl_certificate
機能 |
avi.ssl.set_ssl_certificate(<SSLKeyAndCertificate>) |
説明 |
この機能は、クライアント IP アドレス、TLS サーバ名などの要因に基づいて、SSL キーと証明書を別のオブジェクトに変更するために使用されます。 |
イベント |
|
パラメータ |
SSL キーと証明書オブジェクトの名前。 |
戻り値 |
なし |
例 |
if avi.ssl.server_name() == "legacy.example.com" then avi.ssl.set_ssl_certificate("RSACertificate") avi.ssl.set_ssl_certificate("ECCertificate") end |
avi.ssl.set_pki_profile
機能 |
|
説明 |
この関数は、クライアント IP アドレス、TLS サーバ名、HTTP ホストまたは URI などの要因に基づいて、初期または再ネゴシエーションされた TLS セッションの PKI プロファイルを変更するために使用されます。
DataScript からの PKI 構成は、アプリケーション プロファイルからの構成よりも優先されます。 |
イベント |
|
パラメータ |
現在、アプリケーション プロファイルには 2 つのノブがあります。1 つのノブがモードを制御し、もう 1 つのノブが PKI プロファイル オブジェクトを制御します。 API は、プロファイル名(オプション)と認証の頻度(オプション)パラメータを持つモード(必須)です。サポートされている 3 つのモードは次のとおりです。
|
戻り値 |
なし |
例 |
To disable client certificate authentication if avi.ssl.server_name() == "legacy.example.com" then avi.ssl.set_pki_profile(avi.CLIENT_VERIFY_DISABLE) end ここで、PKI プロファイルのクライアント検証は、この TLS サーバ接続で無効になっています。クライアント証明書の認証設定を変更するには、次のように指定します。 if avi.ssl.server_name() == "secure.example.com" then avi.ssl.set_pki_profile(avi.CLIENT_VERIFY_REQUIRE, "pkiprofile-crl", avi.AUTHENTICATE_ONLY_ONCE) else avi.ssl.set_pki_profile(avi.CLIENT_VERIFY_REQUEST) end TLS サーバ名が |
PKI 構成はアプリケーション プロファイルと DataScript を介して実行できるため、実行中は、DataScript を介して構成された PKI プロファイルがアプリケーション プロファイルを介して行われた構成よりも優先されます。
たとえば、証明書を必須としてマークするように PKI プロファイルが構成されているが、DataScript を介して特定のサーバ名の PKI プロファイルが無効としてマークされている場合、アプリケーション プロファイルの構成がオーバーライドされます。
avi.ssl.renegotiate
機能 |
|
説明 |
この関数は、クライアント IP アドレス、TLS サーバ名、HTTP ホストまたは URI などの要因に基づいて PKI プロファイル、モード、頻度を変更した後に、クライアントとの TLS 接続を再ネゴシエーションします。再ネゴシエーション API 呼び出しの前にクライアント証明書認証が有効になっている場合、PKI 設定が SSL セッションの再ネゴシエーションに適用されます。HTTP 要求は、再ネゴシエーションが完了するまで停止されます。 SSL 再ネゴシエーションにより、接続で SSL セッションの再開が無効になります。
注:
接続で PKI 設定を変更した後に再ネゴシエーションを使用する場合、ユーザーのスクリプトはクライアント認証の結果を処理する必要があります。そうしないと、TLS 接続に対する後続の要求が失敗する可能性があります。スクリプトは、エラーをクリアするか、接続を終了するかを選択できます。 |
イベント |
|
パラメータ |
なし |
戻り値 |
なし |
例 |
クライアント証明書認証を無効にするには、次の手順を実行します。 if string.contains(avi.http.get_uri(), \"secure\") then avi.ssl.set_pki_profile(avi.CLIENT_VERIFY_REQUIRE, "pkiprofile-ca", avi.AUTHENTICATE_ONLY_ONCE) avi.ssl.renegotiate() verify_err, error_code = avi.ssl.client_cert_verify_error() if verify_err == 0 or (verify_err == 2 and error_code ~= 0) then avi.http.close_connection() end end ここでは、特定の URI を確認してから、PKI 属性を変更し、SSL 再ネゴシエーションを実行します。次に、エラーが発生した場合は、接続を終了します。 |
エラーが発生したが、接続を終了しないことを決定した場合は、エラーを修正します。エラーをクリアしない場合、後続の要求は DataScript が考慮されないパスに入り、エラーが原因でネイティブ要求フローが接続を終了することがあります。
再ネゴシエーションは、HTTP2 プロトコルと TLS1.3 プロトコルでは機能しません。
avi.ssl.clear_client_cert_verify_error
機能 |
|
説明 |
この関数は、TLS 接続で SSL クライアント証明書検証エラーをクリアするために使用されます。内部的に、API は TLS 接続の |
イベント |
|
パラメータ |
なし |
戻り値 |
値なし |
例 |
if avi.ssl.server_name() == "secure.example.com" && avi.ssl.get_client_cert_verify_mode() == 0 then avi.ssl.set_pki_profile(avi.CLIENT_VERIFY_REQUIRE, "pkiprofile-ca", avi.AUTHENTICATE_ONLY_ONCE) avi.ssl.renegotiate() verify_err, err_code = avi.ssl.client_cert_verify_error() if err_code ~= 0 and avi.ssl.client_cert_verify_error_string(err_code) == 'X509_V_ERR_CRL_HAS_EXPIRED' then avi.ssl.clear_client_cert_verify_error() end end |
avi.ssl.client_cert_verify_error_string
機能 |
|
説明 |
この API は検証エラー コードを受け入れ、そのエラー コードに関連付けられたエラー文字列を返します |
イベント |
|
パラメータ |
|
戻り値 |
この DataScript 関数は、SSL スタックによって返されるこれらのエラー コードの特定の意味を理解するために、OpenSSL の verify ドキュメントから特定の verify エラー コードのエラー文字列を返します。 |
例 |
if avi.ssl.server_name() == "secure.example.com" then avi.ssl.set_pki_profile(avi.CLIENT_VERIFY_REQUIRE, "pkiprofile-ca", avi.AUTHENTICATE_ONLY_ONCE) avi.ssl.renegotiate() verify_err, error_code = avi.ssl.client_cert_verify_error() if verify_err == 0 or (verify_err == 2 and avi.ssl.client_cert_verify_error_string(error_code) ~= 'X509_V_OK') then avi.http.close_connection() end end |
avi.ssl.client_cert_verify_mode
機能 |
|
説明 |
この DataScript 関数は、クライアント証明書認証モードを取得するために使用されます |
イベント |
|
パラメータ |
なし |
戻り値 |
この DataScript 関数は、次のいずれかの値を返します。
|
例 |
if avi.ssl.server_name() == "secure.example.com" && avi.ssl.get_client_cert_verify_mode() == 0 then avi.ssl.set_pki_profile(avi.CLIENT_VERIFY_REQUIRE, "pkiprofile-ca", avi.AUTHENTICATE_ONLY_ONCE) avi.ssl.renegotiate() end |
avi.ssl.client_cert_verified
機能 |
|
説明 |
この DataScript 関数は、クライアント証明書の検証が完了したかどうかを確認するために使用されます。 |
イベント |
|
パラメータ |
なし |
戻り値 |
この DataScript 関数は、次のいずれかの値を返します。
|
例 |
if avi.ssl.server_name() == "secure.example.com" && avi.ssl.client_cert_verified() == 0 then avi.ssl.set_pki_profile(avi.CLIENT_VERIFY_REQUIRE, "pkiprofile-ca", avi.AUTHENTICATE_ONLY_ONCE) avi.ssl.renegotiate() end |
avi.ssl.clear_client_cert_verify_error
機能 |
|
説明 |
この関数は、TLS 接続で SSL クライアント証明書検証エラーをクリアするために使用されます。内部的に、API は TLS 接続の verify_result に「 |
イベント |
|
パラメータ |
なし |
戻り値 |
値なし |
例 |
if avi.ssl.server_name() == "secure.example.com" && avi.ssl.get_client_cert_verify_mode() == 0 then avi.ssl.set_pki_profile(avi.CLIENT_VERIFY_REQUIRE, "pkiprofile-ca", avi.AUTHENTICATE_ONLY_ONCE) avi.ssl.renegotiate() verify_err, err_code = avi.ssl.client_cert_verify_error() if err_code ~= 0 and avi.ssl.client_cert_verify_error_string(err_code) == 'X509_V_ERR_CRL_HAS_EXPIRED' then avi.ssl.clear_client_cert_verify_error() end end |
avi.ssl.log_client_cert_verify_error
機能 |
|
説明 |
この DataScript 関数は、クライアント証明書認証の失敗をログに記録するために使用されます。このエラーは、重要なログとしてアプリケーション ログに追加されます。 例:クライアント証明書の検証に失敗しました。クライアントの x509 証明書の検証に失敗しました。 |
イベント |
|
パラメータ |
なし |
戻り値 |
なし |
例 |
if avi.ssl.server_name() == "secure.example.com" && avi.ssl.get_client_cert_verify_mode() ~= 0 then avi.ssl.log_client_cert_verify_error() end |
avi.ssl.remove_session
機能 |
|
説明 |
この API は、TLS 接続の SSL セッション キャッシュ エントリをクリアするために使用されます。 |
イベント |
|
パラメータ |
なし |
戻り値 |
なし |
例 |
if string.contains(avi.http.get_uri(), \"logout.html\") then avi.ssl.remove_session() end |
avi.ssl.get_client_cert_verify_mode
機能 |
|
イベント |
|
パラメータ |
なし |
戻り値 |
この DataScript 関数は、次のいずれかの値を返します。
|
例 |
if avi.ssl.server_name() == "secure.example.com" && avi.ssl.get_client_cert_verify_mode() == 0 then avi.ssl.set_pki_profile(avi.CLIENT_VERIFY_REQUIRE, "pkiprofile-ca", avi.AUTHENTICATE_ONLY_ONCE) avi.ssl.renegotiate() end |
avi.ssl.cipher_len
機能 |
|
説明 |
クライアントと仮想サービス間の SSL/TLS 接続についてネゴシエートされる暗号スイートの長さを返します。 |
パラメータ |
なし |
イベント |
|
例 |
-- Cipher selected is ECDHE-RSA-AES128-GCM-SHA256 cipher_len = avi.ssl.cipher_len() -- cipher_len = 128 avi.vs.log("Cipher length: "..cipher_len) |
この API は、イベント SSL_PRECONNECT
および SSL_CLIENTHELLO
でサポートされていません。
datascript-avi-ssl-client-cert-verify-error
機能 |
|
説明 |
この API を使用して、クライアント証明書認証と CRL チェックの結果を取得できます。 |
パラメータ |
なし |
イベント |
|
戻り値 |
この API は、次の 2 つの値を返します。
|
例 |
if avi.ssl.server_name() == "secure.example.com" then avi.ssl.set_pki_profile(avi.CLIENT_VERIFY_REQUEST, "pkiprofile-ca", avi.AUTHENTICATE_ONLY_ONCE) avi.ssl.renegotiate() verify_err, error_code = avi.ssl.client_cert_verify_error() if verify_err == 0 or (verify_err == 2 and error_code ~= 0) then avi.http.close_connection() end end |
avi.ssl.client_cert
機能 |
|
説明 |
確立された SSL 接続のクライアント証明書を PEM 形式で返します。オプションのパラメータは、クライアント証明書から返されたフィールドをフィルタリングします。 |
イベント |
|
パラメータ |
引数または avi.CLIENT_CERT が指定されていない場合、クライアントから仮想サービスへの確立された SSL 接続のクライアント証明書を PEM 形式で返します。最初の行を除く各行の先頭にタブ文字が付加されます。
|
戻り値 |
クライアント証明書とそのフィールドに関連する最大 9 つの引数。 |
例 1 |
証明書の発行者が正しくない場合は、発行者をヘッダーに追加し、検疫サーバ プールに転送します。 if avi.ssl.client_cert(avi.CLIENT_CERT_ISSUER) ~= "/C=US/O=foo/OU=www.foo.com/CN=www.foo.com/[email protected]" then avi.http.add_header("client_cert_issuer", avi.ssl.client_cert(avi.CLIENT_CERT_ISSUER)) avi.pool.select("Quarantine-Pool") end |
例 2 |
SSL 接続のクライアント証明書属性をログに記録します。 if avi.http.secure() then -- test if the connection is secure fingerprint = avi.ssl.client_cert(avi.CLIENT_CERT_FINGERPRINT) avi.vs.log(fingerprint) end |
Example 3 |
HTTP 要求でクライアント証明書を送信すると、クライアントがエスケープした証明書が DS/HTTP ポリシー ヘッダーに表示されます。 escaped_cert = avi.ssl.client_cert(avi.CLIENT_CERT_ESCAPED) avi.vs.log(escaped_cert) avi.http.add_header("escaped_client_cert",escaped_cert) |
この API は、イベント SSL_PRECONNECT
および SSL_CLIENTHELLO
でサポートされていません。
avi.utils.get_ip_reputation
Lua
関数を使用した、L7 DataScript の IP レピュテーション チェックに Webroot DB を使用できます。
is_good, reputation_type = avi.utils.get_ip_reputation(ip_addr)
is_good
の最初の戻り値は true/false
です。これは、指定された IP アドレスのレピュテーションが良好かどうかを示します。
2 番目の戻り値は IP レピュテーション タイプのビットマップで、is_good
が false
の場合にのみ有効です。たとえば、値 1
はスパムの送信元(ビット 0
セット)を示し、値 17
はスパムの送信元とスキャナ(ビット 0
および 4
セット)を示します。
詳細については、『VMware NSX Advanced Load Balancer WAF ガイド』の「IP レピュテーション」のトピックを参照してください。
この関数は、仮想サービス DataScript セット用に構成された IP レピュテーション データベースを使用します。
API または CLI を使用して、IPReputationDB
を使用するように VSDataScriptSet
を構成できます。
Lua
関数は、IPv4 と IPv6 の両方のアドレスを受け入れます。ただし、IP レピュテーション データベースには現在 IPv4 アドレスの情報のみが含まれているため、IPv6 アドレスの場合は常に true が返されます。
ip_addr
パラメータの形式は、avi.vs.client_ip()
によって返されるものと想定されます。これは、たとえば 1.2.3.4 などの表示形式です。
message VSDataScriptSet { ... optional string ip_reputation_db_uuid = 58 [ (refers_to) = "IPReputationDB", ... ] ... }
構成のワークフロー
スクリプトが新しい avi.utils.get_ip_reputation(ip_addr)
関数を使用する場合、VSDataScriptSet
レベルで IPReputationDB
を構成する必要があります。