greylist でのスパム対策

シェアする

今回は、ちょっと方針を変えてメールに対するセキュリティに対する強化を考えてみます。オープンリレーとか当たり前の事は無しにして、ちょっと昔に流行った(?)greylist を実装してみたいと思います。

greylistとは、ブラックリストでもホワイトリストでもなく、再送してくるメールサーバは正しく稼働しているサーバであると考えられるので、指定時間以上経過した場合に再送してくるメールを受け付けます。といった事となります。

正直、不可解な部分もありますが、参考としてください。

インストール

以下パッケージをインストールします。(2018年4月現在)

  • libspf2-1.2.10-5.20150405gitd57d79fd.el7.x86_64
  • sendmail-milter-8.14.7-5.el7.x86_64
  • milter-greylist-4.5.16-3.el7.x86_64

設定ファイル(/etc/mail/greylist.conf)

設定ファイルの抜粋が以下です。

socket "/run/milter-greylist/milter-greylist.sock"
dumpfile "/var/lib/milter-greylist/db/greylist.db" 600
geoipdb "/usr/share/GeoIP/GeoIP.dat"
dumpfreq 1
user "grmilter"
quiet
list "my network" addr { 127.0.0.1/8 10.0.0.0/8 }
list "broken mta" addr {   \
        12.5.136.141/32    \ # Southwest Airlines (unique sender)
        12.5.136.142/32    \ # Southwest Airlines
        12.5.136.143/32    \ # Southwest Airlines
        12.5.136.144/32    \ # Southwest Airlines
        :
        (中略)
        :
        209.132.176.174/32 \ # sourceware.org mailing lists (unique sender)
        209.85.128.0/17    \ # Google
        211.29.132.0/24    \ # optusnet.com.au (wierd retry pattern)
        213.136.52.31/32   \ # Mysql.com (unique sender)
        216.33.244.0/24    \ # Ebay
        216.239.32.0/19    \ # Google
        217.158.50.178/32  \ # AXKit mailing list (unique sender)
}
racl whitelist list "my network"
racl whitelist auth /.*/
racl continue from /.*/ addheader "X-Greylist-status: IP:'%i' HOST:'%d' HELO:'%h' FROM:'%f'"
racl whitelist geoip "JP"
racl whitelist spf
racl whitelist list "broken mta"
racl greylist default delay 1m
report delays

設定の説明

socket “/run/milter-greylist/milter-greylist.sock”  sendmailから、milterで接続するため、そのsocketファイルの保存場所です。
dumpfile “/var/lib/milter-greylist/db/greylist.db” 600  greylistのdumpファイルの保存先です。最後の600は、パーミッションです。このdumpファイルに誰が誰にいつ送信した情報が格納され、この情報をもとにgreylistは動作します。
dumpfreq 1  dumpファイルへ出力する頻度です。たぶん、1秒でしょう。
user “grmilter”  milter-greylistが動作するユーザです。デフォルト値
quiet  接続してきたユーザにどれくらいの待ちがあるのかを伝えません。
起動オプションの -q と同じ意味をします。
 list “my network” addr { 127.0.0.1/8 10.0.0.0/8 }   aclにて利用するためのリストです。 
リスト名: my network
 list “broken mta” addr { xxx.xxx.xxx.xxx }  aclにて利用するためのリストです。 
リスト名: broken mta
このリストはデフォルトで定義されていて、各有名処のサービスのセグメントが登録されています。
racl whitelist list “my network”
racl whitelist auth /.*/
racl whitelist geoip “JP”
racl whitelist spf
racl whitelist list “broken mta”
racl greylist default delay 1m
 ACLの定義です。
racl whitelist list “my network”: My netwrokのソースIPは許可
racl whitelist auth /.*/: SMTP Authの認証されたのは許可
racl whitelist geoip “JP”: GEOIPでJPと判定されるものは許可
racl whitelist spf: SPFでPassと判定されるものは許可
※spf の後にpass, softfail, fail, neutral, unknown, error, noneを記載すると、詳細に定義が可能
racl whitelist list “broken mta”: broken mta のソースIPは許可
racl greylist default delay 1m: 上記以外、greylist判定。遅延は1分
となります。
racl continue from /.*/ addheader “X-Greylist-status: IP:’%i’ HOST:’%d’ HELO:’%h’ FROM:’%f'”  メールヘッダへの追加
 report delays  レポートとしてヘッダに記載する。条件は遅延判定となる場合。

raclにてACLが定義されているが、上から順番に適用され、合致するアクションが動作します。アクションは以下の3つです。

  • whitelist → 許可
  • blacklist → 拒否
  • greylist → グレイリスト
  • continue → acl処理継続

milter-greylistは、いろいろな判定機能を持っています。

判定機能

addr  CIDRでのIPアドレス判定
例:racl whitelist addr 192.168.3.0/24
domain  送信元サーバのドメイン部による判定
例:racl whitelist domain example.net
from  送信者(EnvFROM,sender)による判定
例:racl whitelist from postmaster@example.com
rcpt  宛先(EnvRcpt)による判定
例:racl greylist rcpt John.Doe@example.net
rcptcount  宛先数による判定
例:racl blacklist rcptcount >= 25
helo  HELO文字列による判定
sm_macro  sendmailのmacroにて渡される情報にて判定
time  時間による判定
例:racl whitelist time “* 8-16 * * 1-5”
geoip  接続元IPの国コードによる判定
例:racl whitelist geoip “JP”
auth  SMTP認証行為による判定
例:racl whitelist auth /.*/
tls STARTTLS による判定
spf  SPFによる送信ドメイン認証による判定。SPF判定の結果の pass, softfail, fail, neutral, unknown, error, none によるアクションを定義可能。未記載の場合は、pass のみ許可
例: racl whitelist spf “pass”
ldapcheck LDAPを検索し、その結果による判定
urlcheck URLを検査し、その結果による判定
dnsrbl DNSRBLによる判定

と、様々な判定ができます。
また、ratelimit機能(レートコントロール機能)を有しており、特定時間以内に、宛先10回に送信するとグレイリスト化するとか。

ratelimit "internalclients" rcpt 10 / 10m key "%r%i"
racl greylist ratelimit "internalclients" delay 5m msg "you speak too much. please later ..."

こんな感じに10分あたりに、”宛先接続元IPアドレス” の同じ値が10回続くとグレイリストに登録し、5分後であれば受け付ける。(5分間は受け付けませんかな)

%r: 宛先アドレス
%i: 接続元IP

とした場合、実際に接続すると以下のようなログが出力されます。

Apr  4 01:13:28 mailsv mail.info: milter-greylist: w33GCrYb004097: skipping greylist because address 127.0.0.1 is whitelisted, (from=<>, rcpt=sabao@hogehoge.com, addr=localhost[127.0.0.1]) ACL 129
Apr  4 01:13:28 mailsv mail.info: sendmail[4097]: w33GCrYb004097: from=<>, size=52, class=0, nrcpts=1, msgid=<201804031613.w33GCrYb004097@mailsv.hogehoge.com>, proto=SMTP, daemon=MTA, relay=localhost [127.0.0.1]
Apr  4 01:13:28 mailsv mail.info: sendmail[4137]: w33GCrYb004097: to=sabao@hogehoge.com, delay=00:00:00, xdelay=00:00:00, mailer=lmtp, pri=120052, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent
Apr  4 01:13:29 mailsv mail.warning: milter-greylist: ratelimit overflow for class internalclients: 11, limit is 10 recipients / 600 sec, key = "sabao@hogehoge.com127.0.0.1"
Apr  4 01:13:29 mailsv mail.info: milter-greylist: w33GCrYd004097: addr localhost[127.0.0.1] from <> to sabao@hogehoge.com delayed for 00:05:00 (ACL 128)
Apr  4 01:13:29 mailsv mail.info: sendmail[4097]: w33GCrYd004097: Milter: to=sabao@hogehoge.com, reject=451 4.7.1 you speak too much. please later ...
Apr  4 01:13:29 mailsv mail.info: sendmail[4097]: w33GCrYd004097: from=<>, size=0, class=0, nrcpts=0, proto=SMTP, daemon=MTA, relay=localhost [127.0.0.1]

実際に、greylistのデータベースには以下が登録されています。

# strings greylist.db
# milter-greylist databases, dumped by milter-greylist-4.5.16 on 2018-04-04 01:13:29.
# DO NOT EDIT while milter-greylist is running, changes will be overwritten.
# stored tuples
# Sender IP     Sender e-mail   Recipient e-mail        Time accepted   Unsuccessful shortest tarpit
127.0.0.1       <>      sabao@hogehoge.com     1522772309 # 2018-04-04 01:18:29
# Summary: 1 records, 1 greylisted, 0 whitelisted, 0 tarpitted

ってなると、「2018-04-04 01:18:29」になったら、受信できます。

また、スパムアサシンと連携しスパムと判定されるなら、どうするとか、処理もさせることもできます。(詳細は、man greylist.conf を)

設定が終わりましたら、systemctlコマンドにて起動しておいてください。

sendmail の設定変更(milter接続するための設定)

追加する設定は以下の通り。

INPUT_MAIL_FILTER(`greylist', `S=local:/run/milter-greylist/milter-greylist.sock')dnl
define(`confMILTER_MACROS_CONNECT', confMILTER_MACROS_CONNECT`, {daemon_port}')dnl

設定の説明

INPUT_MAIL_FILTER(`greylist’, `S=local:/run/milter-greylist/milter-greylist.sock’)dnl  milterでソケット渡しやinet渡しを利用する際に定義。S=にて渡すソケットを指定。ソケットファイルは、milter-greylistのコンフィグファイルと一致させる。
define(`confMILTER_MACROS_CONNECT’, confMILTER_MACROS_CONNECT`, {daemon_port}’)dnl  milter-greylistを実行すると、sendmailからのmacro情報が足りないとエラー(※1)が出るための対策。特に不要な情報だがエラー制御に定義
※1 以下のエラーが出ます。
Apr 3 21:52:59 mailsv mail.warning: milter-greylist: smfi_getsymval failed for {daemon_port}, using default smtp port

終われば、sendmail.cfを作成し、sendmailを再起動するとmiter-greylistが連携され、スパムに対する対策が動作します。

こんな感じに、簡単に以外と使えるツールだと私は思っています。送信ドメイン認証・GeoIPによる国判定、greylistにて70%くらいはスパム対策ができるのではと思います。

ではでは。

トップへ戻る