このセクションの内容
•概要
•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設定でMilterHook、SpamdHook、RspamdHook、またはSmtphookパラメータの値としてそれぞれ指定したLuaスクリプトを使用して解析されます。これらのパラメータの値はスクリプトの全文またはスクリプトへのパスとして指定できます。
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
|
ヘッダーの新しい値(ヘッダーを削除する場合、値は空の文字列"")
|
文字列
|
無効になったメタメソッド:なし
|
テーブルMilterGenerator
このテーブルには、X-AntivirusおよびX-Authentication-Resultsの標準ヘッダーを生成するための二次的な方法が含まれます。
フィールド
|
説明
|
データタイプ
|
х_antivirus_header_field
|
この関数は、メッセージのスキャンに関与したアンチウイルスコンポーネントに関する情報を含むX-Antivirusヘッダーを生成するために使用され、HeaderFieldテーブルまたはnil(メッセージがまだスキャンされていない場合)を返します。
HeaderFieldのnameフィールドは固定値(X-Antivirus)です。
|
機能
|
authentication_results_header_field
|
この関数は、DKIMおよびSPFチェックの結果に関する情報を含むAuthentication-Resultsヘッダーを生成するために使用されます。オプションの引数として、生成されるヘッダー内のサーバーのIDであるauthserv_id文字列を取ります。authserv_idの値はデフォルトで、Dr.Web MailDが実行されているホストの名前と一致します。
この関数はHeaderFieldテーブルを返します。
HeaderFieldのnameフィールドは固定値(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テーブルのthreats、urls、attachments、files、parts、leaf_parts、text_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テーブルのthreats、urls、attachments、files、parts、leaf_parts、text_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テーブルのthreats、urls、attachments、files、parts、leaf_parts、text_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
|
SMTPモードでは、新しいヘッダーの追加やヘッダーの変更、メール受信者の追加または削除、メール本文の変更など、メールの変更を行えます。また、SMTPモードはDr.Web vxCube Webサービスとの統合をサポートしているので、メール添付ファイルの解析も行えます。Dr.Web vxCubeから受け取った判定結果は、メールに適用するアクションの決定に使用できます。
例
以下のスクリプトは、すべてのメールメッセージについて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 - この関数は、HeaderFieldValue(decodedフィールドの値)と別の文字列を連結します。 |
テーブル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オブジェクトなど)
|
ScanReportテーブルの配列
|
無効になったメタメソッド:なし
|
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チェックの結果
|
テーブルSPFResult
|
from
|
MAIL FROMチェックの結果
|
テーブルSPFResult
|
check()
|
補助関数。最初にMAIL FROMチェックを実行し、(判定が受信されなかった場合は)次にHELOチェックを実行します。この関数は文字列としてチェックの結果を返します。これは、SPFResult***テーブルのstatusフィールドの値と同じ値になる場合があります。
この関数は、生成されたAuthentication-Resultsヘッダーを介して結果をOpenDMARCに送信するように設計されています。
|
機能
|
無効になったメタメソッド:なし
|
テーブルSPFResult
SPFのチェック結果を含むテーブル。
フィールド
|
説明
|
データタイプ
|
status
|
文字列として表されるチェックの結果。none、neutral、pass、fail、softfail、temperror、permerrorのいずれかの値を取ることができます(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とやり取りするために、次の特定のモジュールをインポートできます。
モジュール名
|
機能
|
drweb
|
Luaプログラムを起動したDr.Web for UNIX Mail ServersコンポーネントとLuaプロシージャの非同期実行の手段のログに、Luaプログラムからのメッセージを記録する機能を提供します。
|
drweb.lookup
|
Dr.Web LookupDモジュールを呼び出して、外部ソースからデータを要求するためのツールを提供します。
|
drweb.dnsxl
|
ホストのアドレスがDNSxLブラックリストにあるかどうかを確認するためのツールを提供します。
|
drweb.regex
|
文字列と正規表現を一致させるためのインターフェースを提供します。
|
drweb.subprocess
|
外部アプリケーション(プロセス)を実行するためのインターフェースを提供します。
|
drweb.config
|
Dr.Web MailD設定パラメータ値を持つテーブルを提供します。
|
drweb.store
|
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)、アプリケーションの入出力ストリーム(stdin、stdout、stderr)に関連付けられたオプションのパラメータを含むテーブルです。オプションのパラメータは、アプリケーションの(現在の)作業ディレクトリと環境変数を指定します。
関数の結果は、終了後のプロセス操作の結果(プロセスが終了した終了コードまたはシグナル番号)を含むテーブルになります。さらに、プロセス実行パラメータのテーブルで指定すると、返されるテーブルに、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
|
|