このトピックでは、DataScript ユーティリティ関数の仕様について詳しく説明します。

DataScript では、次のユーティリティ関数を使用できます。

機能

説明

avi.utils.base64_decode( string )

コンテンツをデコードします

avi.utils.base64_encode( string )

コンテンツをエンコードします

avi.utils.get_geo_from_ip(ip_string, [flag])

位置情報データベース情報の抽出に使用されます

avi.utils.ip.netaddr (ipaddr, netmask)

IP アドレスとネットマスクを受け入れ、ネットワーク アドレスを返します

avi.utils.murmur_hash ( string)、avi.utils.sha1_hash (string)、avi.utils.md5_hash (string)

コンテンツをハッシュします

avi.utils.rand_bytes( num_bytes )

暗号化を使用した安全でランダムなバイトを生成します

avi.utils.get_ip_reputation

特定の 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 を使用して任意のデータをエンコードおよびデコードできます。これは、ワイヤを介して送信されるデータの変更、または検査およびセキュリティの使用事例に使用できます。

イベント

  • HTTP_REQ

  • HTTP_RESP

パラメータ

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 を使用して任意のデータをエンコードおよびデコードできます。これは、ワイヤを介して送信されるデータの変更、または検査およびセキュリティの使用事例に使用できます。

イベント

  • HTTP_REQ

  • HTTP_RESP

パラメータ

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 は、位置情報データベースを参照する必要があります。

機能

  • avi.utils.get_geo_from_ip (ip_string, [flag])

  • avi.utils.get_geo_from_ip(ip_string,"COUNTRY")

  • avi.utils.get_geo_from_ip(ip_string,"ASN")

  • avi.utils.get_geo_from_ip(ip_string,"LOCATION")

  • avi.utils.get_geo_from_ip(ip_string,"ALL")

説明

指定された 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 イベント

パラメータ

  • ip_string は、位置情報データベースの情報を問い合わせるクエリ IPv4/IPv6 アドレスを含む文字列です。

  • flag は、「COUNTRY」、「ASN」、「LOCATION」、または「ALL」に設定できる文字列で、何も指定しない場合はデフォルトで「COUNTRY」に設定されます。

戻り値

  1. 次の場合に nil を返します。

    • ip_string に IPv6、内部/無効なアドレスが含まれる場合、または

    • ip_string が位置情報データベースに含まれない(未割り当てアドレス)場合、または

    • flag が正しく設定されていない(「COUNTRY」、「ASN」、「LOCATION」、「ALL」以外)場合、または

  2. flag が「COUNTRY」に設定されている場合、または flag パラメータがない場合は、ISO 3166-1 alpha-2 国/地域コード(オーストラリアの場合は「AU」など)を含む string を返します。

  3. flag が「ASN」に設定されている場合は、32 ビット ASN コード(AS1449 PayPal, Inc の場合は 1449 など)を返します。

  4. flag が「LOCATION」に設定されている場合は、緯度、経度、リージョン、市区町村の 4 つの文字列要素(例:["44.9566", "34.1116", "Crimea", "Simferopol"])を含むテーブルを返します

  5. フラグが「ALL」に設定されている場合、宛先 IP アドレスに対して使用可能なすべての geo 情報とユーザー マッピングの一致を含むテーブルを返します

注:

この関数に使用されるデータベースは、NSX Advanced Load Balancer Controller で維持されるデフォルトのデータベースと同等です。位置情報データベースに関する記事に記載されているように、IP グループをオーバーライドしたり、IP グループで拡張したりすることはできません。

例 1

次の DataScript では、次のような geo ヘッダーが追加されています。

  • Geo: not found」:IP アドレスが位置情報データベースに見つからない場合。または、

  • Geo: <ASN>」:見つかった場合。

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 アドレスとネットマスクを受け入れ、ネットワーク アドレスを返します。

イベント

HTTP_REQ

HTTP_RESP

パラメータ

  • ip_addr は、IP アドレスを含む文字列です。

  • netmask は、ネットワーク マスクを含む整数です。

戻り値

すべての

  • ip_addr またはマスクが nil

  • ip_addr に「NIL」が含まれている、または

  • ip_addr に無効な IPv6 または IPv4 アドレスが含まれている

その場合、関数は 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 ()

機能

avi.utils.murmur_hash ( string )avi.utils.sha1_hash ( string )avi.utils.md5_hash ( string )

説明

DataScript は、MurmurHashSHA-1、および MD5 という、対応する名前付きハッシュ メソッドをサポートする 3 つの関数のいずれかを使用して、任意のデータをハッシュできます。

イベント

HTTP_REQ

HTTP_RESP

パラメータ

string は、ハッシュされる文字列です。

戻り値

ハッシュされた文字列

次の 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

curl -vvv http://10.160.33.200/echo_listen_port の出力は次のとおりです:

[string "DS1"]:2: Murmur-hash = 2050936584
[string "DS1"]:3: SHA1-hash = 0171e8d98bf187af83fe7a9dbbb34ebc6629dcbe
[string "DS1"]:4: MD5-hash = c4150a2ad26a0c6345041f11ba914661

avi.utils.rand_bytes

機能

avi.utils.rand_bytes(num_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_goodfalse の場合にのみ有効です。たとえば、値 1 はスパムの送信元(ビット 0 セット)を示し、値 17Spam 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 を構成する必要があります。