Luaでの接続処理

このセクションの内容:

概要

接続処理のスクリプトにおける要件

使用中のテーブル

利用可能な補助モジュール

概要

Dr.Web Firewall for LinuxはLuaのプログラムインタプリタを介して対話をサポートします(バージョン5.3.4が使用され、Dr.Web for UNIX Internet Gatewaysと一緒に提供されます)。Luaで書かれたスクリプトは、解析のためにSpIDer Gateに送信される前に、事前接続スキャンのためにコンポーネントによって使用されます。

このスクリプトへのパスがDr.Web Firewall for Linux設定(InterceptHookパラメータ)で指定されている場合、接続はLuaスクリプトで解析されます。それ以外の場合は、コンポーネント設定で指定されているデフォルト設定と処理ルール(RuleSet*パラメータ)を使用して接続処理が実行されます。

接続処理用のLuaスクリプトのその他の例については、次のリンクからご確認ください。
https://github.com/DoctorWebLtd/drweb-lua-examples/tree/master/firewall

接続処理のスクリプトにおける要件

このスクリプトには、接続スキャンモジュールのエントリポイントであるグローバル関数が含まれている必要があります(Dr.Web Firewall for Linuxは、新しく受信した接続を処理するためにこの関数を呼び出します)。この関数は、次の呼び出し規則を満たす必要があります。

関数名 - intercept_hook

引数 - Luaコンテキストテーブルのみ(処理された接続の関数からの情報へのアクセスを提供します。以下の表の説明を参照。)

戻り値 - 以下の表のいずれかの文字列値のみ

判定の説明

pass

SpIDer Gateによる接続のチェックを行わず、スキップします。

check

SpIDer Gateを使用して接続をチェックします。

reject

接続を破棄します(接続を開始したクライアントは、RSTフラグ付きのTCPパッケージを受信します)。

drop

切断します(接続を開始したクライアントは確認応答を受信しません)。


 

1.次のスクリプトは、Dr.Web Firewall for Linuxによって接続がチェックされないように、すべての接続に対して常にpass判定(スキップ)を返します。

-- Function of connection scanning written by the user
function intercept_hook(ctx)
  return "pass" -- do not scan the connection
end

2.次のスクリプトを使用すると、以下の例外を除いて、Dr.Web Firewall for Linuxは確立されているすべての接続をチェックします。

drwebグループのユーザー権限で実行されているアプリケーションからの送信ローカル接続

(接続の所有者とその方向に関係なく)権限のあるポートから開始された接続

ローカルネットワークからのIPアドレスから始まる接続

function intercept_hook(ctx)
  -- Do not scan connections, initiated from the local
  -- host (divert == "output") by application under the name of
  -- "drweb" (group == "[drweb]")
  if ctx.divert == "output" and ctx.group == "drweb" then
    return "pass"
  end

  -- Do not scan connections, initiated from
  -- privileged ports (range is from 0 to 1024)
  if ctx.src.port >= 0 and ctx.src.port <= 1024 then
    return "pass"
  end

  -- Do not scan connections from local network IP addresses
  -- (IP address range 127.0.0.1/8)
  if ctx.src.ip.belongs("127.0.0.0/8") then
    return "pass"
  end

  -- Connection is scanned by default
  return "check"
end

スクリプトで使用されるテーブル

1. InterceptContextテーブル

このテーブルは、処理された接続に関するデータをintercept_hook関数に転送するために使用されます。このデータに基づいて、次のいずれかのアクションを接続に対して実行できます。

チェックせずにスキップする。

接続を中断する。

チェックのためにSpIDer Gateに接続を送信する。

Dr.Web Firewall for Linuxではテーブルにデータを入力します。テーブルのデータの中には、intercept_hook関数が実行されるまでに使用できるものもあります。他のデータ(いわゆる「遅延」データ)は、テーブルの該当するフィールドのリクエストに応じて直接計算されます。

フィールド

説明

データタイプ

src

接続を開始したクライアントのアドレスとポート

例:

if ctx.src.port >= 0 and ctx.src.port <= 1024 then
  return "pass"
end

TcpEndpointテーブル

dst

クライアントによって接続が開始されたサーバーのアドレスとポート

例:

if ctx.dst.ip.belongs("10.20.30.41/8") then
  return "reject"
end

TcpEndpointテーブル

divert

監視される接続のタイプ:

"output" - 送信接続

"input" - 受信接続

"forward" - トランジット接続

例:

if ctx.divert == "forward" then
  return "check"
end

文字列

iface_in

接続が開始されたインターフェースの名前

インターフェース名が特定されていない場合は、nil値になります。

文字列

iface_out

接続が開始された後にパケットが送信されたインターフェースの名前

インターフェース名が特定されていない場合は、nil値になります。

文字列

uid

発信接続を開始したユーザーのID

接続タイプ(divert)が"output"ではない場合、またはUIDを特定できない場合は、nil値になります。

番号

gid

その権限により発信接続が開始されたグループのID

接続タイプ(divert)が"output"ではない場合、またはGIDを特定できない場合は、nil値になります。

番号

user

発信接続を開始したユーザーの名前

接続タイプ(divert)が"output"ではない場合、またはUIDを特定できない場合は、nil値になります。

文字列

group

その権限により発信接続が開始されたグループの名前

接続タイプ(divert)が"output"ではない場合、またはUIDを特定できない場合は、nil値になります。

文字列

pid

発信接続を開始したプロセスのID

接続タイプ(divert)が"output"ではない場合、またはPIDを特定できない場合は、nil値になります。

番号

exe_path

送信接続を開始したアプリケーションファイルへの実行パス

接続タイプ(divert)が"output"ではない場合、または実行パスを特定できない場合は、nil値になります。

文字列

無効になったメタメソッド:なし

2. TcpEndpointテーブル

このテーブルでは接続ポイント(クライアントまたはサーバー)のアドレスを指定します。

フィールド

説明

データタイプ

ip

IPアドレス

IpAddressテーブル

port

ポート番号

番号

無効になったメタメソッド:

__tostring - TcpEndpointを文字列に変換する関数。例:"127.0.0.1:443"(IPv4)または"[::1]:80"(IPv6)

__concat - TcpEndpointを文字列に連結する関数

利用可能な補助モジュール

LuaのプログラムスペースでDr.Web for UNIX Internet Gatewaysとやり取りするために、次の特定のモジュールをインポートできます。

モジュール名

機能

Luaプログラムを起動したDr.Web for UNIX Internet GatewaysコンポーネントのログにLuaプログラムからのメッセージを記録する機能と、Luaプロシージャの非同期実行の手段を提供するモジュール

Dr.Web LookupDモジュールを呼び出して外部ソースからデータを要求するためのツールを提供するモジュール

drwebモジュールの内容

1.機能

このモジュールには、次のような機能があります。

LuaプログラムからのメッセージをDr.Web for UNIX Internet Gatewaysコンポーネントログに保存する:

log(<level>, <message><message>文字列をDr.Web for UNIX Internet Gatewaysログ<level>レベル(必要なレベルは、「debug」「info」「notice」「warning」「error」を使用して定義します)で書き込みます。

debug(<message><message>文字列をDr.Web for UNIX Internet GatewaysログDEBUGレベルで書き込みます。

info(<message><message>文字列をDr.Web for UNIX Internet GatewaysログINFOレベルで書き込みます。

notice(<message><message>文字列をDr.Web for UNIX Internet GatewaysログNOTICEレベルで書き込みます。

warning(<message>)<message>文字列をDr.Web for UNIX Internet GatewaysログWARNINGレベルで書き込みます。

error(<message><message>文字列をDr.Web for UNIX Internet GatewaysログERRORレベルで書き込みます。

Luaプロシージャの同期を管理する:

sleep(<sec.>はこのLuaプロシージャインスタンスの実行を指定された秒数で一時停止します。

async(<Lua function>[, <argument list>])は、指定された関数を非同期的に起動し、指定された引数リストに渡します。async関数呼び出しはすぐに完了し、戻り値(Futureテーブル)を使用すると、<Lua function>の結果を取得できます。

IpAddressテーブルにIPアドレスを追加する:

ip(<address>は、IpAddressテーブルの形式で<address>文字列として送信される、IPアドレスを指定します。IPv4またはIPv6アドレスのいずれかを使用できます。

テキストファイルから外部データをアップロードする:

load_set(<file path>は、指定されたテキストファイルのコンテンツからtrue値を含むテーブルを生成します。ファイルから読み取られた文字列はキーとして使用されます。空の文字列と空白を含む文字列は無視されます。

load_array(<file path>は、指定されたテキストファイルのコンテンツから文字列の配列を生成します。空の文字列と空白文字のみで構成される文字列は無視され、配列には含まれません。

2.テーブル

Futureテーブルは、async関数を使用して関数を実行した後の保留中の結果を表します。

フィールド

説明

データタイプ

wait

async関数を使用して開始した関数の結果を返す関数。関数がまだ実行を完了していない場合は、完了を待って結果を返します。waitが呼び出される前に関数が完了した場合、結果はすぐに返されます。開始された関数が失敗した場合、wait呼び出しは同じエラーを生成します。

機能

無効になったメタメソッド:なし

IpAddressテーブルはIPアドレスを表します。

フィールド

説明

データタイプ

belongs

IpAddressテーブルに保存されているIPアドレスが、指定されたサブネット(IPアドレス範囲)に所属しているかどうかを確認する関数

"<IP address>"または"<IP address>/<mask>"のような文字列を唯一の引数として受け取ります。ここで、<IP address>はホストアドレスまたはネットワークアドレス("127.0.0.1"など)、<mask>はサブネットワークマスク("255.0.0.0"などのIPアドレスとして、または"8"などの数値形式で指定できます)です。

次のブール値を返します。

trueは、アドレスが指定されたアドレスの少なくとも1つと等しいか、指定されたサブネット(IPアドレスの範囲)の少なくとも1つに属していることを示します。

false - それ以外の場合。

機能

無効になったメタメソッド:

__tostringは、文字列内のIpAddressを変更する関数(例:"127.0.0.1"(IPv4)または"::1"(IPv6))です。

__concatは、IpAddressを文字列に結合する関数です。

__eqは、2つのIpAddressが等しいことを確認する関数です。

__bandは、マスクを適用するための関数(例:dw.ip('192.168.1.2') & dw.ip('255.255.254.0'))です

3.

非同期的に開始される手順によって生成されるメッセージをログへ書き込む:

local dw = require "drweb"

-- This function waits two seconds and returns a string,
-- received as an argument
function out_msg(message)
 dw.sleep(2)
 return message
end

-- "Main" function
function intercept(ctx)
 -- Output of a string at the NOTICE level to the Dr.Web for UNIX Internet Gateways log
 dw.notice("Intercept function started.")

 -- An asynchronous start of two copies of the out_msg function
 local f1 = dw.async(out_msg, "Hello,")
 local f2 = dw.async(out_msg, " world!")

 -- Waiting for the completion of the copies of the function
 -- out_msg and output its results to log
 -- the Dr.Web for UNIX Internet Gateways log at the DEBUG level
 dw.log("debug", f1.wait() .. f2.wait())
end

スケジュールされた手順を作成する:

local dw = require "drweb"

-- Save the table Future in the future global variable in order
-- to preven the removal by the garbage collector
future = dw.async(function()
   while true do
     -- Everyday, the following message is displayed in the log
     dw.sleep(60 * 60 * 24)
     dw.notice("A brand new day began")
   end
end)

文字列で表現されたIPアドレスをIpAddressテーブルに変更する:

local dw = require "drweb"

local ipv4 = dw.ip("127.0.0.1")
local ipv6 = dw.ip("::1")
local mapped = dw.ip("::ffff:127.0.0.1")

 

drweb.lookupモジュールの内容

1.機能

このモジュールは次の機能を提供します。

lookup(<request>, <parameters>は、Dr.Web LookupDモジュールを介して利用できる外部ストレージからデータを要求します。<request>引数は、Dr.Web LookupD設定内のセクション(文字列<type>@<tag>)に対応している必要があります。<parameters>引数は任意で、リクエストを生成するために使用される置換を表します。以下の自動的に許可されるマーカーを使用できます。

$u$Uは、クライアントコンポーネントによって送信されたユーザー名(user)に自動的に置き換えられます。

$d$Dは、クライアントコンポーネントによって送信されたドメイン(domain)に自動的に置き換えられます。

これらの引数はテーブルとして設定されます。このテーブルのキーと値は文字列でなければなりません。この関数は、リクエストの結果である文字列の配列を返します。

check(<checked string><request><parameters>は、Dr.Web LookupDモジュールを介して利用できる外部リポジトリで<checked string>が見つかった場合にtrueを返します。引数<request>および<parameters>lookup関数の引数と同じです(上記を参照)。<checked string>引数は、文字列または__tostringメタメソッドを持つテーブル(つまり、文字列にフォーマットできる)であると想定されます。

2.

LookupD.LDAP.usersデータソースから取得したユーザーのログリストへ書き込む:

local dw = require "drweb"
local dwl = require "drweb.lookup"

-- "Main" function
function intercept(ctx)
 -- Writing the string at the NOTICE level to the Dr.Web for UNIX Internet Gateways log
 dw.notice("Intercept function started.")

 -- Writing the request results to the Dr.Web for UNIX Internet Gateways log
 -- to the 'ldap@users' data source
 for _, s in ipairs(dwl.lookup("ldap@users", {user="username"})) do
   dw.notice("Result for request to 'ldap@users': " .. s)
 end

end