このトピックでは、DataScript ユーティリティ関数の仕様について詳しく説明します。
DataScript では、次のユーティリティ関数を使用できます。
機能 |
説明 |
---|---|
コンテンツをデコードします |
|
コンテンツをエンコードします |
|
位置情報データベース情報の抽出に使用されます |
|
IP アドレスとネットマスクを受け入れ、ネットワーク アドレスを返します |
|
avi.utils.murmur_hash ( string)、avi.utils.sha1_hash (string)、avi.utils.md5_hash (string) |
コンテンツをハッシュします |
暗号化を使用した安全でランダムなバイトを生成します |
|
特定の IP アドレスの IP レピュテーションを確認するために使用されます |
|
avi.utils.ip_in_subnet |
IP アドレスのネットマスクを評価するために使用されます。 |
DataScript は、MurmurHash、SHA-1、MD5 という、対応する名前付きハッシュ メソッドをサポートする 3 つの関数のいずれかを使用して、任意のデータをハッシュできます。詳細については、DataScript のavi.utils.murmur_hash (string)、avi.utils.sha1_hash (string)、avi.utils.md5_hash (string)を参照してください。
avi.utils.base64_decode
機能 |
avi.utils.base64_decode( string ) |
説明 |
DataScript は、base64 を使用して任意のデータをエンコードおよびデコードできます。これは、ワイヤを介して送信されるデータの変更、または検査およびセキュリティの使用事例に使用できます。 |
イベント |
|
パラメータ |
string はデコードする文字列です。 |
戻り値 |
デコードされた文字列 |
関連 |
avi.utils.base64_encode() |
例 |
次の例では、HTTP 基本認証ユーザー名を取得し、VMware NSX Advanced Load Balancer 内のユーザー ID タグとして追加します。これは、ログ検索、パーシステンス、またはアクセス制御に使用できます。 if string.beginswith(avi.http.get_header("Authorization"), "Basic ") then auth = string.sub(avi.http.get_header("Authorization"), 7) decoded = avi.utils.base64_decode(auth) username = string.sub(decoded, 0, string.find(decoded, ":") - 1) avi.http.set_userid(username) end |
avi.utils.base64_encode
機能 |
avi.utils.base64_encode( string ) |
説明 |
DataScript は、base64 を使用して任意のデータをエンコードおよびデコードできます。これは、ワイヤを介して送信されるデータの変更、または検査およびセキュリティの使用事例に使用できます。 |
イベント |
|
パラメータ |
string はエンコードする文字列です。 |
戻り値 |
エンコードされた文字列 |
関連 |
avi.utils.base64_decode() |
avi.utils.get_geo_from_ip
NSX Advanced Load Balancer には、クライアントの送信元を識別するための位置情報データベースが含まれています。この固定データベースは、MaxMind IP-country および IP 自律システム番号 (ASN) データに基づいています。データベースは NSX Advanced Load Balancer Controller に保持され、コントローラのアップグレード時にデータベースの更新が組み込まれます。
DataScript 関数 avi.utils.get_geo_from_ip は、クエリされた IP アドレスの位置情報、自律システム (AS) 番号、国コード、および場所(緯度、経度、リージョン、および市区町村)を取得するために使用されます。
この API に使用されるデータベースは、NSX Advanced Load Balancer Controller で維持されているデフォルトのデータベースと同等です。位置情報データベースに記載されているように、IP グループをオーバーライドしたり、IP グループで拡張したりすることはできません。
System-GeoDB プロファイルは、関数 get_geo_from_ip を利用する仮想サービス DataScript に適用する必要があります。
この関数を使用する DataScript を含む VSDataScriptSet は、位置情報データベースを参照する必要があります。
機能 |
|
説明 |
指定された IP アドレスに対して、フラグに従って、指定された IPv4/IPv6 アドレスの位置情報 ip_string 値を返します。この値は、位置情報データベースから取得されます。 |
前提条件 |
サービス エンジンに最低 4 GB の RAM それを使用するサービス エンジン グループには、100 MB 以上の余分な共有メモリを構成する必要があります。これは、次に示すように、SE グループの extra_shared_config_memory パラメータを使用して設定できます。 [admin:example-ctrl]: > configure serviceenginegroup Default-Group extra_shared_config_memory 100 [admin:example-ctrl]: serviceenginegroup > save メモリの変更を有効にするには、このグループ内の SE を再起動する必要があります。 このメモリが設定されていない場合、この関数を使用して DataScript で構成された仮想サービスは障害状態になります。NSX Advanced Load Balancer ユーザー インターフェイスでは、次のようなエラー メッセージが表示されます。 |
イベント |
すべての HTTP イベント |
パラメータ |
|
戻り値 |
注:
この関数に使用されるデータベースは、NSX Advanced Load Balancer Controller で維持されるデフォルトのデータベースと同等です。位置情報データベースに関する記事に記載されているように、IP グループをオーバーライドしたり、IP グループで拡張したりすることはできません。 |
例 1 |
次の DataScript では、次のような geo ヘッダーが追加されています。
client_ip = avi.vs.client_ip() asn = avi.utils.get_geo_from_ip(client_ip, "ASN") geo_header = "not found" if asn ~= nil then geo_header = asn end avi.http.add_header("Geo", geo_header) |
例 2 |
{ [“ATTRIBUTE_COUNTRY_CODE“] = “US“, [“ATTRIBUTE_COUNTRY_NAME“] = “United States“, [“ATTRIBUTE_CONTINENT_NAME“] = “North America“, [“ATTRIBUTE_CONTINENT_CODE“] = “NA“, [“ATTRIBUTE_LATITUDE“] = “37.3583“, [“ATTRIBUTE_LONGITUDE“] = “-122.1081“, [“ATTRIBUTE_USER_DEFINED_MAPPING“] = { [1] = “Example Mapping 1“, [2] = “Example Mapping 2", etc. } } 国コードの長さは 2 文字に制限され、地域/市区町村はそれぞれ 36 文字に制限されます。 |
avi.utils.ip.netaddr
機能 |
avi.utils.ip.netaddr(ip_addr, netmask)) |
説明 |
IPv4 または IPv6 の IP アドレスとネットマスクを受け入れ、ネットワーク アドレスを返します。 |
イベント |
|
パラメータ |
|
戻り値 |
すべての
その場合、関数は NIL を返します それ以外の場合、この関数はネットワークの IPv6 または IPv4 アドレスを返します。 |
例 |
avi.utils.ip.netaddr ("43.225.52.40", 24) returns 43.225.52.0 avi.utils.ip.netaddr ("2001:0db8:85a3:0000:0000:8a2e:0370:7334", 53) returns 1:2001:db8:85a3:: |
avi.utils.murmur_hash ()、avi.utils.sha1_hash ()、avi.utils.md5_hash ()
機能 |
|
説明 |
DataScript は、 |
イベント |
|
パラメータ |
|
戻り値 |
ハッシュされた文字列 |
例 |
次の 5 行のコード スニペットを考えます。 if avi.http.get_path() == "/echo_listen_port" then avi.vs.log("Murmur-hash = " .. avi.utils.murmur_hash("How is the weather?")) avi.vs.log("SHA1-hash = " .. avi.utils.sha1_hash("How is the weather?")) avi.vs.log("MD5-hash = " .. avi.utils.md5_hash("How is the weather?")) end
[string "DS1"]:2: Murmur-hash = 2050936584 [string "DS1"]:3: SHA1-hash = 0171e8d98bf187af83fe7a9dbbb34ebc6629dcbe [string "DS1"]:4: MD5-hash = c4150a2ad26a0c6345041f11ba914661 |
avi.utils.rand_bytes
機能 |
|
説明 |
ユーザーが暗号化を使用した安全でランダムなバイト数のデータを生成できるようにします。 |
イベント |
すべて |
パラメータ |
num_bytes は 0 ~ 1024 の整数です。 |
戻り値 |
num_bytes のランダムなバイト数のデータを含む文字列。
注:
Lua は、文字列をバイトのシーケンスとして定義します。したがって、ASCII 範囲内のバイトに対して有効な操作は、ASCII 範囲外のバイトに対して同様に有効です。これらのランダムなバイトを出力すると、認識できない文字が表示される可能性が高くなります。UUID の作成時に必要になる場合など、暗号を使用した安全でランダムな値を返すために、math.random などの代替メソッドに依存することはできません。 |
例 |
VS アプリケーション ログにランダムに 8 バイトを記録します。 random_bytes = avi.utils.rand_bytes(8) avi.vs.log(random_bytes) |
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
は Spam Source and Scanner
(ビット 0 および 4 セット)を示します。
詳細については、『VMware NSX Advanced Load Balancer WAF ガイド』の「IP レピュテーション」のトピックを参照してください。
関数は、VSDataScriptSet 用に構成された 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
を構成する必要があります。