sendmail で milter-regex を使ってスパム対策
ご利用のブラウザは、JavaScript が無効 となっていませんか?
このサイトでは、コンテンツの一部が非表示 、あるいは、コメント、お問い合わせの投稿ができない 、検索ができない ことがあります。
以前の記事
評判のさくらのVPSでSMTP(Sendmail)を公開する時にやっておきたいこと では、SPFの送信側の対処
sendmail で smf-spf を使ってSPF認証する では、SPFの受信側の対処について記述しました。
SPFの対処は、スパム対策の一つです。
今回は、別のスパム対策としてSMTPのHELOコマンドを使って、HELOとともに送られてくる送信者情報(一般的には送信者のホスト名になります)の以下のチェックを行うことでスパムと判断し対策を行ってみます。
送信者のホスト名がドメインでない(ドットがない場合)名前を使っている場合
送信者のホスト名が(受信側のSMTPサーバーの)IPアドレスを詐称している場合
HELO コマンドは、
SMTPクライアントをSMTPサーバに認識させるためのコマンドで、以下のフォーマットで送信されます。
HELO FQDN(ホスト名)
FQDN : DNSに登録されているホスト名になります。
FQDNが無いクライアントの場合は、IPアドレスを指定することもあります。
このHELOコマンドは、メールを送信するための最初のご挨拶という感じで、私は・・・です。と名乗っているようなものです。
受け取ったSMTPサーバーは、クライアントが誰だか認識できたらメールを送っても良いよ・・・と返信します。
HELOコマンドは、クライアントのホスト情報を知らせます。そこで偽装していれば、それはスパムの可能性が大きいです。
仮にスパムでなくとも、ルール違反でもありますから、そのようなクライアントからメールを受け取る必要もない・・と判断することもできるでしょう。
案外、このHELOコマンドによるスパム確認方法は有効です。
しかし、これも万全ではありえません。
ただ、spamassassinのような本文やサブジェクト(タイトル)によってスパムを確率で判断するよりは、まだ、確実性はあると思います。
このスパム対策のためにsendmail のMILTER機能を使って、対策を行います。
ここでは、milter-regex を使ってsendmailでHELO によるSPAM対策を行ってみます。
sendmail で milter-regex を使ってSPAM対策する
HELOのチェックをするために、milter-regex をインストールし、sendmail でメール受信時にチェック作業を行うために
情報を渡すように設定する必要があります。
まずは、milter-regex をインストールからはじめて、HELOをチェックするまでの手順を以降に記述します。
milter-regex をインストールする
milter-regex の rpm は、通常のリポジトリにはありません。
milter-regex の rpm は、EPEL で公開されています。
そのため、まずは、EPEL のリポジトリをインストールするところから始めます。
EPEL のリポジトリを追加する
$ wget http:// dl. fedoraproject. org/ pub/ epel/ 5/ i386/ epel- release- 5- 4. noarch. rpm
$ rpm - Uvh epel- release- 5- 4. noarch. rpm
各バージョンとリポジトリファイルは、以下のとおりです。
5.x 32bit 版 : http://dl.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm
5.x 64bit 版 : http://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
6.x 32bit 版 : http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-5.noarch.rpm
6.x 64bit 版 : http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-5.noarch.rpm
Scientific Linuxも同じです。
EPEL リポジトリは、無効にしておく
EPEL リポジトリは、結構、最新版を取り込むには、有効なリポジトリです。ただ、何でもかんでも最新にしたくもないので、間違って意図しないものをインストールしてしまわないように、常に無効にしておきます。
使いたい時は、yum のパラメータに–enablerepo を指定して使うようにしておきます。
/etc/yum.repos.d/epel.repo
[epel]
name=Extra Packages for Enterprise Linux 5 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/5/$basearch
mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=epel-5&arch=$basearch
failovermethod=priority
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL
:
smf-spf をインストールする
$ yum - y -- enablerepo= epel install milter- regex
Loading mirror speeds from cached hostfile
* base: ftp.nara.wide.ad.jp
* extras: ftp.nara.wide.ad.jp
...
Complete!
$
milter-regex を利用するように sendmail.mc を編集する
milter-regex を sendmailで利用するためには、MILTER が組み込まれていないといけません。通常、CentOS , Scientific Linux で提供されている Sendmailは、既に組み込まれています。
sendmailに組み込まれているかどうか確認するためには、以下のようにコマンドで確認することができます。
$ sendmail - d0. 10
Version 8.13.8
Compiled with: DNSMAP HESIOD HES_GETMAILHOST LDAPMAP LOG MAP_REGEX
MATCHGECOS MILTER MIME7TO8 MIME8TO7 NAMED_BIND NETINET NETINET6
NETUNIX NEWDB NIS PIPELINING SASLv2 SCANF SOCKETMAP STARTTLS
TCPWRAPPERS USERDB USE_LDAP_INIT
...
上記のようにMILTER が含まれていればOKです。もし含まれていないようなら、再インストールするか、再構築してMILTERが組み込まれた状態にしましょう。
/etc/mail/sendmail.mc を以下のように追加します。
...
INPUT_MAIL_FILTER(`milter-regex',`S=unix:/var/spool/milter-regex/sock, T=S:30s;R:2m')
...
編集を終えたら、cfファイルを作成します。
$ m4 / etc/ mail/ sendmail. mc > / etc/ mail/ sendmail. cf
milter-regex を起動し、sendmail を再起動する
全ての設定を終えたら、milter-regex を起動し、sendmail を再起動します。
$ /etc/init.d/milter-regex start
milter-regex を起動中: [ OK ]
$ /etc/init.d/sendmail restart
sendmail を停止中: [ OK ]
sendmail を起動中: [ OK ]
$ chkconfig milter- regex on
最後にシステムの再起動があってもmilter-regex が自動で起動するようにchkconfig で設定しておきましょう。
milter-regex をカスタマイズする
milter-regex の設定には、
/etc/mail/milter-regex.conf
の編集を行います。
デフォルトでは、何も設定されていません。
ここでは、スパムの可能性が大きい2点を設定します。
ドメインでない(ドットがない場合)
サーバーのIPアドレスを詐称
1
2
3
4
5
6
7
8
9
10
reject "Malformed HELO (not a domain, no dot)"
helo /\./n
tempfail "Malformed HELO (can't be me)"
helo /^11\.22\.33\.44$/
5 – 6 行 : HELOで送られてきたホスト情報にドット(.)を含まない場合は、拒否します。
8 – 9 行 : HELOで送られてきたホスト情報が自IPアドレス(ここでは、例として 11.22.33.44 )の場合は、一時的に拒否します。
いずれも拒否されますが、この違いは、具体的にはSMTPのエラーコード 554 と 451 の違いになります。
これを簡単に説明すれば、
前者の場合、一般的にメールの送信側は、メールが送信できないと判断します。
後者の場合、一般的にメールは一時的に送信できないものと判断し、ある一定間隔の後、再送しようとします。
もしも、スパム送信の場合、いずれであっても、二度と同じメールを送信して来ないでしょう。しかし、スパム送信でない一般のメールサーバーからの送信なら、ある一定期間の後、再送してきます。その場合、再送として扱われるので、このチェックは外れます。
つまり、
reject は絶対に変なサーバーからメール送信されようとしている場合に使います。
tempfail は、ほぼ間違いなく変なサーバーからメール送信されようとしている場合に使います。仮に間違っていた場合、最悪は、数日後にメールは再送されて来るはずです。
正規表現のオプション
e
POSIX の拡張正規表現 こちらが、よく一般的な利用されている正規表現?だと思います。 メタ文字 “+”、”?”、”|” が使える方です。
i
大文字小文字の区別をしない。
n
マッチしない。
チェック設定項目
helo [name]
HELOコマンドで送られてきたクライアント情報が、name に指定された文字列(正規表現)に一致した場合、接続を拒否します。一般的に、クライアント情報は、ホスト名が提供されるはずです。
connect [name] [address]
送信者のホスト名とアドレスの両方が指定された正規表現に一致した場合、接続を拒否します。
数値アドレスには、IPv4ならドット(.)区切りで、IPv6ならコロン(:)16進数表記で設定できます。
ホスト名は、数値アドレスのDNSの逆引きの結果です。(sendmailのmilterプラグインが独立して実行した結果です。)
逆引きが失敗したときに、ホスト名は[]内に数値アドレスが含まれて出力されます。
動作設定項目
reject [message]
メール受信を拒否します。SMTP応答は3桁のコード554 を返信し、永続的なエラーであることを通知します。
これによって、メールの送信側は、メール送信を断念すべきです。具体的にはメールキューが外され、送信不可の処理を行います。
messageは、ロギング情報( /var/log/maillog )へreject が実施された時に出力されます。
tempfail [message]
メール受信を一時的に拒否します。SMTP応答は3桁のコード451 を返信し、一時的なエラーであることを通知します。
これによって、メールの送信側は、ある一定期間の後にメールを再送することができます。具体的にはメールキューに残され、一定期間の後、再送処理が実施されます。
messageは、ロギング情報( /var/log/maillog )へtempfail が実施された時に出力されます。
上記以外にもたくさんの設定可能な項目があります。
詳しくは、http://www.benzedrine.cx/milter-regex.html を参照してください。
telnet を使ってメール送信できないことを確認してみる
HELOコマンドによるスパムチェックなので、一般的なフリーメールなどからではテストできません。この場合、telnet で簡単に確認することができます。
2つのシェルを使って確認します。
シェル#1 は、telnet でHELOコマンドを発行して確認します。
シェル#2 は、常にメールログを確認できるようにしておきます。
シェル#1
$ telnet localhost 25
Trying 127.0.0.1...
Connected to mail.exmaple.com (127.0.0.1).
Escape character is '^]'.
220 mail.exmaple.com ESMTP Sendmail 8.13.8/8.13.8; Thu, 24 Nov 2011 16:53:08 +0900
HELO 11.22.33.44
250 mail.exmaple.com Hello mail.exmaple.com [127.0.0.1], pleased to meet you
quit
221 2.0.0 mail.exmaple.com closing connection
Connection closed by foreign host.
$
シェル#2
$ tail -f /var/log/maillog
:
Nov 24 16:53:27 mail sendmail[22609]: pAO7r8qo022609: Milter: helo=11.22.33.44 , reject =451 4.7.1 Malformed HELO (can't be me)
:
ログ情報に、ちゃんとメッセージが表示されればOKです。
どうでしょうか、HELOでふてぶてしくもサーバーのIPアドレスを名乗るスパマーを排除するやり方を、簡単に解説してみました。
milter-regex は、このHELOのチェックだけでなく接続するIPアドレス、ホスト名などもチェックできます。
ヘッダー情報、メール本文の情報もチェックできます。
まだまだ使えそうですね。 スパムに困っておられる方には、自前のフィルターを正規表現で作成できて、なかなか使い勝手が良いのでおすすめだと思います。
ご利用のブラウザは、広告ブロック(AdBlockなど) が適用 となっていませんか?
このサイトでは、コンテンツの一部が非表示 、あるいは、コメント、お問い合わせの投稿ができない 、検索ができない ことがあります。
関連記事 :
コメントを投稿 :