Luaでのメール処理

このセクションの内容

概要

Milter用のスクリプト

Spamd用のスクリプト

Rspamd用のスクリプト

SMTP用のスクリプト

メッセージ構造を指定するテーブル

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

概要

Dr.Web MailDコンポーネントはLuaプログラムインタプリタを介したインタラクションをサポートします(バージョン5.3.4を使用。Dr.Web for UNIX Mail Serversに同梱)。Luaで記述されたスクリプトをコンポーネントで使用すると、メールメッセージの解析と処理を実行できます。

Milter、Spamd、Rspamd、またはSMTPモードで受信したメールメッセージは、Dr.Web MailD設定でMilterHookSpamdHookRspamdHook、またはSmtphookパラメータの値としてそれぞれ指定したLuaスクリプトを使用して解析されます。これらのパラメータの値はスクリプトの全文またはスクリプトへのパスとして指定できます。

その他のメール処理用Luaスクリプトの例は、次の場所にあります。
https://github.com/DoctorWebLtd/drweb-lua-examples/tree/master/maild

Milterインターフェースのメッセージ処理のためのスクリプト

スクリプトの必要条件

スクリプトには、メッセージスキャンモジュールのエントリポイントとなるグローバル関数が含まれている必要があります(Dr.Web MailDは、すべての受信メッセージを処理する際にこの関数を呼び出します)。処理関数は、次の呼び出し規則を満たす必要があります。

1.関数名milter_hookです。

2.引数MilterContextテーブルのみです(関数から処理されたメールメッセージに関する情報へのアクセス権限を付与します)。

3.返り値MilterResult完了テーブルのみです。返り値は、スキャンされたメッセージについての判定(承認:"accept"、拒否:"reject"、変更:"change"、破棄:"discard")の他、メッセージが承認された場合にメッセージに適用される(可能性がある)アクションを定義します。

以下に示すのは、Milterインターフェースを介してスキャンするために、受信したすべてのメッセージのaccept判定を常にDr.Web MailDに返す関数を定義した例です(以降、ctx引数はMilterContextテーブルのインスタンスです)。

function milter_hook(ctx)
  return {action = "accept"}
end

1.脅威を検出し、スパムの兆候をチェックする

次のスクリプトは以下のように動作します。

メールメッセージで検出された脅威の名前をヘッダーX-Foundの値として追加する。

スパムスコアが100ポイントを超える場合は、メールの件名(ヘッダーSubjectの値)に[SPAM]プレフィックスを追加する。

処理後のメッセージを受信者に送信する。

function milter_hook (ctx)

 -- Add the detected threats’ names to the header
 for threat in ctx.message.threats() do
   ctx.modifier.add_header_field("X-Found", threat.name)
 end

 -- Change the value of the Subject header, if a message has more than 100 points of spam scoring
 if ctx.message.spam.score > 100 then
   local old_value = ctx.message.header.value("Subject") or ""
   local new_value = "[SPAM] " .. old_value
   ctx.modifier.change_header_field("Subject", new_value)
 end

 -- Send a message to a recipient, applying the pending changes
 return {
   action = "accept",
   modifications = ctx.modifier.modifications()
 }

end

2.検出されたすべての脅威を保護されたアーカイブに配置し、メッセージをアーカイブする(スパムスコアを超えた場合)

次のスクリプトは以下のように動作します。

検出された脅威を保護されたアーカイブに移動する。

スパムスコアが100ポイントを超える場合は、保護されたアーカイブにメールメッセージを移動する。

function milter_hook(ctx)

 ctx.modifier.repack_password = "xxx"
 ctx.modifier.repack_message = ""

 -- Move all message parts where threats were found
 -- to a password protected archive
 for threat, path in ctx.message.threats() do
   ctx.modifier.repack(path)
   local msg = " Threat found: " .. threat.name
   ctx.modifier.repack_message = ctx.modifier.repack_message .. msg
 end

 -- Repack the whole email message if it has
 -- more than 100 points of spam scoring
 if ctx.message.spam.score > 100 then
   ctx.modifier.repack()
   local msg = " Spam score: " .. ctx.message.spam.score
   ctx.modifier.repack_message = ctx.modifier.repack_message .. msg
 end

 -- Send a message to a recipient, applying the pending changes
 -- Note that if the modification table is not specified,
 -- it will be automatically returned
 return {action = "accept"}

end

チェックされているメッセージは修正されます。望ましくない部分はすべて削除され、アーカイブされて、添付ファイルとして受信者に送信されます。
メッセージの望ましくない要素が含まれるアーカイブは、ctx.modifier.repack_password変数の値として指定されたパスワードで保護されます。この場合、設定ファイルのRepackPasswordパラメータで指定されているパスワードは無効になります。

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

テーブルMilterContext

このテーブルはmilter_hook関数の入力引数として使用されます。このテーブルには、処理されているメールメッセージに関する情報(フィールド、構造、ヘッダー、本文、送信者と受信者に関する情報、SMTPセッションに関する情報)が含まれます。

フィールド

説明

データタイプ

session_id

このクライアントからのメッセージが処理されている間のクライアントセッションの識別子。

文字列

sender

メールメッセージの送信者に関する情報。

テーブルMilterSender

helo

メールメッセージを送信したSMTPクライアントから受信したウェルカム文字列HELO/EHLO、または文字列が見つからない/不明の場合(MTAによって提供されない場合)はnil

文字列

from

山括弧なしの送信者のメールアドレス(例:user@domain.com)。

文字列

to

山括弧なしの受信者のメールアドレス

テーブルRcptTo

message

メールメッセージ(本文とすべてのヘッダーを含む)。

テーブルMimeMessage

modifier

MilterResultテーブルのスキャン結果に従って"accept"アクションが生成された場合にメッセージに適用される、すべての変更が含まれるMilterModifierテーブル。

テーブルMilterModifier

gen

X-Antivirusなどの特殊なヘッダーを生成するために使用されるMilterGeneratorテーブル

テーブルMilterGenerator

spf

送信者のSPFチェックの実行に使用されるSPFテーブル

テーブルSPF

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

テーブルMilterSender

このテーブルはMilterContextテーブルのsenderフィールドとして使用されます。このテーブルには、メール送信者に関する情報が含まれます。

フィールド

説明

データタイプ

hostname

送信者のホスト名(FQDN)

文字列

family

文字列で示した接続タイプ

"U" - 不明なタイプ

"L" - UNIXソケット経由の接続

"4" - IPv4経由の接続

"6" - IPv6経由の接続

文字列

port

ポート番号

整数

ip

送信者のホストのIPアドレス。IPアドレスがないか不明の場合(MTAから提供されない場合)はnil

テーブルIpAddress

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

テーブルMilterResult

このテーブルは、milter_hook関数が返す結果を表しています。

フィールド

説明

データタイプ

action

メッセージに適用するアクションの説明を含む文字列:

"accept" - 承認(MTAから受信者へのメッセージ送信を許可します)。

"discard" - 送信者に通知せずにメッセージを破棄します。

"reject" - メッセージを拒否し、SMTP 5**コードを送信者に返します。

"tempfail" - メッセージを拒否し、SMTP 4**コードを送信者に返します。

"replycode" - codeフィールドで指定されたSMTPレスポンスを送信者に送信します。

必須フィールド。

文字列

code

送信者に送信される3桁のSMTPレスポンスコード(例:"541")。

オプションのフィールドです。action = "replycode"の場合にのみ使用します。

文字列

text

送信者に送信される応答テキストを含む文字列(例:"User not local or invalid address – Relay denied")。

オプションのフィールドです。action = "replycode"の場合にのみ使用します。

文字列

message

送信者に送信された応答テキストを含む文字列(例:"Message rejected as spam")。

オプションのフィールドです。action = "reject"の場合にのみ使用します。

文字列

modifications

受信者に送信する前に、メールメッセージに適用する変更を指定するテーブル。

オプションのフィールドです。action = "accept"の場合にのみ使用します。

テーブルMilterModifications

added_recipients

追加のメッセージ受信者のメールアドレスリスト。

オプションのフィールドです。action = "accept"の場合にのみ使用します。

文字列の配列

deleted_recipients

メッセージ受信者のリストから除外するメールアドレスのリスト。

オプションのフィールドです。action = "accept"の場合にのみ使用します。

文字列の配列

incident

Mailタイプの登録済みイベントでのインシデントの説明。

このフィールドが文字列の場合、この文字列の内容がMailイベントのincident_textフィールドに送信され、イベントが登録されます。

このフィールドがブール値でfalseに等しい場合、Mailイベントのincident_textフィールドは存在せず、イベントは登録されません。

このフィールドがブール値でtrueに等しい場合、Mailイベントのincident_textフィールドは自動的に入力され、incident_textの値が空でない場合はイベントが登録されます。

文字列またはブール値

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

テーブルMilterModifications

このテーブルは、受信者への配信が決定された場合(acceptアクションが選択された場合)に、メールメッセージに対して行われるすべての変更の指定に使用されます。このテーブルのフィールドはすべてオプションです。フィールド値がない場合、このフィールドで指定されたアクションはメッセージに適用されません。

フィールド

説明

データタイプ

new_body

処理されているメッセージの本文を置き換えるために使用される新しいメッセージ本文(ヘッダーなし)

文字列

added_fields

処理されているメッセージに追加されるヘッダー

MilterAddedFieldテーブルの配列

changed_fields

処理されているメッセージから変更される、または削除されるヘッダー

MilterChangedFieldテーブルの配列

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

テーブルMilterAddedField

このテーブルには、処理されているメッセージに追加されるヘッダーの指定が含まれます。

フィールド

説明

データタイプ

name

ヘッダー名

文字列

value

ヘッダー値

文字列

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

テーブルMilterChangedField

このテーブルには、処理されているメッセージで変更される(またはメッセージから削除される)ヘッダーの指定が含まれます。

フィールド

説明

データタイプ

name

ヘッダー名

文字列

index

変更するメッセージ内でnameの名前を持つヘッダーの序数(1からカウント)

番号

value

ヘッダーの新しい値(ヘッダーを削除する場合、値は空の文字列""

文字列

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

処理後にメッセージに加えられる変更の説明については、MilterModificationsテーブルに直接入力しないことをお勧めします。代わりに、コンテキストから受け取ることができるMilterModifierテーブルのメソッドを使用してください。

テーブルMilterGenerator

このテーブルには、X-AntivirusおよびX-Authentication-Resultsの標準ヘッダーを生成するための二次的な方法が含まれます。

フィールド

説明

データタイプ

х_antivirus_header_field

この関数は、メッセージのスキャンに関与したアンチウイルスコンポーネントに関する情報を含むX-Antivirusヘッダーを生成するために使用され、HeaderFieldテーブルまたはnil(メッセージがまだスキャンされていない場合)を返します。
HeaderFieldnameフィールドは固定値(X-Antivirus)です。

機能

authentication_results_header_field

この関数は、DKIMおよびSPFチェックの結果に関する情報を含むAuthentication-Resultsヘッダーを生成するために使用されます。オプションの引数として、生成されるヘッダー内のサーバーのIDであるauthserv_id文字列を取ります。authserv_idの値はデフォルトで、Dr.Web MailDが実行されているホストの名前と一致します。
この関数はHeaderFieldテーブルを返します。
HeaderFieldnameフィールドは固定値(Authentication-Results)です。

機能

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

テーブルMilterModifier

このテーブルは、メッセージの処理後(受信者に送信される場合)に行う、メッセージに対する変更内容の指定に使用されます。

フィールド

説明

データタイプ

add_header_field

メールメッセージに新しいヘッダーを追加するアクションを指定する関数。

次の2つの必須の引数を受け取ります。

nameはヘッダー名(文字列)です。

valueはヘッダー値(文字列)です。

値はRFC 2047に従ってエンコードされます。

機能

change_header_field

指定されたヘッダーを変更(または削除)するアクションを指定する関数。

次の2つの必須の引数を受け取ります。

nameはヘッダー名(文字列)です。

valueはヘッダー値(文字列)です。

メッセージに指定された名前を持つ複数のヘッダーがある場合、この関数はその名前を持つ最初のヘッダーの値を変更します。同じヘッダーの値が複数回変更された場合は、最後の値だけが保持されます。valueが空の文字列""の場合、ヘッダーのnameはメッセージから削除されます。

値はRFC 2047に従ってエンコードされます。

機能

modifications

メールメッセージへの実行が指定されている変更の全リストを含むMilterModificationsテーブルを返す関数。引数はありません。

機能

repack

指定したメッセージ部分(部分が指定されていないか、指定された部分がない場合はメッセージ全体)の再圧縮を指定する関数。再圧縮中に、指定した部分がパスワード付きでアーカイブに追加されます。

オプションの引数pathまたはiteratorを受け入れます。

pathは、アーカイブされるスキャンされたメールの添付ファイルへのパスです。パスが指定されていない場合や、指定されたパスが無効な場合は、メッセージ全体がアーカイブされます。

iteratorはメッセージ部分の反復子であり、関数によって、MimePartテーブルのthreatsurlsattachmentsfilespartsleaf_partstext_partsが返されます。この場合、反復子から返されたメッセージのすべての部分が再圧縮されるように指定されます。

関数の引数が指定されていない場合、または指定されたパスが無効な場合は、メッセージ全体がアーカイブされます。

例:

-- Schedule the entire message to be repacked
-- to an archive with a password
ctx.modifier.repack()

-- Schedule some parts of a message at the specified path
-- (or the entire message if the part does not exist)
-- to be repacked to an archive with a password
ctx.modifier.repack('/1/2/3')

-- Schedule all message parts that contain executables
-- to be repacked to an archive with a password
ctx.modifier.repack(ctx.message.files{name='*.exe'})

-- Schedule all ZIP attachements to be repacked
-- to an archive with a password
ctx.modifier.repack(ctx.message.attachments{name='*.zip'})

機能

repack_archive_name

メッセージの悪意のあるアイテムまたは不要なアイテムを圧縮するためのアーカイブの名前。デフォルトでは、"quarantine.zip"

文字列

repack_password

アーカイブ保護のためのパスワード。指定されていない場合は、構成ファイルに指定されたパスワードが使用されます(RepackPasswordパラメータ)。

文字列

repack_message

メッセージ(またはその部分)の再圧縮の理由を表す任意のメッセージ。最終メッセージに追加されます(省略することもできます)。

文字列

templates_dir

再圧縮のためのテンプレートが保存されているディレクトリへのパス。パスは、設定ファイル(TemplatesDirパラメータ)に指定したパスを基準にした相対パスになります。デフォルト値は"milter"です(つまり、milterサブディレクトリのテンプレートが使用されます)。

文字列

cure

添付ファイルの修復を指定する関数。

オプションの引数pathまたはiteratorを受け入れます。

pathは、スキャンされたメール添付ファイルへのパスです。添付ファイルが無害であるか、または修復されている場合、cure(path)関数はtrueを返します。添付ファイルが修復できない場合、この関数はfalseを返します。

iteratorはメッセージ部分の反復子であり、関数によってMimePartテーブルのthreatsurlsattachmentsfilespartsleaf_partstext_partsが返されます。この場合、反復子から返されたメッセージのすべての部分が修復されるように指定されます。すべての添付ファイルが無害であるか、または修復されている場合、cure(iterator)関数はtrueを返します。少なくとも1つの添付ファイルが修復できない場合、この関数はfalseを返します。

関数の引数が指定されていない場合、cure(ctx.message.leaf_parts())を呼ぶのと同じです。すべての添付ファイルが無害であるか、または修復されている場合、trueを返します。少なくとも1つの添付ファイルが修復できない場合、この関数はfalseを返します。

機能

cure_or_repack

添付ファイルの修復を指定する関数。修復できない場合、添付ファイルは再圧縮されます。再圧縮中に、指定した部分がパスワード付きでアーカイブに追加されます。

オプションの引数pathまたはiteratorを受け入れます。

pathは、スキャンされたメール添付ファイルへのパスです。添付ファイルが無害であるか、または修復されている場合、cure_or_repack(path)関数はtrueを返します。添付ファイルが修復できない場合、この関数はfalseを返し、添付ファイルを再圧縮するよう指定します。

iteratorはメッセージ部分の反復子であり、関数によってMimePartテーブルのthreatsurlsattachmentsfilespartsleaf_partstext_partsが返されます。この場合、反復子から返されたメッセージのすべての部分が修復されるように指定されます。すべての添付ファイルが無害であるか、または修復されている場合、cure_or_repack(iterator)関数はtrueを返します。少なくとも1つの添付ファイルが修復できない場合、この関数はfalseを返し、修復できないすべての添付ファイルを再圧縮するよう指定します。

関数の引数が指定されていない場合、cure_or_repack(ctx.message.leaf_parts())を呼ぶのと同じです。すべての添付ファイルが無害であるか、または修復されている場合、trueを返します。少なくとも1つの添付ファイルが修復できない場合、この関数はfalseを返し、修復できないすべての添付ファイルを再圧縮するよう指定します。

機能

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

このテーブルにアクセスするには、MilterContextテーブルのmodifierフィールドを使用する必要があります。例:

function milter_hook(ctx)

 -- Schedule adding a new header
 -- at the end of the list of headers
 ctx.modifier.add_header_field("X-Name", "Value")

 -- Schedule changing the "Subject" field value to "New value"
 ctx.modifier.change_header_field("Subject", "New value")

 -- Schedule repacking messages to an archive with a password
 ctx.modifier.repack()

 -- Return verdict via the milter protocol (table MilterResult)
 -- and apply all pending changes of the message
 return {action = "accept"}
end

以下に示すのは、MilterModifierテーブルは使用せずに、MilterResultテーブル(およびそのmodificationsフィールド、つまりMilterModificationsテーブル)に直接入力する例です。

-- Enable message sending to recipients by adding
-- the "X-Checked: True" header

function milter_hook(ctx)
 return {
  action = "accept",
  modifications = {
    added_fields = {
      {
        name = "X-Checked",
        value = "True"
      }
    }
  }
 }
end

次に示すのは、MilterModifierテーブルに加えられた変更に関係なくaccept判定を返す例です。

function milter_hook(ctx)

 …

 -- Schedule adding the message header
 ctx.modifier.add_header_field('X-Header', 'some value')

 …

 -- Force return of an empty MilterModifications table
 return {action = "accept", modifications = {}}
end

Spamdインターフェースのメッセージ処理のためのスクリプト

スクリプトの必要条件

スクリプトには、メッセージスキャンモジュールのエントリポイントとなるグローバル関数が含まれている必要があります(Dr.Web MailDは、すべての受信メッセージを処理する際にこの関数を呼び出します)。処理関数は、次の呼び出し規則を満たす必要があります。

1.関数名spamd_report_hookです。

2.引数SpamdContextテーブルのみです(関数から処理されたメールメッセージに関する情報へのアクセス権限を付与します)。

3.返り値は入力済みのSpamdReportResultテーブルのみです。返り値はSpamdを介したレスポンスを定義します。

以下に示すのは、メッセージをスパムとしてマークする必要があるという判定を常にDr.Web MailDに返す関数を定義した例です(スパムスコア:200、スパム判定最低スコア:100、メッセージ:The message was recognized as spam。以降、ctx引数はSpamdContextテーブルのインスタンスです)。

-- An example of a trivial realization

function spamd_report_hook(ctx)
 return {
  score = 200,
  threshold = 100,
  report = "The message was recognized as spam"
 }
end

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

テーブルSpamdContext

このテーブルはspamd_report_hook関数の入力引数として使用されます。このテーブルには、処理されているメールメッセージに関する情報(構造、ヘッダー、本文、送信者と受信者に関する情報、SMTPセッションに関する情報)が含まれます。

フィールド

説明

データタイプ

session_id

このクライアントからのメッセージが処理されている間のクライアントセッションの識別子。

文字列

message

メールメッセージ

テーブルMimeMessage

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

テーブルSpamdReportResult

このテーブルは、spamd_report_hook関数が返す結果を表します。Dr.Web MailDにスパムのスキャン結果を渡し、結果はMTAに返されます。

フィールド

説明

データタイプ

score

メッセージに割り当てられたスパム評価(Exim MTAの場合、$spam_scoreおよび$spam_score_int変数が入力されます)

番号

threshold

メッセージがスパムと判定されるしきい値

番号

report

メッセージスキャンのテキスト結果(Exim MTAの場合、$spam_report変数が入力されます)

文字列

incident

Mailタイプの登録済みイベントでのインシデントの説明。

このフィールドが文字列の場合、この文字列の内容がMailイベントのincident_textフィールドに送信され、イベントが登録されます。

このフィールドがブール値でfalseに等しい場合、Mailイベントのincident_textフィールドは存在せず、イベントは登録されません。

このフィールドがブール値でtrueに等しい場合、Mailイベントのincident_textフィールドは自動的に入力され、incident_textの値が空でない場合はイベントが登録されます。

文字列またはブール値

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

Rspamdインターフェースのメッセージ処理のためのスクリプト

スクリプトの必要条件

このスクリプトには、メッセージスキャンモジュールのエントリポイントとして機能するグローバル関数が含まれている必要があります(Dr.Web MailDは、新たに受信したメッセージを処理する際にこの関数を呼び出します)。処理関数は、次の呼び出し規則を満たす必要があります。

1.関数名rspamd_hookです。

2.引数RspamdContextテーブルのみです(関数から処理されたメールメッセージに関する情報へのアクセス権限を付与します。下記のテーブルの説明を参照)。

3.返り値は入力済みのRspamdResultテーブルのみです(下記のテーブルの説明を参照)。返り値はRspamDを介したレスポンスを定義します。

スクリプトの定義例(ctx引数はRspamdContextテーブルのインスタンスになります):

-- An example of a trivial realization

function rspamd_hook(ctx)
 return {
  score = 200,
  threshold = 100
 }
end

以下のスクリプトは、簡潔なコメントとともにスパムスコアを含むRspamdSymbol(メッセージで検出されたスパムの兆候と、それぞれの兆候に対応するポイント数)の他に、MTAの推奨されるアクションを返します。

function rspamd_hook(ctx)
 return {
  score = 1080,
  threshold = 100,
  action = "REJECT:Malicious message"
  symbols = {
   {
     name = "Threat found",
     score = 1000
   },
   {
     name = "Spam score by the third-party anti-spam library",
     score = 80
   }
  }
 }
end

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

テーブルRspamdContext

このテーブルはrspamd_hook関数の入力引数として使用され、処理されているメールメッセージに関する情報が含まれます。

フィールド

説明

データタイプ

session_id

このクライアントからのメッセージが処理されている間のクライアントセッションの識別子。

文字列

sender

メッセージ送信者に関する情報

テーブルRspamdSender

helo

SMTPクライアントから受信した文字列HELO/EHLO、または文字列が見つからない/不明の場合(MTAによって提供されない場合)はnil

文字列

from

送信者のメールアドレス(山括弧なし、例:user@domain.com)。アドレスが見つからない/不明な場合(MTAから提供されない場合)はnil

文字列

to

山括弧なしの受信者のメールアドレス

テーブルRcptTo

message

メールメッセージ

テーブルMimeMessage

spf

送信者のSPFチェックの実行に使用されるSPFテーブル

テーブルSPF

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

テーブルRspamdSender

このテーブルには、メッセージ送信者に関する情報が含まれます。

フィールド

説明

データタイプ

hostname

送信者のホストの名前(FQDN)、または名前が見つからないか不明の場合(MTAによって提供されない場合)はnil

文字列

ip

送信者のホストのIPアドレス。アドレスが見つからないか不明の場合(MTAから提供されない場合)はnil

テーブルIpAddress

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

テーブルRspamdResult

このテーブルは、rspamd_hook関数が返す結果を表しており、メッセージのスキャンレポートが含まれます。

フィールド

説明

データタイプ

score

スキャン後にメッセージに割り当てられたスパムスコア(Exim MTAの場合、$spam_scoreおよび$spam_score_int変数が入力されます)

番号

threshold

メッセージがスパムとして扱われる最小のスパムスコア

番号

action

オプションのフィールドで、メッセージスキャンの結果としてMTAに推奨されるアクションです(Exim MTAの場合、$spam_action変数が入力されます)。

文字列

symbols

オプションのフィールドです。scoreフィールドで指定されたスパムポイント数を割り当てる理由を特定するためのRspamdSymbolテーブルの配列

RspamdSymbolテーブルの配列

incident

Mailタイプの登録済みイベントでのインシデントの説明。

このフィールドが文字列の場合、この文字列の内容がMailイベントのincident_textフィールドに送信され、イベントが登録されます。

このフィールドがブール値でfalseに等しい場合、Mailイベントのincident_textフィールドは存在せず、イベントは登録されません。

このフィールドがブール値でtrueに等しい場合、Mailイベントのincident_textフィールドは自動的に入力され、incident_textの値が空でない場合はイベントが登録されます。

文字列またはブール値

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

テーブルRspamdSymbol

このテーブルでは、メッセージ内で検出されたスパムの兆候(脅威のあるファイル、望ましくないURLなど)のうち、スパムスコアに加点されるものを指定します。

フィールド

説明

データタイプ

name

検出されたスパムの兆候の名前

文字列

score

この兆候が検出されるとスパムスコアに加算されるポイント

番号

description

検出されたスパムの兆候の簡単な説明(オプションのフィールド)

文字列

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

SMTPモードのメッセージ処理のためのスクリプト

スクリプトの必要条件

このスクリプトには、メッセージスキャンモジュールのエントリポイントとなるグローバル関数が含まれている必要があります(Dr.Web MailDは、新たに受信したメッセージを処理する際にこの関数を呼び出します)。処理関数は、次の呼び出し規則を満たす必要があります。

1.関数名smtp_hookです。

2.引数SmtpContextテーブルのみです(関数から処理されたメールメッセージに関する情報へのアクセス権限を付与します)。

3.返り値SmtpResult完了テーブルのみです。返り値は、スキャンされたメッセージについての判定(承認:"accept"、拒否:"reject"、変更:"change"、破棄:"discard")の他、メッセージが承認された場合にメッセージに適用される(可能性がある)アクションを定義します。

以下に示すのは、SMTPモードを介してスキャンするために、受信したすべてのメッセージのAccept判定を常にDr.Web MailDに返す関数を定義した例です(以降、ctx引数はSmtpContextテーブルのインスタンスです)。

function smtp_hook(ctx)
 return {action = "accept"}
end

以下のスクリプトは、すべてのメールメッセージについてAcceptの判定をDr.Web MailDに返し、すべてのメッセージに"X-Checked: True"ヘッダーフィールドを追加します。

function smtp_hook(ctx)
 return {
  action = "accept",
  modifications = {
   added_fields = {
     {
      name = "X-Checked",
      value = "True"
     }
   }
  }
 }
end

modificationsテーブルを形成するために、次の例のように、SmtpContextテーブルの補助的なMilterModifierオブジェクトを使用できます。

function smtp_hook(ctx)
 local modifier = ctx.modifier

 -- Schedule appending a new field to the end of the header
 modifier.add_header_field("X-Name", "Value")

 -- Schedule changing the "Subject" field value to "New value"
 modifier.change_header_field("Subject", "New value")

 -- Schedule repacking messages to an archive with a password
 modifier.repack()

 -- Apply all pending changes to the message and send it
 -- modifications do not have to be specified, the changes will be taken directly from modifier
 return { action = "accept", modifications = modifier.modifications() }
end

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

テーブルSmtpContext

このテーブルはsmtp_hook関数の入力引数として使用され、処理されているメールメッセージに関する情報が含まれます。

フィールド

説明

データタイプ

session_id

このクライアントからのメッセージが処理されている間のクライアントセッションの識別子。

文字列

sender

メールメッセージの送信者に関する情報。

テーブルMilterSender

helo

SMTPクライアントから受信した文字列HELO/EHLO、または文字列が見つからない/不明の場合(MTAによって提供されない場合)はnil

文字列

from

送信者のアドレス(山括弧なし。例:"user@domain.com"

文字列

to

山括弧なしの受信者のメールアドレス

テーブルRcptTo

message

メールメッセージ

テーブルMimeMessage

modifier

MilterModifierテーブルには、MilterResultテーブルのスキャン結果に従って"accept"アクションが生成された場合にメッセージに行われるすべての変更が含まれます。

テーブルMilterModifier

gen

X-Antivirusなどの特殊なヘッダーを生成するために使用されるMilterGeneratorテーブル

テーブルMilterGenerator

spf

送信者のSPFチェックの実行に使用されるSPFテーブル

テーブルSPF

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

テーブルSmtpResult

このテーブルは、smtp_hook関数が返す結果を表しており、チェックされているメッセージに適用されるアクションの指定が含まれます。

フィールド

説明

データタイプ

action

メッセージに適用するアクションの説明を含む文字列:

"accept" - 承認(MTAから受信者へのメッセージ送信を許可します)。

"discard" - 送信者に通知せずにメッセージを破棄します。

"tempfail" - メッセージを拒否し、SMTP 4**コードを送信者に返します。

必須フィールド。

文字列

modifications

受信者に送信する前に、メールメッセージに適用する変更を指定するテーブル。

オプションのフィールドです。action = "accept"の場合にのみ使用します。

テーブルMilterModifications

added_recipients

追加のメッセージ受信者のメールアドレスリスト。

オプションのフィールドです。action = "accept"の場合にのみ使用します。

文字列の配列

deleted_recipients

メッセージ受信者のリストから除外するメールアドレスのリスト。

オプションのフィールドです。action = "accept"の場合にのみ使用します。

文字列の配列

message

拒否されているメッセージについて送信者に送信される応答テキストを含む文字列。同期的にメッセージがチェックされている場合は、541コードとともに送信者に返されます。

オプションのフィールドです。action = "reject"の場合にのみ使用します。

文字列

incident

Mailタイプの登録済みイベントでのインシデントの説明。

このフィールドが文字列の場合、この文字列の内容がMailイベントのincident_textフィールドに送信され、イベントが登録されます。

このフィールドがブール値でfalseに等しい場合、Mailイベントのincident_textフィールドは存在せず、イベントは登録されません。

このフィールドがブール値でtrueに等しい場合、Mailイベントのincident_textフィールドは自動的に入力され、incident_textの値が空でない場合はイベントが登録されます。

文字列またはブール値

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

メッセージ構造を指定するテーブル

テーブルRcptTo

このテーブルには、SMTPプロトコルのRCPT TOコマンドで発生したメッセージ受信者のメールアドレス(山括弧なし)の配列の他、次の追加情報が含まれます。

フィールド

説明

データタイプ

search

アドレス配列内の指定されたテンプレートの少なくとも1つに対応する少なくとも1つのアドレスの存在を確認する関数。

Perl構文(PCRE)の1つの必須patterns引数(検索パターン:1つ(文字列)または複数(文字列の配列))の正規表現を受け入れます。

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

true - 少なくとも1つのテンプレートに対応するアドレスが見つかった場合

false - 少なくとも1つのテンプレートに対応するアドレスが見つからなかった場合

大文字と小文字を区別しません。

機能

all_match

すべてのアドレスがアドレス配列内の指定されたテンプレートの少なくとも1つに対応するかどうかをチェックする関数。

Perl構文(PCRE)の1つの必須patterns引数(検索パターン:1つ(文字列)または複数(文字列の配列))の正規表現を受け入れます。

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

true - すべてのアドレスが少なくとも1つのテンプレートに完全に対応する場合

false - いずれのテンプレートにも完全に対応するアドレスがない場合

大文字と小文字を区別しません。

機能

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

テーブルMimeMessage

このテーブルでは、処理されているメールメッセージをまとめて指定します(MimePartテーブルと同じフィールドと、いくつかの追加情報が含まれます)。

フィールド

説明

データタイプ

dkim

メールメッセージのDKIM署名(RFC 6376を参照)

DKIMテーブル

raw

クライアントから受信したメールメッセージ

文字列

spam

スパムの兆候に対するメッセージスキャンの結果についてのレポート

テーブルSpam

from

Fromヘッダー値。メッセージにFromがない場合はnil

テーブルFrom

to

Toヘッダー値。メッセージにToがない場合はnil

テーブルTo

date

Dateヘッダー値。メッセージにDateがない場合はnil

文字列

message_id

Message-IDヘッダー値。メッセージにMessage-IDがない場合はnil

文字列

subject

Subjectヘッダー値。メッセージにSubjectがない場合はnil

文字列

user_agent

User-Agentヘッダー値。メッセージにUser-Agentがない場合はnil

文字列

vxcube_analysis

Dr.Web vxCubeからのメッセージ解析結果。このフィールドはSMTPモードのときにのみ存在します。

VxcubeAnalysisテーブルの配列

(次のフィールドはMimePartテーブルのフィールドと同様で、ルートMIME部分を指定します)

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

テーブルMimePart

このテーブルではメールメッセージの部分を指定します。

フィールド

説明

データタイプ

header

メッセージのヘッダー。

テーブルMimeHeader

body

該当部分の本体。添付された部品がある場合はnil

テーブルMimeBody

part

テーブルの配列として(現在のメッセージ部分に)添付された部分。添付された部品がない場合、配列は空になります。

MimePartテーブルの配列

content_disposition

このヘッダーが該当部分にない場合、Content-Dispositionヘッダーのコンテンツ、またはnil

テーブルContentDisposition

content_id

このヘッダーが該当部分にない場合、Content-IDヘッダーのコンテンツまたはnil

文字列

content_type

このヘッダーが該当部分にない場合、Content-Typeヘッダーのコンテンツまたはnil

テーブルContentType

name

添付ファイル名。該当部分が添付ファイルでない場合はnil

文字列

part_at

path引数(メッセージの子部分へのパス)を受け取る関数。指定されたパスにある添付されたメッセージ部分(テーブルMimePart)を返します。

path"/1/2/3"のような文字列となります。これは、root_part. part [1]. part [2]. part [3]を意味します。数字のない"""/""//"のようなパスはメッセージ部分に対応し、この関数の呼び出し元になります(例:root_part)。指定したパスに子部分がない場合や、パスが正しくない場合は、関数はnilを返します。

機能

threats

オプションの引数としてfilterを取る関数。この関数は単一の値、つまり反復子関数を返します。この反復子を使用すると、メッセージのこの部分とその添付部分にある、指定されたfilter条件を満たすすべての脅威を調べることができます。反復子関数は引数を持たず、次の2つの値を返します。

Virusテーブル。

検出された脅威を含むメッセージ部分への相対パス。

filter引数として、次のものを使用できます。

ThreatFilterテーブル。

Virus引数のみを受け取り、次のブール値を返す任意の叙述関数:

otrue - 引数が条件を満たしている(脅威である)場合

ofalse - 引数が条件(脅威である)を満たしていない場合

機能

urls

オプションの引数としてfilterを取る関数。この関数は単一の値、つまり反復子関数を返します。この反復子を使用すると、メッセージのこの部分とその添付部分にある、指定されたfilter条件を満たすすべてのURLを調べることができます。反復子関数は引数を持たず、次の2つの値を返します。

Urlテーブル。

見つかったURLを含むメッセージ部分への相対パス。

filter引数として、次のものを使用できます。

UrlFilterテーブル。

Url引数のみを受け取り、次のブール値を返す任意の叙述関数:

otrue - 引数が条件を満たしている(不要である)場合

ofalse - 引数が条件(望ましくないものではない)を満たしていない場合

機能

attachments

オプションの引数としてfilterを取る関数。この関数は単一の値、つまり反復子関数を返します。この反復子を使用すると、メッセージのこの部分とその添付部分にある、指定されたfilter条件を満たすすべての添付ファイルを調べることができます。反復子関数は引数を持たず、次の2つの値を返します。

MimePartテーブル。

見つかった添付ファイルを含むメッセージ部分への相対パス。

filter引数として、次のものを使用できます。

PartFilterテーブル。

MimePart引数のみを受け取り、次のブール値を返す任意の叙述関数:

otrue - 引数が条件を満たしている場合

ofalse - 引数が条件を満たしていない場合

機能

files

オプションの引数としてfilterを取る関数。この関数は単一の値、つまり反復子関数を返します。この反復子を使用すると、メッセージのこの部分とその添付部分(アーカイブを含む)にある、指定されたfilter条件を満たすすべてのファイルを調べることができます。反復子関数は引数を持たず、次の2つの値を返します。

文字列で示したファイル名。

見つかったファイルを含むメッセージ部分への相対パス。

filter引数として、次のものを使用できます。

FileFilterテーブル。

ファイル名を文字列として受け取り、次のブール値を返す任意の叙述関数:

otrue - 引数が条件を満たしている場合

ofalse - 引数が条件を満たしていない場合

機能

parts

オプションの引数としてfilterを取る関数。この関数は単一の値、つまり反復子関数を返します。この反復子を使用すると、メッセージのこの部分とその添付部分にある、指定されたfilter条件を満たすすべてのメッセージ部分を調べることができます。反復子関数は引数を持たず、次の2つの値を返します。

MimePartテーブル。

メッセージ部分への相対パス。

filter引数として、次のものを使用できます。

PartFilterテーブル。

MimePartテーブルを受け取り、次のブール値を返す任意の叙述関数:

otrue - 引数が条件を満たしている場合

ofalse - 引数が条件を満たしていない場合

機能

leaf_parts

オプションの引数としてfilterを取る関数。この関数は単一の値、つまり反復子関数を返します。この反復子を使用すると、メッセージのこの部分とその添付部分にある、指定されたfilter条件を満たすすべてのリーフ部分を調べることができます。反復子関数は引数を持たず、次の2つの値を返します。

MimePartテーブル。

メッセージ部分への相対パス。

filter引数として、次のものを使用できます。

PartFilterテーブル。

MimePartテーブルを受け取り、次のブール値を返す任意の叙述関数:

otrue - 引数が条件を満たしている場合

ofalse - 引数が条件を満たしていない場合

機能

text_parts

オプションの引数としてfilterを取る関数。この関数は単一の値、つまり反復子関数を返します。この反復子を使用すると、メッセージのこの部分とその添付部分にある、指定されたfilter条件を満たすすべてのテキスト部分を調べることができます。反復子関数は引数を持たず、次の2つの値を返します。

MimePartテーブル。

メッセージ部分への相対パス。

filter引数として、次のものを使用できます。

PartFilterテーブル。

MimePartテーブルを受け取り、次のブール値を返す任意の叙述関数:

otrue - 引数が条件を満たしている場合

ofalse - 引数が条件を満たしていない場合

機能

scan_reports

オプションの引数としてfilterを取る関数。この関数は単一の値、つまり反復子関数を返します。この反復子を使用すると、指定されたfilter条件を満たす、メッセージのこの部分とその添付部分のスキャンに関するすべてのレポートを調べることができます。

反復子関数には引数がなく、単一の値、つまりScanReportテーブルを返します。

filter引数として、次のものを使用できます。

ScanReportFilterテーブル。

ScanReportテーブルを受け取り、次のブール値を返す任意の叙述関数:

otrue - 引数が条件を満たしている場合

ofalse - 引数が条件を満たしていない場合

機能

has_url

オプションの引数としてfilterを取る関数(既述のurls関数の説明を参照)。

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

true - メッセージの該当部分とその添付された部分に条件filterを満たすURLが含まれる場合。

false - メッセージの該当部分と添付された部分のいずれにも、条件filterを満たすURLが含まれていない場合

例:

if ctx.message.has_url() then
  -- at least one URL has been found in the email message
end

if ctx.message.has_url{category = "adult_content"} then
  -- an adult content link has been found
end

if ctx.message.has_url{category = {"adult_content", "social_networks"}} then
  -- an "adult_content" or a "social_networks" link has been found
end

if ctx.message.has_url{category = "black_list"} then
  -- a link to a blacklisted resource been found
end

if ctx.message.has_url{host = "example.com"} then
  end
end

if ctx.message.has_url{host_not = "*example.com"} then
  -- a link detected with a host that does not correspond to the "*example.com" template
end

if ctx.message.has_url(function(url) return port > 80 end) then
  -- a link whose port number is more than 80 has been found
end

機能

has_threat

オプションの引数としてfilterを取る関数(既述のthreats関数の説明を参照)。

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

true - メッセージの該当部分と添付ファイル部分に条件filterを満たす脅威が含まれる場合。

false - メッセージの該当部分と添付された部分のいずれにも、条件filterを満たす脅威が含まれていない場合

例:

if ctx.message.has_threat() then
  -- the message contains at least one threat of any category
end

if ctx.message.has_threat({category = "known_virus"}) then
  -- the message contains at least one threat of the "known_virus" category
end

if ctx.message.has_threat{category = "known_virus"} then
  -- the same
end

if ctx.message.has_threat({category = {"known_virus", "joke"}}) then
  -- the message contains at least one threat of the "known_virus" or "joke" category
end

if ctx.message.has_threat{category_not = "joke"} then
  -- the message contains a threat of any category except "joke"
end

機能

has_file

オプションの引数としてfilterを取る関数(既述のfiles関数の説明を参照)。

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

true - メッセージの該当部分とその添付ファイル部分に条件filterを満たすファイルが含まれる場合(アーカイブのファイルを含む)。

false - メッセージの該当部分と添付された部分のいずれにも、条件filterを満たすURLが含まれていない場合

例:

if ctx.message.has_file() then
  -- at least one file has been found in the email message
end

if ctx.message.has_file{name = "*.exe"} then
  -- at least one exe file has been found in the email message
end

機能

has_part

オプションの引数としてfilterを取る関数(既述のparts関数の説明を参照)。

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

true - メッセージの該当部分とその添付ファイル部分に条件filterを満たす部分が含まれる場合。

false - メッセージの該当部分と添付された部分のいずれにも、条件filterを満たす部分が含まれていない場合

機能

has_scan_report

オプションの引数としてfilterを取る関数(既述のscan_reports関数の説明を参照)。

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

true - メッセージの該当部分とその添付ファイル部分に条件filterを満たすスキャンレポートが含まれる場合。

false - メッセージの該当部分と添付された部分のいずれにも、条件filterを満たすスキャンレポートが含まれていない場合

使用例については、ScanReportFilterテーブルの説明を参照してください。

機能

search

正規表現(PCRE)を使用してこのメッセージセクション内のテキストを検索する関数。正規表現(文字列)を受け取ります。引用符内で文字列を使用する場合は、スラッシュ文字をエスケープする必要があります。

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

true - 指定した正規表現との一致がこのセクションまたは子部分で見つかった場合。

false - 指定した正規表現との一致がこのセクションまたは子部分で見つからなかった場合。

機能

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

テーブルFrom

このテーブルではFromメールメッセージヘッダーを指定します。ヘッダー(文字列の配列)から抽出されたメールアドレスのリストに加えて、次のフィールドも含まれます。

フィールド

説明

データタイプ

search

アドレス配列内の指定されたテンプレートの少なくとも1つに対応する少なくとも1つのアドレスの存在を確認する関数。

Perl構文(PCRE)の1つの必須patterns引数(検索パターン:1つ(文字列)または複数(文字列の配列))の正規表現を受け入れます。

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

true - 少なくとも1つのテンプレートに完全に対応するアドレスが見つかった場合

false - 少なくとも1つのテンプレートに完全に対応するアドレスが見つからなかった場合

大文字と小文字を区別しません。

機能

all_match

すべてのアドレスがアドレス配列内の指定されたテンプレートの少なくとも1つに対応するかどうかをチェックする関数。

Perl構文(PCRE)の1つの必須patterns引数(検索パターン:1つ(文字列)または複数(文字列の配列))の正規表現を受け入れます。

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

true - すべてのアドレスが少なくとも1つのテンプレートに完全に対応する場合

false - 少なくとも1つのテンプレートに完全に対応するアドレスがない場合

大文字と小文字を区別しません。

機能

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

__tostringは、デコードされたヘッダー値を返す関数です。

__concatは、ヘッダーの復号化された値を文字列と連結する関数です。

テーブルTo

このテーブルではToメールメッセージヘッダーを指定します。Fromテーブルと同じフィールドとメソッドが含まれています。

テーブルContentType

このテーブルではメッセージ部分のContent-Typeヘッダーを指定します。

フィールド

説明

データタイプ

type

メッセージ部分のMIMEタイプ

文字列

subtype

メッセージ部分のサブタイプ

文字列

param

次のフィールドを持つテーブル配列形式のヘッダーパラメータ:

nameはパラメータ名(文字列)です。

valueはパラメータ値(文字列)です。

テーブル配列

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

__tostringは、デコードされたヘッダー値を返す関数です。

__concatは、ヘッダーの復号化された値を文字列と連結する関数です。

テーブルContentDisposition

このテーブルではメッセージ部分のContent-Dispositionヘッダーを指定します。

フィールド

説明

データタイプ

type

メッセージ部分のビュータイプ

文字列

param

次のフィールドを持つテーブル配列形式のヘッダーパラメータ:

nameはパラメータ名(文字列)です。

valueはパラメータ値(文字列)です。

テーブル配列

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

__tostringは、デコードされたヘッダー値を返す関数です。

__concatは、ヘッダーの復号化された値を文字列と連結する関数です。

テーブルSpam

このテーブルには、指定されたメッセージのスパムチェックレポートが含まれます。

フィールド

説明

データタイプ

type

メッセージのタイプ(スパムのステータス)。以下の値を使用できます。

"legit" - メッセージはスパムではありません。

"spam" - メッセージはスパムです。

"virus" - 他社製ヒューリスティックアナライザにより、メッセージ本文にウイルスが検出されました。

"bounce" - メッセージには、元のメッセージの送信者に送信されたネガティブ配信確認(DSN)に関するレポートが含まれています。

"suspicious" - 疑わしいメッセージ。

"pce" - 有効なサブスクリプションサービスによって送信される「プロフェッショナルな」商用(広告)メッセージ。

"mce" - 有効なサブスクリプションサービスでは送信されないが、サブスクリプションを解除する方法が含まれる商用(広告)メッセージ。

"dce" - サブスクリプションを解除する方法のない「ダーティーな」コマーシャル(広告)メッセージ。

"community" - ソーシャルネットワークからのメッセージ。

"transactional" - トランザクション関連のメッセージ(登録、サービスまたは商品の購入)。

"phishing" - 不正なメッセージ。

"scam" - 不正なメッセージ(詐欺メッセージ)。

文字列

score

メッセージに割り当てられたスパム評価

番号

normalized_score

インターバル[0, 1]で正規化されたスパムスコア

番号

reason

メールメッセージがスパムであるとされた理由の説明を含む暗号化された文字列

文字列

version

サードパーティ製アンチスパムライブラリのバージョン

文字列

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

テーブルVirus

このテーブルでは脅威を指定します。

フィールド

説明

データタイプ

type

脅威の種類(Doctor Webの分類による):

"known_virus" - 既知の脅威(ウイルスデータベースに登録されている脅威)。

"virus_modification" - 既知の脅威の亜種。

"unknown_virus" - 未知の脅威、疑わしいオブジェクト。

"adware" - 広告プログラム。

"dialer" - ダイアラープログラム。

"joke" - ジョークプログラム。

"riskware" - 潜在的に危険なプログラム。

"hacktool" - ハッキングツール。

文字列

name

脅威の種類(Doctor Webの分類による)

文字列

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

テーブルUrl

URLを指定するテーブルです。

フィールド

説明

データタイプ

scheme

スキーム(プロトコル)プレフィックス。例:"http"

文字列

host

ホスト名またはIPアドレス。例:"example.com"

文字列

port

ポート番号。例:80。URLに含まれていない場合、値はnilになります。

番号

path

リソースへのパス。例:"index.html"。URLに含まれていない場合、値はnilになります。

文字列

categories

スキャンの結果に基づいてURLを配置するカテゴリーの配列。以下の値を使用できます。

"infection_source" - 感染源。

"not_recommended" - 非推奨のWebサイト。

"adult_content" - アダルトコンテンツ。

"violence" - 暴力。

"weapons" - 武器。

"gambling" - ギャンブル。

"drugs" - 薬物。

"obscene_language" - 卑猥な表現。

"chats" - チャット。

"terrorism" - テロリズム。

"free_email" - 無料メール。

"social_networks" - ソーシャルネットワーク。

"owners_notice" - 著作権者からの申し立てによってリストに登録されたWebサイト。

"online_games" - オンラインゲーム。

"anonymizers" - アノニマイザー。

"cryptocurrency_mining_pools" - 仮想通貨マイニングプール。

"jobs" - 求人検索サイト。

"black_list" - ブラックリスト(メールサーバー管理者によって非推奨と見なされるリソース)。

文字列のテーブル

legal_url

URLがowners_noticeカテゴリーに属する場合、フィールドには所有者のWebサイトへのURLが含まれます。属さない場合はnilになります。

文字列

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

__toString - この関数は、Urlコンテンツを文字列(UTF-8)として返します。

__concat - この関数は、URL文字列値と別の文字列を連結します。

テーブルThreatFilter

このテーブルでは脅威のフィルターを指定します。フィールドはすべてオプションです。

フィールド

説明

データタイプ

category

脅威が該当すると予想されるカテゴリーのリスト(大文字と小文字は区別されません)。Virusテーブルのtypeフィールドの説明にあるカテゴリーのリストを参照してください。

文字列または文字列のテーブル

category_not

脅威が該当しないと予想されるカテゴリーのリスト(大文字と小文字は区別されません)。

文字列または文字列のテーブル

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

フィルターフィールドが指定されていない(値がnilである)場合、脅威はフィルターと一致します。複数のフィルターフィールドが指定されている場合、条件は接続詞(論理積)によって結合されます。フィルターフィールドがテーブル(リスト)の場合、オブジェクトは少なくとも1つのテーブル(リスト)の項目と一致する必要があります。

使用例:

1.メッセージで検出された脅威の名前をすべてログに書き込む。

function milter_hook(ctx)

 …

 for virus in ctx.message.threats() do
  dw.notice("threat found: " .. virus.name)
 end

 …

end

2.カテゴリーフィルターに一致する脅威の名前と、脅威が検出されたメッセージ部分の名前をログに書き込む。

function milter_hook(ctx)

 …

 for v, p in ctx.message.threats({category = "known_virus"}) do
  dw.notice("found " .. v.name .. " in " .. ctx.message.part_at(p).name(p))
 end

 …

end

3.叙述関数に一致する脅威名と、脅威が検出されたメッセージ部分の名前をログに書き込む。

function milter_hook(ctx)

 …

 local function eicar_filter(v)
  return v.name == "EICAR Test File (NOT a Virus!)"
 end

 for v, p in ctx.message.threats(eicar_filter) do
  dw.notice("found " .. v.name .. " in " .. ctx.message.part_at(p).name(p))
 end

 …

end

テーブルUrlFilter

このテーブルでは、URLに適用されるフィルターを指定します(既述のテーブルThreatFilterと同様)。フィールドはすべてオプションです。

フィールド

説明

データタイプ

category

URLが該当するカテゴリーのリスト(大文字と小文字は区別されません)。Urlテーブルのcategoriesフィールドの説明にあるカテゴリーのリストを参照してください。

文字列または文字列のテーブル

category_not

URLが該当しないカテゴリーのリスト(大文字と小文字は区別されません)。

文字列または文字列のテーブル

text

URLと一致しなければならないテキスト

文字列または文字列のテーブル

text_not

URLと一致できないテキスト

文字列または文字列のテーブル

host

URLに存在するホスト(ドメイン)

文字列または文字列のテーブル

host_not

URLにないホスト(ドメイン)

文字列または文字列のテーブル

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

フィルターフィールドが指定されていない(値がnilである)場合、脅威はフィルターと一致します。複数のフィルターフィールドが指定されている場合、条件は接続詞(論理積)によって結合されます。フィルターフィールドがテーブル(リスト)の場合、オブジェクトは少なくとも1つのテーブル(リスト)の項目と一致する必要があります。

使用例:

1.メッセージ内に見つかったすべてのURLをログに書き込む。

function milter_hook(ctx)

 …

 for url in ctx.message.urls() do
  dw.notice("url found: " .. url)
 end

 …

end

2.カテゴリーに一致するURLと、URLが検出されたメッセージ部分の名前をログに書き込む。

function milter_hook(ctx)

 …

 for u, p in ctx.message.urls{category = "adult_content"} do
  dw.notice("found " .. u.text .. " in " .. ctx.message.part_at(p).name(p))
 end

 …

end

テーブルFileFilter

このテーブルでは、ファイルに適用されるフィルターを指定します(既述のテーブルThreatFilterと同様)。フィールドはすべてオプションです。

フィールド

説明

データタイプ

name

ファイル名が一致すると予想される文字セットまたはワイルドカード(例:"*.exe""eicar.txt")。

大文字と小文字を区別しません。

文字列または文字列のテーブル

name_re

ファイル名が一致すると予想される正規表現(PCRE)(例:".*\\.zip"[[.*\.zip]])。

大文字と小文字を区別しません。引用符内で文字列を使用する場合は、スラッシュ文字をエスケープする必要があります。

文字列または文字列のテーブル

name_not

ファイル名が一致しないと予想される文字セットまたはワイルドカード。

大文字と小文字を区別しません。

文字列または文字列のテーブル

name_re_not

ファイル名が一致しないと予想される正規表現(PCRE)。

大文字と小文字を区別しません。引用符内で文字列を使用する場合は、スラッシュ文字をエスケープする必要があります。

文字列または文字列のテーブル

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

複数のフィルターフィールドが指定されている場合、条件は接続詞(論理積)によって結合されます。フィルターフィールドがテーブル(配列)の場合、オブジェクトは少なくとも1つのテーブル(配列)の項目と一致する必要があります。フィルターフィールドが指定されていない(値がnilである)場合、すべてのファイルがフィルターと一致します。

使用例:

.exe拡張子を持つファイルを含む、該当部分の名前をログに出力する。

function milter_hook(ctx)

 …

 for f, p in ctx.message.files{name = "*.exe"} do
  local where = ctx.message.part_at(p).name
  if not where or where == "" then where = p end
  dw.notice("EXE found in " .. where)
 end

 …

end

テーブルPartFilter

このテーブルではメッセージ部分のフィルターを指定します(既述のテーブルFileFilterと同様)。フィールドはすべてオプションです。

フィールド

説明

データタイプ

name

該当部分の名前が一致すると予想される文字セットまたはワイルドカード(例:"*.exe""eicar.txt")。

大文字と小文字を区別しません。

文字列または文字列のテーブル

name_re

該当部分の名前が一致すると予想される正規表現(PCRE)(例:".*\\.zip"[[.*\.zip]])。

大文字と小文字を区別しません。引用符内で文字列を使用する場合は、スラッシュ文字をエスケープする必要があります。

文字列または文字列のテーブル

content_type

該当部分のContent-Typeの値が一致すると予想される文字セット(例:"image/*")。

大文字と小文字を区別しません。

文字列または文字列のテーブル

content_disposition

該当部分(添付ファイル)のContent-Dispositionの値が一致すると予想される文字セット(例:"inline""attachment")。

大文字と小文字を区別しません。

文字列または文字列のテーブル

name_not

ファイル名が一致しないと予想される文字セット。

大文字と小文字を区別しません。

文字列または文字列のテーブル

name_re_not

該当部分の名前が一致しないと予想される正規表現。

大文字と小文字を区別しません。引用符内で文字列を使用する場合は、スラッシュ文字をエスケープする必要があります。

文字列または文字列のテーブル

content_type_not

該当部分のContent-Typeの値が一致しないと予想される文字セット。

大文字と小文字を区別しません。

文字列または文字列のテーブル

content_disposition_not

該当部分のContent-Dispositionの値が一致しないと予想される文字セット。

大文字と小文字を区別しません。

文字列または文字列のテーブル

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

フィルターフィールドが指定されていない(値がnilである)場合、任意の部分(添付ファイル)がフィルターと一致します。複数のフィルターフィールドが指定されている場合、条件は接続詞(論理積)によって結合されます。フィルターフィールドがテーブル(配列)の場合、オブジェクトは少なくとも1つのテーブル(配列)の項目と一致する必要があります。

使用例:

1.すべての添付ファイルとそのMD5ハッシュをログに書き込む。

function milter_hook(ctx)

 …

 for a, p in ctx.message.attachments() do
  -- the attachment name be an empty string
  -- if it is not specified in Content-Type and in Content-Disposition
  local name = a.name
  if name == "" then name = "at path " .. p end
  dw.notice("Attachment: " .. name .. "; md5=" .. a.body.md5)
 end

 …

end

2..exe拡張子を持つすべての添付ファイルをログに書き込む。

function milter_hook(ctx)

 …

 for a in ctx.message.attachments{name = "*.exe"} do
  dw.notice("EXE attachment: " .. a.name)
 end

 …

end

3.メールメッセージにある画像をカウントし、種類別にソートする。

function milter_hook(ctx)

 …

 local images = {}
 for part, path in ctx.message.parts{content_type = "image/*"} do
  local subtype = part.content_type.subtype
  images[subtype] = (images[subtype] or 0) + 1
 end

 for t, c in pairs(images) do
  dw.notice("Found " .. t .. " images: " .. c)
 end

 …

end

4.添付ファイルにあるオーディオファイルのリストをログに書き込む。

function milter_hook(ctx)

 …

 for p, path in ctx.message.parts{
  content_type = "audio/*",
  content_disposition = {"inline", "attachment"}
 } do
    local name = p.name
    if name == "" then name = "<unnamed>" end
    dw.notice("Audio file: " .. name)
 end

 …

end

テーブルScanReportFilter

このテーブルでは、脅威のメッセージ部分をスキャンするレポートのフィルターを指定します(既述のテーブルFileFilterと同様)。次のフィールドが含まれます(フィールドはすべてオプションです)。

フィールド

説明

データタイプ

error

ScanReportに追加されるエラーの名前(例:"password_protected""scan_timeout"

大文字と小文字を区別しません。

文字列または文字列のテーブル

error_not

ScanReportに追加されてはならないエラーの名前(例:"password_protected""scan_timeout"

大文字と小文字を区別しません。

文字列または文字列のテーブル

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

複数のフィルターフィールドが指定されている場合、条件は接続詞(論理積)によって結合されます。フィルターフィールドがテーブル(配列)の場合、スキャンレポートは少なくとも1つのテーブル(配列)の項目と一致する必要があります。フィルターフィールドが指定されていない(値がnilである)場合、スキャンレポートはすべてフィルターに一致します。

使用例:

1.パスワードで保護されたアーカイブのスキャンに失敗した場合に、メッセージを隔離する。

function milter_hook(ctx)

 …

 if ctx.message.has_scan_report{error = 'password_protected'} then
   return
    {
      action = 'accept', deleted_recipients = ctx.to,
      added_recipients = {'quarantine@mail.domain.com'}
    }
 end

 …

end

2.スキャン制限を超えている場合にメッセージを隔離する。

function milter_hook(ctx)

 …

 local limit_errors = {
  'archive_level_limit', 'compression_limit',
  'container_level_limit', 'mail_level_limit',
  'packer_level_limit', 'report_size_limit'
 }

 if ctx.message.has_scan_report{error = limit_errors} then
   return
    {
      action = 'accept', deleted_recipients = ctx.to,
      added_recipients = {'quarantine@mail.domain.com'}
    }
 end

 …

end

3.スキャンエラーがある場合にメッセージを拒否する。

function milter_hook(ctx)

 …

 if ctx.message.has_scan_report{error = '*'} then
   return {action = 'reject'}
 end

 …

end

テーブルMimeHeader

このテーブルではメッセージ部分のヘッダーを指定します。

フィールド

説明

データタイプ

field

ヘッダーとその値のリスト

HeaderFieldテーブルの配列

search

正規表現(PCRE)でヘッダーを検索する関数。引数として正規表現(文字列)を取ります。検索は、メッセージ部分のすべてのヘッダーで行われます。引用符内で文字列を使用する場合は、スラッシュ文字をエスケープする必要があります。

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

true - field.name .. ": " .. field.value.decoded文字列が、少なくとも1つのヘッダーに対して指定した正規表現と一致する場合

false - field.name .. ": " .. field.value.decoded文字列が、少なくとも1つのヘッダーに対して指定した正規表現と一致しない場合

機能

value

指定したヘッダーの値を返す関数。引数としてヘッダーの名前(文字列)を取ります。

この関数は、指定した名前を持つ最初に見つかったヘッダーに対応するHeaderFieldValueテーブルを返します。ヘッダーが見つからなかった場合は、nilを返します。

機能

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

テーブルHeaderField

このテーブルではメッセージ部分のヘッダーを指定します。

フィールド

説明

データタイプ

name

ヘッダー名

文字列

value

ヘッダー値

テーブルHeaderFieldValue

url

ヘッダー値で見つかったURLのリスト(Subjectヘッダーのみ)。それ以外のヘッダーではnil

Urlテーブルの配列

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

テーブルHeaderFieldValue

このテーブルではメールメッセージヘッダーの値を指定します。

フィールド

説明

データタイプ

raw

未加工の(デコードされていない)ヘッダー値

文字列

decoded

デコードされたヘッダー値

文字列

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

__toString - この関数は、HeaderFieldValueの内容(decodedフィールドの値)を文字列として返します。

__concat - この関数は、HeaderFieldValuedecodedフィールドの値)と別の文字列を連結します。

テーブルMimeBody

このテーブルではメッセージ部分の本文を指定します。

フィールド

説明

データタイプ

raw

メッセージ部分の未加工の(デコードされていない)本文

文字列

decoded

メッセージ部分本体のデコードされた値(Content-Transfer-EncodingヘッダーとContent-Typeヘッダーの値に応じたもの)

文字列

text

Content-Typeヘッダーのcharsetパラメータに従って、UTF-8でデコードされたメッセージ部分本体の値。

"Content-Type: text/*"を持つ部分またはContent-Typeが空の部分にのみ存在します。それ以外の場合は、nilになります。

文字列

scan_report

脅威のスキャンレポート

テーブルScanReport

url

部分テキストに見つかったURL。Urlテーブルの配列。

textフィールドがない場合(nil)、フィールドは空になります。

Urlテーブルの配列

search

正規表現(PCRE)を使用してこの本文内のテキストを検索する関数。引数として正規表現(文字列)を取ります。引用符内で文字列を使用する場合は、スラッシュ文字をエスケープする必要があります。

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

true - 本文がテキストであり、一致が見つかった場合

false - 本文に一致するものが見つからなかった場合

機能

md5

メールメッセージ本文のMD5ハッシュ。

文字列

sha1

メールメッセージ本文のSHA1ハッシュ。

文字列

sha256

メールメッセージ本文のSHA256ハッシュ。

文字列

vxcube_analysis

Dr.Web vxCubeからのメッセージ解析結果。このフィールドはSMTPモードのときにのみ存在します。

VxcubeAnalysisテーブルの配列

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

テーブルScanReport

このテーブルには、脅威のスキャンについてのレポートが含まれます。

フィールド

説明

データタイプ

object

スキャンされたオブジェクトの名前

文字列

archive

スキャンされたオブジェクトがコンテナの場合は、コンテナに関する情報。オブジェクトがコンテナではない場合、nil

Archiveテーブル

virus

検出された脅威のリスト

Virusテーブルの配列

error

エラーが発生した場合は、スキャンエラーの文字列が含まれます。発生していない場合は、nilになります。使用可能な値:

"path_not_absolute" - 指定されたパスは絶対パスではありません。

"file_not_found" - ファイルが見つかりませんでした。

"file_not_regular" - ファイルは通常のファイルではありません。

"file_not_block_device" - ブロックデバイスではありません。

"name_too_long" - 名前が長すぎます。

"no_access" - アクセスが拒否されました。

"read_error" - 読み取りエラーが発生しました。

"write_error" - 書き込みエラー。

"file_too_large" - ファイルが大きすぎます。

"file_busy" - ファイルは使用中です。

"unpacking_error" - アンパックエラー。

"password_protected" - アーカイブはパスワードで保護されています。

"arch_crc_error" - CRCアーカイブエラー。

"arch_invalid_header" - 無効なアーカイブヘッダー。

"arch_no_memory" - アーカイブを解凍するための十分なメモリがありません。

"arch_incomplete" - 不完全なアーカイブ。

"can_not_be_cured" - ファイルを修復できません。

"packer_level_limit" - 圧縮されたオブジェクトのネスティングレベルの上限を超えました。

"archive_level_limit" - アーカイブのネスティングレベルの上限を超えました。

"mail_level_limit" - メールファイルのネスティングレベルの上限を超えました。

"container_level_limit" - コンテナのネスティングレベルの上限を超えました。

"compression_limit" - 圧縮率の上限を超えました。

"report_size_limit" - レポートサイズの上限を超えました。

"scan_timeout" - スキャンタイムアウトの上限を超えました。

"engine_crash" - スキャンエンジンの障害。

"engine_hangup" - スキャンエンジンのハングアップ。

"engine_error" - スキャンエンジンエラー。

"no_license" - アクティブなライセンスが見つかりません。

"multiscan_too_late" - マルチスキャンエラー。

"curing_limit_reached" - 修復試行の上限を超えました。

"non_supported_disk" - サポートされていないディスクタイプ。

"unexpected_error" - 予期しないエラー。

文字列

item

コンテナ添付ファイルのスキャンに関するレポート(オブジェクトがコンテナである場合、すなわちアーカイブ、添付されたMIMEオブジェクトなど)

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

Archiveテーブル

このテーブルではアーカイブとその他の複合オブジェクトを指定します。

フィールド

説明

データタイプ

type

アーカイブの種類:

"archive" - アーカイブ。

"mail"- メールファイル。

"container" - その他のコンテナ。

文字列

name

アーカイブ名。例:ZIP

文字列

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

テーブルDKIM

このテーブルでは、メッセージ内のすべてのDKIM署名を指定します。

フィールド

説明

データタイプ

signature

メッセージに存在するDKIM署名のリスト

DKIMSignatureテーブルの配列

has_valid_signature

引数としてfilterを取り、以下を返す関数

DKIMSignatureテーブルの形式で"pass"に等しいスキャン結果を持つ、最初に見つかったDKIM署名。

検証で署名が検出されなかった場合、nilが表示されます。

filter引数として、次のものを使用できます。

DKIMSignatureFilterテーブル。

DKIMSignature引数のみを受け取り、ブール値を返す任意の叙述関数:

otrue - 引数が条件を満たしている場合

ofalse - 引数が条件を満たしていない場合

機能

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

テーブルDKIMSignature

このテーブルでは、メッセージ内の各DKIM署名のプロパティを指定します。

フィールド

説明

データタイプ

auid

DKIM署名の"i"タグから取得されるエージェントまたはユーザー識別子(AUID)の値は、デフォルト値を考慮します

文字列

data

DKIM署名の"b"タグから抽出された署名のテキスト(base64)値

文字列

result

DKIM署名検証結果

DKIMResultテーブル

sdid

DKIM署名の"d"タグから取得した署名ドメイン識別子(SDID)の値

文字列

selector

DKIM署名の"s"タグから取得したセレクター

文字列

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

テーブルDKIMResult

このテーブルでは、メッセージのすべてのDKIM署名の結果を指定します。

フィールド

説明

データタイプ

type

テキスト形式のDKIM署名検証結果。次の値が含まれる場合があります。

passは、署名の検証が成功したことを示します。

failは、署名の検証が失敗したことを示します(つまり、メール本文のハッシュと一致しないか、署名を検証できませんでした)。

neutralは、DKIM署名の構文エラーです。

temperrorは、ドメインキーの取得に失敗したことを示します(DNSエラー)。

permerrorは、他のタイプのエラー(署名形式、キー形式、キーと署名の間の不整合など)を示します。

文字列

comment

スキャン結果のコメント(Authentication-Resultsのコメントとして使用できます)

文字列

key_size

スキャン中に使用されるキーサイズはnilか、キーまたはスキャン結果の取得に失敗した場合はneutral

番号

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

テーブルDKIMSignatureFilter

このテーブルではDKIMメッセージ署名のフィルターを指定します(既述のテーブルFileFilterと同様)。フィールドはすべてオプションです。

フィールド

説明

データタイプ

domain

DKIM署名のSDIDフィールドのドメインが一致すると予想される文字セットまたはワイルドカード

文字列または文字列のテーブル

domain_not

DKIM署名のSDIDフィールドのドメインが一致しないと予想される文字セットまたはワイルドカード

文字列または文字列のテーブル

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

フィルターフィールドが指定されていない場合(つまり、nil値が含まれている場合)、このメッセージのDKIM署名はすべてフィルターと一致します。複数のフィルターフィールドが指定されている場合、条件は接続詞(論理積)によって結合されます。フィルターフィールドタイプがテーブル(配列)の場合、フィルターされたオブジェクトは、テーブル(配列)要素の少なくとも1つと一致する必要があります。

テーブルSPF

このテーブルには、SPFをチェックするために必要なすべてのデータが含まれます。

フィールド

説明

データタイプ

helo

HELOチェックの結果

from

MAIL FROMチェックの結果

check()

補助関数。最初にMAIL FROMチェックを実行し、(判定が受信されなかった場合は)次にHELOチェックを実行します。この関数は文字列としてチェックの結果を返します。これは、SPFResult***テーブルstatusフィールドの値と同じ値になる場合があります。

この関数は、生成されたAuthentication-Resultsヘッダーを介して結果をOpenDMARCに送信するように設計されています。

機能

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

テーブルSPFResult

SPFのチェック結果を含むテーブル。

フィールド

説明

データタイプ

status

文字列として表されるチェックの結果。noneneutralpassfailsoftfailtemperrorpermerrorのいずれかの値を取ることができます(RFC 7208に準拠します)。

文字列

explanation

failのレスポンスを受け取った場合の結果の説明。

文字列、または説明を受け取らなかった場合や説明が得られなかった場合はnil

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

テーブルVxcubeAnalysis

このテーブルにはDr.Web vxCubeのオブジェクト解析の結果が含まれます。

フィールド

説明

データタイプ

filename

解析された添付ファイルの名前

文字列

id

解析ID

文字列

sample_id

解析されたファイルのID

文字列

format_name

解析されたファイルのフォーマット

文字列

tasks

解析結果

VxcubeTaskテーブルの配列

max_maliciousness

VxcubeTaskテーブルの配列からのmaliciousnessフィールドの最大値。0から100までの浮動小数で、エラーが発生した場合はnil

数字またはnil

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

テーブルVxcubeTask

このテーブルには、Dr.Web vxCubeの特定のプラットフォームで実行されたオブジェクト解析の結果が含まれます。テーブルの構造は、Dr.Web vxCube APIを介して受け取ったTaskFinishedオブジェクトとほぼ同等です。

フィールド

説明

データタイプ

id

タスクID。

文字列

status

"failed""finished"などの解析ステータス。

文字列

platform_code

解析が行われたプラットフォームのコード。エラーがあった場合はnil

文字列またはnil

maliciousness

オブジェクトの悪質性。0から100の浮動小数、またはエラーがあった場合はnil

数字またはnil

verdict

<category><degree>の形式で表される、3つのカテゴリーのいずれかに対応するファイルの総合的な悪意性スコア。<category>"neutral""suspicious""malware"の値のいずれかであり、<degree>は悪質性の程度(1~3)を表す整数です。判定の値は"malware1""suspicious3"などになります。

文字列

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

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

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

モジュール名

機能

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

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

ホストのアドレスがDNSxLブラックリストにあるかどうかを確認するためのツールを提供します。

文字列と正規表現を一致させるためのインターフェースを提供します。

外部アプリケーション(プロセス)を実行するためのインターフェースを提供します。

Dr.Web MailD設定パラメータ値を持つテーブルを提供します。

MailDが実行される合間にデータを保存するための機能を提供します。

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" function
function 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 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 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" function
function 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

 

drweb.dnsxlモジュールの内容

1.機能

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

ip(<IP address>, <DNSxL server>)は指定されたIPアドレス<IP address>に対応するDNSxLサーバー<DNSxL server>からAタイプのDNSレコードをリクエストします。

検査されているIPアドレスがDNSxLサーバーのリストに登録されている場合、結果は架空のIPアドレスのリストになります。さらに、返された架空のIPアドレスのそれぞれに、検査済みの<IP address>がこのサーバーのリストに表示されている理由が含まれていることがあります(通常、理由タイプは返された架空のIPアドレスの最後のオクテット値によって決まります)。DNSxLサーバーにIPアドレス<IP address>に対応するAタイプのDNSレコードが含まれていない場合、関数はnilを返します。

url(<URL>, <SURBL server>)<URL>ドメイン部分に対応する<SURBL server>サーバーにAタイプのDNSレコードをリクエストします(HTTPリダイレクトは処理されません)。

<URL>から取得された、検査されているドメインがSURBLサーバーのサーバーリストに登録されている場合、結果は架空のIPアドレスのリストになります。さらに、返された架空のIPアドレスのそれぞれに、検査済みのドメインがこのサーバーのリストに表示されている理由が含まれていることがあります(通常、理由タイプは返された架空のIPアドレスの最後のオクテット値によって決まります)。SURBLサーバーに<URL>からのドメインに対応するAタイプのDNSレコードが含まれていない場合、この関数はnilを返します。

関数の引数は、文字列または文字列にキャストされるオブジェクトです(たとえば、<IP address>としてはIpAddressテーブルを使用でき、<URL>としてはUrlテーブルを使用できます)。IPアドレスは、IpAddressテーブルの配列として返されます。

2.テーブル

IpAddressテーブルではIPアドレスを指定します。このテーブルの説明については上記を参照してください。

3.

DNSxLサーバーによるIPアドレスのスキャン結果をログへ出力する。

local dw = require "drweb"
local dwxl = require "drweb.dnsxl"

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

 -- Output of the scanning results to the Dr.Web for UNIX Mail Servers log
 -- 10.20.30.40 IP addresses are in the DNSxL server black list
 -- dnsxl.server1.org
 local records = dwxl.ip("10.20.30.40", "dnsxl.server1.org")
 if records then
   for _, ip in ipairs(records) do
    dw.notice("DNSxL A record for 10.20.30.40: " .. ip)
   end
 end

end

 

drweb.regexモジュールの内容

1.機能

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

search(<template>, <text>[, <flags>]) - <text>文字列に<template>正規表現と一致するサブストリングが含まれている場合はtrueを返します。オプションの<flags>パラメータ(整数)は、関数の動作に影響を与える一連のフラグであり、論理和でつなげられます。

match(<template>, <text>[, <flags>]) - <template>正規表現がそのサブストリングだけでなく<text>ストリング全体と一致しなければならない点を除いてsearchと同じです。

2.利用可能なフラグ

ignore_caseはテキストの大文字と小文字を区別しません。

3.

local rx = require "drweb.regex"

rx.search("te.?t", "some TexT") -- false
rx.search("te.?t", "some TexT", rx.ignore_case) -- true

rx.match("some.+", "some TexT") -- true

 

drweb.subprocessモジュールの内容

1.機能

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

run(<parameters >)は指定されたプロセス(アプリケーション)を同期モードで実行します(この関数はプロセスが終了した後にのみコントロールを戻します)。<parameters>引数は、ファイルの実行パス、起動時にアプリケーションに渡されるすべての引数(配列argv)、アプリケーションの入出力ストリーム(stdinstdoutstderr)に関連付けられたオプションのパラメータを含むテーブルです。オプションのパラメータは、アプリケーションの(現在の)作業ディレクトリと環境変数を指定します。

関数の結果は、終了後のプロセス操作の結果(プロセスが終了した終了コードまたはシグナル番号)を含むテーブルになります。さらに、プロセス実行パラメータのテーブルで指定すると、返されるテーブルに、stdoutおよびstderr出力ストリームから読み込まれるデータを含むフィールドを含めることができます。

2.テーブル

入力実行パラメータのテーブル

フィールド

説明

データタイプ

(名前なし)

ファイルパスとアプリケーション実行引数(配列argv)。

必須フィールド。フィールドはコマンドライン引数の数だけ繰り返され、最初の値はargv[0]、つまり実行パスに対応します。

文字列

stdin

実行後にアプリケーション(プロセス)が入力ストリーム(stdin)から受け取るテキスト。オプションのフィールド(指定しない場合、stdinは何も受け取りません)。

文字列

stdout

返されるテーブルのフィールドの名前。このフィールドは、プロセスがstdoutストリームに出力するテキストを受け取ります。オプションのフィールド(指定しない場合、出力はstdoutに保存されません)。

文字列

stderr

返されるテーブルのフィールドの名前。このフィールドは、プロセスがstderrストリームに出力するテキストを受け取ります。オプションのフィールド(指定しない場合、出力はstderrに保存されません)。

文字列

env

プロセス環境に送信される環境変数をフィールドに持つテーブル。環境変数は、"<variable name>"="<value>"のペアで指定されます。オプションのフィールド(指定しない場合、環境変数は設定されません)。

テーブル

workdir

実行中のプロセスの作業(現在の)ディレクトリ。オプションのフィールド(指定しない場合、作業ディレクトリは設定されません)。

文字列

実行結果のテーブル(run関数の戻り値)

フィールド

説明

データタイプ

exit_status

プロセスが正常に終了したときの返りコード。発生していない場合は、nilになります。

番号

exit_signal

プロセスが終了したときのシグナル番号。発生していない場合は、nilになります。

番号

(入力パラメータテーブルのstdoutフィールドの値)

終了したプロセスのstdoutストリームから読み込まれたデータ。フィールドは、入力パラメータのテーブルでstdoutフィールドが指定されている場合にのみ使用可能です。

文字列

(入力パラメータテーブルのstderrフィールドの値)

終了したプロセスのstderrストリームから読み込まれたデータ。フィールドは、入力パラメータのテーブルでstderrフィールドが指定されている場合にのみ使用可能です。

文字列

3.

catユーティリティを引数なしで実行し、'some data'テキストをその入力ストリームに渡し、コマンド出力の結果を、返されるテーブルのstdout_fieldフィールドに渡す。

local sp = require 'drweb.subprocess'

local cat_result = sp.run({
   '/bin/cat',
   stdin = 'some data',
   stdout = 'stdout_field',
})

cat_result変数に格納される結果のテーブルには、以下のフィールドが含まれます。

フィールド

Valueexit_status

exit_status

0

exit_signal

nil

stdout_field

'some data'

env | grep TESTVAR 1>&2のパラメータを指定してshコマンド(コマンドインタプリタ)を実行し、VALUE値を持つTESTVAR変数を環境に追加し、コマンドstderrの出力結果を、返されるテーブルのstderr_fieldフィールドに渡す。

local sp = require 'drweb.subprocess'

local env_result = sp.run({
   '/bin/sh', '-c', 'env | grep TESTVAR 1>&2',
   env = { TESTVAR = 'VALUE' },
   stderr = 'stderr_field'
})

env_result変数に格納される結果のテーブルには、以下のフィールドが含まれます。

フィールド

Valueexit_status

exit_status

0

exit_signal

nil

stderr_field

'TESTVAR=VALUE\n'

pwdコマンドを実行し、作業ディレクトリをシステムのルートディレクトリに設定し、コマンドstdoutの出力結果を、返されるテーブルのstdout_fieldフィールドに渡す。

local sp = require 'drweb.subprocess'

local pwd_result = sp.run{
   '/bin/pwd',
   workdir = '/',
   stdout = 'stdout_field'
}

pwd_result変数に格納される結果のテーブルには、以下のフィールドが含まれます。

フィールド

Valueexit_status

exit_status

0

exit_signal

nil

stdout_field

'/\n'

killコマンドをbashで実行し、SIGKILL信号をインタプリタに渡す。

local sp = require 'drweb.subprocess'

local kill_result = sp.run{'/bin/bash', '-c', 'kill -9 $$'}

kill_result変数に格納される結果のテーブルには、以下のフィールドが含まれます。

フィールド

Valueexit_status

exit_status

nil

exit_signal

9

プロセスを非同期的に実行するには、async関数呼び出し内でrun関数を実行します(上記を参照)。

drweb.configモジュールの内容

1.機能

このモジュールには関数はありません。

2.利用可能なテーブル

このモジュールでは、次のフィールドでMailDConfigテーブルを提供します。

フィールド

説明

データタイプ

version

Dr.Web MailDのバージョン

文字列

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

MailDConfigテーブルは、モジュールによってmaildフィールドとして提供されます。

3.

Dr.Web MailDコンポーネントの現在のバージョンをログに出力する。

local dw  = require 'drweb'
local cfg = require 'drweb.config'

-- "Main" function
function milter_hook(ctx)

 -- Output of a string at the NOTICE level to the Dr.Web for UNIX Mail Servers log
 dw.notice(cfg.maild.version)

end

 

drweb.storeモジュールの内容

1.機能

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

exists<name><key>)は、選択したリポジトリに指定したキーを持つエントリがあるかどうかをチェックします。2つの引数、すなわちリポジトリの名前である<name>(文字列)と、エントリのキーである<key>(文字列)を取ります。エントリがあればtrueを返し、なければfalseを返します。

get<name><key>)は、選択したストレージから、指定したキーを持つエントリの値を取得します。2つの引数、すなわちリポジトリの名前である<name>(文字列)と、エントリのキーである<key>(文字列)を取ります。valueパラメータとctimeパラメータのペアを返します。エントリがない場合はnilを返します。value parameter(文字列)は、指定されたキーを持つエントリの値で、ctime(整数)はレコードの変更タイムスタンプです。

put<name><key><value>)は、指定したキーを持つエントリを選択したストレージに追加します。3つの引数、すなわちリポジトリの名前である<name>(文字列)、エントリのキーである<key>(文字列)、エントリの値である<value>(文字列)を取ります。

remove<name><key>)は、指定したキーを持つエントリを選択したストレージから削除します。2つの引数、すなわちリポジトリの名前である<name>(文字列)と、エントリのキーである<key>(文字列)を取ります。

count<name>)は、選択したストレージ内のレコード数を返します。1つの引数、すなわちリポジトリの名前である<name>(文字列)を取ります。整数を返します。

drop<name><ctime>)は、指定したタイムスタンプ以前に変更されたすべてのエントリを、選択されたストレージから削除します。2つの引数、すなわちリポジトリの名前である<name>(文字列)と、エントリ変更のタイムスタンプであるctime(整数)を取ります。

2.

アンチスパムスキャン:local store = require "drweb.store"のホワイトリストを作成する。

local store = require "drweb.store"

local antispam_whitelist = "antispam_whitelist"
local intra_domain_mask = ".*@test%.test$"

-- "Main" function
function milter_hook(ctx)

 -- Add all the outgoing mails recipients
 -- to the anti-spam white list
 if ctx.from:match(intra_domain_mask) then
   for _, to in ipairs(ctx.to) do
    store.put(antispam_whitelist, to, "")
   end
   return {action="accept"}
 end

 if not store.exists(antispam_whitelist, ctx.from) then
   if ctx.message.spam.score > 300 then
    return {action="reject"}
   end
 end

 return {action="accept"}

end

ホワイトリストに一時的に追加する。

local store = require "drweb.store"

local antispam_whitelist = "antispam_whitelist"
local antispam_whitelist_timeout = 604800 -- 1 week
local intra_domain_mask = ".*@test%.test$"

-- "Main" function
function milter_hook(ctx)

 -- Add all the outgoing mails recipients
 -- to the anti-spam white list
 if ctx.from:match(intra_domain_mask) then
   for _, to in ipairs(ctx.to) do
    store.put(antispam_whitelist, to, "")
   end
   return {action="accept"}
 end

 local _, ctime = store.get(antispam_whitelist, ctx.from)
 -- Is on the list and was added within a week
 local in_whitelist = ctime and os.time() + ctime < antispam_whitelist_timeout

 if not in_whitelist and ctime then
   store.remove(antispam_whitelist, ctx.from)
 end

 -- You can also update a non-expired entry:
 -- if in_whitelist then
 --  store.put(antispam_whitelist, ctx.from, "")
 -- end

 if not in_whitelist then
   if ctx.message.spam.score > 300 then
    return {action="reject"}
   end
 end

 return {action="accept"}

end