[Rules]セクションでは、メッセージ処理に関するルールが定義されています。ルールによって、ユーザの必要に応じてDr.Web MailD動作のパラメータを柔軟に変更することが出来ます。特定のエレメントのセットを持つメッセージに対するプログラムの動作を指定し、それらに応じてメッセージ処理の手順を変更することが出来ます。そのようなエレメントには送信者および受信者のアドレス、検出された悪意のあるオブジェクト、その他追加的な特徴(送信者のIPアドレスやメッセージのサイズなど)があります。ルールは指定された順番に適用されます。
ルールはそれぞれ2つのパートから成っています。
CONDITION stop|cont [SETTINGS]
CONDITIONは、SETTINGSパートi内で指定されたアプリケーションの設定を有効にするためにtrueである必要があります。ルール内でSETTINGSが指定されていない場合、CONDITIONを使用して外部ソース(ldap、mysql)からSETTINGSをダウンロードすることも可能です。
正規表現はそれぞれ2つのパートから成っています。
[prefix_name:][value]
prefix_nameはパラメータ名で、value はパラメータ値です。
以下のパラメータ名を使用することが出来ます。
• | any - 送信者または受信者。パラメータ値 - lookup。 |
• | from (sender) - 送信者。パラメータ値 - lookup。 |
• | to ( rcpt) - 受信者。パラメータ値 - lookup。 |
• | block - オブジェクト(ウイルスまたはその他悪意のあるオブジェクト)をブロック。パラメータ値 - lookup。 |
• | client-ip - 送信者のIPアドレス(Receiverコンポーネントが送信者のIPアドレスに関する情報を促すように調整されている場合)。パラメータ値 - 保護するネットワークのリスト。 |
• | client-port - 送信者のポート番号(Receiverコンポーネントが送信者のポート番号に関する情報を促すように調整されている場合)。パラメータ値 - ポート番号。 |
• | server-unix-socket - 接続を受け取るためのUNIXソケットへの絶対パス(Receiverコンポーネントがソケットアドレスに関する情報を促すように調整されている場合)。パラメータ値 - UNIXソケットへのパス。 |
• | server-ip - メールを受け取るためにReceiverが使用するインターフェースのIPアドレス(ReceiverコンポーネントがインターフェースIPアドレスに関する情報を促すように調整されている場合)。パラメータ値 - 保護するネットワークのリスト。 |
• | server-port - 接続を受け取るためのサーバのポート番号(Receiverコンポーネントがサーバポート番号に関する情報を促すように調整されている場合)。パラメータ値 - ポート番号。 |
• | id - 特定のメールを受け取るReceiverのユニークなID(ReceiverコンポーネントがIDに関する情報を促すように調整されている場合)。パラメータ値 - ReceiverIDを含んだストリング。 |
• | auth - 送信者の認証成功に関する情報(Receiverコンポーネントが送信者認証に関する情報を促すように調整されている場合)。パラメータ値 - 指定されていません。 |
• | size - メッセージのサイズ。サイズの値の前に比較記号{!= | == | < | > | <= | >=}を指定することが出来ます。比較記号が指定されていない場合、デフォルトで≤(小さいか等しい)が使用されます。いくつかのサービスキャラクタ("!" と "=")は比較記号シンタックス内で使用されるので、比較記号を使用する場合は該当する値を引用符で囲んでください。 |
例:
"size:>=10m" cont scan=no
10 MBよりも大きなメッセージは全てスキャンの対象から除外されます。この場合、引用符の使用は必須です。
• | md-client - ルールからその設定を受け取るクライアントのユニークなIDです。起動前に、Dr.Web MailDは全てのアクティブなクライアントに対する設定をルール内から探します。 |
例:
"md-client:client1"
メッセージがclient1クライアントに対して受信される場合、このコンディションはtrueになります。
• | score - メッセージスコアです。スコア値の前に比較記号{!= | == | < | > | <= | >=}を指定することが出来ます。比較記号が指定されていない場合、比較記号≤のデフォルトグループが使用されます。いくつかのサービスキャラクタ("!" と "=")は比較記号シンタックス内で使用されるので、比較記号を使用する場合は該当する値を引用符で囲んでください。 |
パラメータ名が指定されていない場合、デフォルトでanyが使用されます。パラメータ値に空白、または "|&)(!="記号が含まれている場合は引用符で囲まれている必要があります。引用符内で個別の引用符号(""")を指定する場合はバックスラッシュ("\")を前に置いてください。
また[prefix_name:][value]の代わりに、それぞれ常に正の値、負の値を持つ特別なキーワードtrueとfalseが使われる場合もあります。
例:
true cont some_settings
この設定は常に適用されます(このルールが検査の間に処理された場合)。
別々のコンディションは括弧や論理演算子AND (&&)、OR (||)、NOT (!)によって結合することが出来ます(括弧内で代わりのシンタックスが指定されます)。
例:
sender:test && "size:>=10k"
このCONDITIONは、メッセージの送信者が "test"でメッセージサイズが10キロバイトよりも大きい場合にtrueになります。
!("rcpt:ldap:///??sub?(mail=$s)" OR auth:)
このCONDITIONは、ldapの"mail"フィールド内に少なくとも1人の受信者が見つからず、送信者が認証されていない場合にtrueになります。
メッセージがプラグインによって処理される場合、プラグインはDr.Web MailDに特定のパラメータ値を要求することが出来ます。この場合Dr.Web MailDはルール内で指定されたコンディションに従ってメッセージを検査します。以下のアルゴリズムが使用されます。
1. | まず、データベース内に受信者が存在するかどうかチェックされます。存在した場合、データベース内に保存されている設定内で、この受信者および受信者の全てのグループに対するパラメータ値の検索が実行されます。 |
2. | データベース内に一致するものが見つからなかった場合、パラメータ値の検索は設定ファイル内で指定されたルール内で実行されます。ルールは指定された順番で上から下へ検査されます。まずCONDITIONが検査され、一致した場合、ルールのSETTINGSパート内で該当するパラメータ値が検索されます。 |
3. | 必要なパラメータ値が見つからず、CONDITIONの後に"stop"が続いている場合、検索はDr.Web MailDのデフォルトパラメータ値のあるセクション内で実行されます。必要なパラメータ値が見つからず、CONDITIONの後に"cont"が続いている場合、他のコンディションに従って更なる検査が実行されます。 |

|
必要なパラメータ値と一致するものが他のコンディション内に無いと分かっている場合、Stop によって検索する時間を削減することが出来ます。
|
例:
rcpt (sender, any): [address or regular expression] stop|cont [settings]
このルールによって、特定のユーザに対する設定をいくつか指定することが出来ます。
SETTINGS は、特定の値を持ったDr.Web MailDパラメータのセットです。
[plug-in_name/]param1 = value1, [plug-in_name/]param2 = value2 ...
paramNはパラメータ名で、valueNはパラメータ値です。パラメータがプラグインによって使用される場合、スラッシュを挟んでパラメータ名の前にプラグイン名を指定する必要があります。
SETTINGSは特定のパラメータ値が必要な場合のみ処理されます。そのためパラメータ値内のエラーは、プログラムが起動され使用された場合にのみ検出されることがあります。起動前にエラーを検出するにはcheck-onlyモード(コマンドラインパラメータ--check-onlyで)を使用します。パラメータ値がデータベースに保存される際にその有効性が即座に検査され、無効なパラメータを持つルールはブロックされます。
例:
sender:a@drweb.com cont headersfilter/Action = pass, vaderetro/max_size = 100k
この場合、送信者a@drweb.comに対して、headersfilterプラグインにAction = passが指定され、vaderetroプラグインのメッセージサイズの上限(max_size)が100キロバイトに設定されています。
valueN内でカンマを使用する場合、その前にバックスラッシュ"\"を指定する必要があります。
例:
to:a@drweb.com cont drweb/ProcessingErrors = pass\, redirect(err@drweb.com)
この場合、pass, redirect(err@drweb.com)値を引用符内に置くことは出来ません。パーサがストリングのその部分をそれぞれ1つの値に分けてサブストリングの解析を行わず、ProcessingErrorsにしてしまうからです。
SETTINGSセクション内のパラメータを指定しない場合、それらはCONDITIONセクション内のlookupコマンドでサーバから直接要求されます。LDAPを使用している場合に便利です。
to:regex:.*@drweb.com && "ldap:///-drwebRules-sub-(mail=$s)" cont
この例では、メッセージ受信者のドメインがdrweb.comで、送信者または全ての受信者がldapのコンディション"mail=$s"に従っている場合、drwebRulesフィールドのパラメータが使用されます。パラメータは新しいメッセージごとにアップロードされ、キャッシュに保存されます。これにより、ユーザはサーバを再起動させることなく設定を変更することが出来ます。LDAPのルックアップは括弧があるので引用符で囲まれています。
ルールのストリングがラインよりも長くなる場合、ラインの終端にバックスラッシュ"\"を置いてルールを次のラインに続かせます。
ルールは常に上から下へ、左から右へ処理されます。そのため新しいパラメータは古いパラメータをブロックします。例えば、html=yes,html=noと指定した場合、最後の値(html=no)が設定されます。
このアルゴリズムは、いくつかの異なる動作をするものを除いてルール内のほとんど全てのパラメータに使用されます。ルールが処理されると、例外グループのパラメータの新しい値がそれぞれ前回見つかった値に加えられ、データベースおよび設定ファイル内の全てのルールで検索が続行されます。検索の最後に、見つかった全ての値が結合されます。
例外のパラメータには以下のものがあります。
• | RegexsForCheckedFilename (drweb プラグイン内) |
動作の違いは全て、パラメータの記述内で明示的に指定されます。
address-、user- 、domain-指定パラメータが全てデータベース内に保存される場合、それらは1つのライン内で指定するようにしてください。
例:
アドレス
|
ルール
|
test1@drweb.com
|
VadeRetro/SubjectPrefix = \"spam\",modifier/localrules=select message\,append_text "Some Text"
|
test2@drweb.com
|
headersfilter/MissingHeader = Date, headersfilter/MissingHeader =From, headersfilter/MissingHeader = To
|
これらのパラメータに対するstop指示は通常通り処理されます。この指示は検索を中止し、パラメータの累積値を返します。
例:
例えばODBC経由でデータベースをセットアップする場合、以下のようになります。
アドレス
|
ルール
|
test@drweb.com
|
modifier/LocalRules = select message\, append_text "Scanned 3333!
|
設定ファイル内に以下のルールも設定されます。
true cont modifier/LocalRules = select message\, append_text "Scanned 44444 - global rules!", modifier/LocalRules = quarantine
データベース内で、特定のユーザに対し以下のようなルールのセットが設定されます。
> email-info test@drweb.com
test@drweb.com A=1 S=1
name:
aliases: alias_test@drweb.com
groups: divine good evil
rules:
1: true cont modifier/LocalRules = select message\, append_text "Scanned!", modifier/LocalRules = quarantine
2: true cont modifier/LocalRules = select message\, append_text "Scanned 2222!"
3: "rcpt:odbc:select rules from maild where a='$s'" cont
custom:
Dr.Web Modifierプラグインが処理するtest@drweb.comへのメッセージに対しては、LocalRulesパラメータの以下の値が使用されます。
select message, append_text "Scanned!", quarantine, select message, append_text "Scanned 2222!", select message, append_text "Scanned 3333!", select message, append_text "Scanned 44444 - global rules!", quarantine
これらの値の特定の順番を考慮してください。まずデータベースから値が取られ、次に設定ファイルから取られます。
メッセージに対してさらに他の受信者が指定され、それらに対してデータベース内でmodifier/LocalRulesパラメータの他の値が指定されている(または全く指定されていない)場合、データベースからのそれらの値は全て無視され、以下のグローバル変数が適用されます。
select message, append_text "Scanned 44444 - global rules!", quarantine
ルールストリング内にエラーがあった場合(ルックアップの処理を除く全ての場合において)、それらはログファイルに出力され、ルール自体は無視されます。ルールの全てのパートが同時に処理されるわけではないということに注意してください。ルックアップ値およびいくつかの変数の値は使用される直前に処理されるため、それらの値内でのエラーは全てメールメッセージを処理する瞬間に出る可能性があります。起こりうる全てのエラーに対する設定をチェックするにはdrweb-maildコンポーネントを --check-onlyコマンドラインパラメータで動作させてください。
使用可能なパラメータの種類は以下のとおりです。
• | 他のモジュールの設定ファイル内で指定されたパラメータ |
• | クライアントによってのみ使用され、1つの必須コンディション-クライアントのユニークなID(md-client)でのみ指定されたパラメータ |
各パラメータがルール内で使用可能であるかどうかは他のモジュールの設定ファイル内で指定され、ドキュメンテーション内のパラメータ記述に記載される必要があります。
[rules] 内では以下のパラメータを設定することが出来ます。
html = {Yes | No}
|
Yesの場合、html書式で通知を作成するようDr.Web MailDに命令します。それ以外の場合はプレーンテキスト書式で作成されます。
|
デフォルト値:
html = Yes
|
quarantine = {Yes | No}
|
Yes の場合、メッセージを隔離に移動するよう命令します。
|
デフォルト値:
quarantine = Yes
|
scan = {list of plug-ins}
|
メッセージ検査にどのDr.Web MailDプラグインを使用するかを指定します。プラグイン名はコロンで区切られます。パラメータ値がAllに設定されている場合、全てのプラグインがメッセージを検査します。Noが設定されている場合、どのプラグインも使用されません。
プラグイン名を区切るにはコロン":"を使用します。リストからプラグインを除外するには、そのプラグインの前にマイナス記号"-"を指定します。"-"記号とプラグイン名の間には空白を入れません。"-"記号の無いプラグイン名はAll値の後には指定できません。
例:
scan = all – 全てのプラグインによって検査されます。
scan = no – どのプラグインも使用されません。
scan = all:-foo – foo以外の全てのプラグインによって検査されます。
scan = Foo:Bar – fooおよびbarプラグインによってのみ検査されます。
scan = all:foo – 間違ったパラメータフォーマットです。Allパラメータ値の後に"-"記号の無いプラグイン名を指定することは出来ません。
scan = -foo:all – 間違ったパラメータフォーマットです。Allパラメータ値はストリングの頭に設定する必要があります。
scan = -foo – 間違ったパラメータフォーマットです。Allパラメータ値が無い場合に"-"記号の付いたプラグイン名を指定することは出来ません。
|
デフォルト値:
scan = All
|
notify[.{notification type}] ={allow|block}[({address types})][condition]
|
通知メールの種別、送付先、生成の可否などを指定します。allowは生成を許可し、blockは禁止します。種別が指定されていない場合、このパラメータ値は全ての通知に適用されます。
使用可能な通知の種別はdrweb-notifierモジュールがサポートしているものに限ります。追加のプラグインはそれぞれが持つ種別を追加することが出来ます。デフォルトでは以下の通知の種別がサポートされています。
• | notify.Cured - メッセージ修復通知 |
• | notify.Skip - ファイル検査不可(スキップ)通知 |
• | notify.Archive - アーカイブ検査制限抵触通知 |
• | notify.Error - メッセージ検査中のエラー発生通知 |
• | notify.License - ライセンス制限抵触通知 |
• | notify.Malware - マルウェア検出通知 |
パラメータ値の後にqualifierを括弧で囲んで指定することが出来ます。これは、適用されるパラメータに対するアドレスの種類を指定します。コロンで区切って複数の種類を指定することが出来ます。使用可能なqualifierは以下のとおりです。
• | any (またはqualifier無し) - 全ての種類のアドレスへの通知 |
例:
Notify=block or notify=block (any) - 全ての通知メールを禁止
notify.Virus = block (sender:admin) - 送信者・管理者宛のウイルス検出通知メールを禁止
ある種別の通知に対するルールが見つからず、また一般ルールも見つからなかった場合(種別指定の無い)、該当する通知は無効とみなされます。
Notifyパラメータの複数の値は、Dr.Web Modifierプラグイン内のLocalRulesパラメータに使用されるものと同じルールに応じて結合されます。
例:
true cont notify.virus = allow(sender)
true cont notify.virus = allow(admin), notify = block
これらのルールは以下のルールと同じになります。
true cont notify.virus = allow(sender:admin), notify = block
ウイルスに関する通知のみが管理者および送信者宛に送られ、それ以外の通知は全てブロックされます。
|
デフォルト値:
デフォルトの通知パラメータは以下のとおりです。
• | notify.Virus = allow(any) |
• | notify.Cured = allow(admin:sender) |
• | notify.Skip = allow(sender) |
• | notify.Archive = allow(admin:sender) |
• | notify.Error = allow(admin:sender) |
• | notify.Rule = allow(admin) |
• | notify.License = allow(admin) |
• | notify.Malware = allow(any) |
|
plugin_name/max_size = {size}
|
それぞれのプラグインが検査するメッセージの最大サイズを指定します。
|
plugin_name/use = {Yes | No}
|
Yesの場合、プラグインにメッセージをスキャンする指示を出します。Noの場合、プラグインにメッセージ検査をスキップする指示を出します。
|
NotificationNamesMap = notify_name1 file_name1, notify_name2 file_name2 ...
|
それぞれのプラグインモジュールに対して、検査するメッセージの最大サイズを設定することが出来ます。
NotificationNamesMap = name1 file_name1, name2 file_name2 ...
レポート名を新しいものにマッピングすることが出来ます。例えば、エンベロープに応じて他のレポートを割り当てる際に使用することが可能です。
パラメータ
• | nameN - 新しいファイルが作成される通知の名前です。名前のリストはnotifyパラメータの記述内にあります。また、一般レポートに対してreport名を、DSNに対してdsnを指定することも出来ます。 |
• | file_nameN - 通知に対する新しいレポートファイル名です。ファイル名の頭にsender_、rcpts_、admin_、report_、dsn_のプレフィックスのいずれかを付け、ファイル拡張子を.msgに変更します。その結果、[Notifier]セクションのTemplatesBaseDirパラメータで指定されたディレクトリ内で検索されるファイルの名前はsender_file_nameN.msgになります。 |
例:
NotificationNamesMap = virus my-virus, archive my-arch
|
SenderAddress = {address1|address2|...}
|
メッセージを送信するためにSenderコンポーネントに渡されるアドレスの指定です。"|"記号で区切って複数のアドレスを指定することが出来ます。以下のようなルール内でSenderAddressパラメータを使用した場合、
"to:mysql:select * from adr" cont SenderAddress = address1|address2|address3
"to:mysql:select * from adr" の基準を満たしたメッセージが、リスト上にある使用可能な最初のアドレスに送信されます(例えばaddress1が使用可能でなかった場合、address2への送信が試行され、address2も使用出来なかった場合address3が使用されます)。
Senderがそのパラメータをサポートしている場合、メッセージを指定されたアドレスに直接送信します。現時点ではSenderAddressパラメータをサポートしているのはSMTP/LMTPメソッドを使用したdrweb-senderモジュールのみです。
|
rule = {section name}
|
よく使用するパラメータのグループを1つのUserパラメータセクション内にまとめることが出来ます。rule指示を用いることで追加パラメータを使用することが可能です。
各セクションはユニークな名前を持っている必要があります。それぞれのセクションは、初めて使用される前に指定されていなくてはなりません。Dr.Web MailDの現在のバージョンでは1つのルールに対して1つのruleパラメータのみサポートしています。
|
|
ユーザセクションヘッダの書式は以下のとおりです。
[Rule: name],
nameは、英数字および空白を含むユニークなセクション名です。各パラメータは一行ごとに記述します。ユーザセクションの終わりは次のセクションの始まりか、設定ファイルの終わりによって示すことが出来ます。
設定ファイルはuserパラメータの特別なセクション(デフォルトパラメータのセクション)を含んでいます。これにはdefaultという名前が付き、セクションのヘッダ内のRuleキーワードはスキップすることが出来ます。
|
|
全てのレポートをブロックし隔離への移動を無効にする、ユーザパラメータを持ったセクションの例です。
[Rule:MySection]
quarantine = no
notify = block
ユーザセクションのルール内でMySectionを使用した例です。
[Rules]
Rcpt:regex:example\.com cont rule=mysection
Sender:lol@foo.com && block:vir1 cont notify.Skip=allow, notify.Virus=allow, rule=MySection
|
|
これらのルールが実行されると、レポートはブロックされ、受信者がexample.comドメインに属するメッセージの隔離への移動が無効になります。メッセージがlol@foo.comから送信され、ブロックするオブジェクトvir1が見つかった場合、検出されたウイルスに関するレポートのみが送信されファイルの隔離への移動は無効になります。
|
メッセージ内に複数の受信者が存在する場合について考えてみましょう。以下のパラメータ、
plugin_name/max_size
NotifyLangs
AdminMail
html
scan
plugin_name/use
およびクライアントの設定に適用される第三の全てのパラメータは、それぞれの受信者に対して別々に処理されます。例えば、あるパラメータに対する2人の受信者に異なる値が指定されていた場合、適用可能な他の設定を持ったメッセージのコピーがそれぞれの受信者に対して作成されます。
他のパラメータについては、CONDITIONが全ての受信者に対して実行される場合にパラメータ値がこのルールから使用されます。それ以外の場合はデフォルト値が使用されます。
コマンドラインパラメータ経由でのdrweb-maildモジュール内のルールの有効性は、特別なインターフェース経由でチェックすることが出来ます。これらのパラメータを使用して、仮想メッセージの様々な属性を指定することが可能です。モジュールは、このメッセージに適用可能なルールの設定を全てコンソールに出力します。使用可能な属性は以下のとおりです。
• | -s [ --sender ] arg - メッセージ送信者(エンベロープから) |
• | -r [ --rcpt ] arg - メッセージ受信者(エンベロープから) |
• | -b [ --block ] arg - ブロックするオブジェクト(例:ウイルス名) |
• | --client-ip arg - 送信者のIPアドレス |
• | --server-ip arg - 受信者のサーバーのIPアドレス |
• | --client-port arg - 送信者のポート番号 |
• | --server-port arg - 受信者のサーバーのポート番号 |
• | --server-us arg - 受信者のサーバーのUNIXソケット |
• | --auth -メッセージを、 認証されたユーザから受信 |
• | --size arg - メッセージサイズ(この値は{size}の型を持っています) |
• | --md-client arg - クライアントのユニークなID |
例:
$ ./drweb-maild --auth
Thu May 29 16:03:44 2009 [3081324208] maild.rules DEBUG notify* :
Thu May 29 16:03:44 2009 [3081324208] maild.rules DEBUG all : block
Thu May 29 16:03:44 2009 [3081324208] maild.rules DEBUG archive : from=allow; admin=allow;
Thu May 29 16:03:44 2009 [3081324208] maild.rules DEBUG
Thu May 29 16:03:44 2009 [3081324208] maild.rules DEBUG cured : from=allow;
Thu May 29 16:03:44 2009 [3081324208] maild.rules DEBUG
Thu May 29 16:03:44 2009 [3081324208] maild.rules DEBUG error : from=allow; admin=allow;
Thu May 29 16:03:44 2009 [3081324208] maild.rules DEBUG
Thu May 29 16:03:44 2009 [3081324208] maild.rules DEBUG license : admin=allow;
Thu May 29 16:03:44 2009 [3081324208] maild.rules DEBUG
Thu May 29 16:03:44 2009 [3081324208] maild.rules DEBUG malware : from=allow; to=allow; admin=allow;
Thu May 29 16:03:44 2009 [3081324208] maild.rules DEBUG
Thu May 29 16:03:44 2009 [3081324208] maild.rules DEBUG rule : admin=allow;
Thu May 29 16:03:44 2009 [3081324208] maild.rules DEBUG
Thu May 29 16:03:44 2009 [3081324208] maild.rules DEBUG skip : from=allow;
Thu May 29 16:03:44 2009 [3081324208] maild.rules DEBUG
Thu May 29 16:03:44 2009 [3081324208] maild.rules DEBUG virus : from=allow; to=allow; admin=allow;
Thu May 29 16:03:44 2009 [3081324208] maild.rules DEBUG scan : all
Thu May 29 16:03:44 2009 [3081324208] maild.rules DEBUG html : 1
|