| このセクションの内容: •概要 •接続処理のスクリプトにおける要件 •例 •使用中のテーブル •利用可能な補助モジュール 概要 Dr.Web Firewall for LinuxはLuaのプログラムインタプリタを介して対話をサポートします(バージョン5.3.4が使用され、Dr.Web for UNIX Mail Serversと一緒に提供されます)。Luaで書かれたスクリプトは、解析のためにSpIDer Gateに送信される前に、事前接続スキャンのためにコンポーネントによって使用されます。 このスクリプトへのパスがDr.Web Firewall for Linux設定(InterceptHookパラメータ)で指定されている場合、接続はLuaスクリプトで解析されます。それ以外の場合は、コンポーネント設定で指定されているデフォルト設定と処理ルール(RuleSet*パラメータ)を使用して接続処理が実行されます。 接続処理のスクリプトにおける要件 このスクリプトには、接続スキャンモジュールのエントリポイントであるグローバル関数が含まれている必要があります(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 userfunction 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 defaultreturn "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 thenreturn "pass"
 end
 |  | TcpEndpointテーブル |  
| dst | クライアントによって接続が開始されたサーバーのアドレスとポート 例: 
| if ctx.dst.ip.belongs("10.20.30.41/8") thenreturn "reject"
 end
 |  | TcpEndpointテーブル |  
| divert | 監視される接続のタイプ: •"output" - 送信接続 •"input" - 受信接続 •"forward" - トランジット接続 例: 
| if ctx.divert == "forward" thenreturn "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 Mail Serversとやり取りするために、次の特定のモジュールをインポートできます。 
| モジュール名 | 機能 |  
| drweb | Luaプログラムを起動したDr.Web for UNIX Mail ServersコンポーネントのログにLuaプログラムからのメッセージを記録する機能と、Luaプロシージャの非同期実行の手段を提供するモジュール |  
| drweb.lookup | Dr.Web LookupDモジュールを呼び出して外部ソースからデータを要求するためのツールを提供するモジュール | drwebモジュールの内容 1.機能 このモジュールには、次のような機能があります。 •LuaプログラムからのメッセージをDr.Web for UNIX Mail Serversコンポーネントログに保存する: ▫log(<level>, <message>)は<message>文字列をDr.Web for UNIX Mail Serversログに<level>レベル(必要なレベルは、「debug」、「info」、「notice」、「warning」、「error」を使用して定義します)で書き込みます。 ▫debug(<message>)は<message>文字列をDr.Web for UNIX Mail ServersログにDEBUGレベルで書き込みます。 ▫info(<message>)は<message>文字列をDr.Web for UNIX Mail ServersログにINFOレベルで書き込みます。 ▫notice(<message>)は<message>文字列をDr.Web for UNIX Mail ServersログにNOTICEレベルで書き込みます。 ▫warning(<message>)は<message>文字列をDr.Web for UNIX Mail ServersログにWARNINGレベルで書き込みます。 ▫error(<message>)は<message>文字列をDr.Web for UNIX Mail Serversログに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" functionfunction intercept(ctx)
 -- Output of a string at the NOTICE level to the Dr.Web for UNIX Mail Servers log
 dw.notice("Intercept function started.")
  -- An asynchronous start of two copies of the out_msg functionlocal 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 Mail Servers 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" functionfunction intercept(ctx)
 -- Writing the string at the NOTICE level to the Dr.Web for UNIX Mail Servers log
 dw.notice("Intercept function started.")
  -- Writing the request results to the Dr.Web for UNIX Mail Servers 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 |  |