Internet Mail Security
〜詳細SPAM対策〜



(株)インターネットイニシアティブ
札幌支店インターネット技術部
深町 賢一



Copyright (C) 1999 Ken'ichi Fukamachi
All rights reserved.




(page 1)


Table of Contents









(page 2)





Mail System Overview


(page 3)


最近の話題

UBE(Unsolicited Bulk Email), SPAMメール



security 全般


(page 4)


UCE

SPAMという呼ばれ方が有名
量、無差別な興味範囲の問題

通信コストが異なっている

アドレスリスト/SPAMソフトの商売



(page 5)


不正中継

「数十秒のダイアルアップで数万通」など可能

e.g. バケツリレー等


ユーザ, ISP(のサーバ)双方にとって



(page 6)


DOS (Denial Of Service)

大量のメールを送りつけてサーバを使用不能に
いやがらせ
e.g. dialup => open relay => target
エラーの戻り先を偽造したメール
e.g. dialup => open relay => server =error=> target
sendmail 8.9.2 × => 8.9.3
意図せずにこの攻撃をしていること多し



(page 7)


Server Security







(page 8)


MTAを取り替える

postfix, qmail, exim, smail, zmailer, ...




(page 9)





UCE対策



(page 10)


フィルタリング: どこで?

リソース節約のためには望ましい
弾く加減が難しい
表現の自由

リソースとしては無駄
自分の好きなようにできる

RFC2476



(page 11)


フィルタリング: 何を?

自分で保守(は大変)
Realtime Black List: RBL, ORBS

Message-ID: <> (12%)
Subject: FREE (16%)
Subject: ADULT,adlt,adv (10%)
Subject: advertisement (4%)

備考: (N%)は僕に来たSPAMの例より集計



(page 12)


DNS based Black List

"the Mail Abuse Prevention System"
"Realtime Blackhole List"
http://maps.vix.com/rbl/

http://www.orbs.org/

一度消滅
1999年1月半ばに復活
#バンクーバー → 今はニュージーランド?



(page 13)


RBL mechanism


gethostbyname(1.1.168.192.rbl.maps.vix.com)



(page 14)


ブラックリストの問題点


狙えるホストのリストにもなる(本末転倒)




(page 15)


サーバでのフィルタリング

IPアドレスベース: ブラックリスト
e.g. 単純ならsendmail.cf
embedded perl :)
HELO必須
PICKY_HELO_CHECK(有効性は?, RFC1123 5.2.5)
MAIL FROM:
正引き != 逆引き(有効性は?)



(page 16)


sendmail.cf



例: @ を含まないMessage-IDははじく

[CF]
HDR_REJECT_BADMID=yes

[sendmail.cf]
HMessage-Id: $>CheckMessageId

SCheckMessageId
R<$+@$+> $@ OK
R$* $#error $: "553 Header error"



(page 17)


sendmail.cf with rbl

RBLを使ってメールを弾く
[CF]
USE_MAPS_RBL=yes

[sendmail.cf]
SCheck_reject
R$* $: $1 $| $&{client_addr}
R$* $| 0 $: $1 command line is OK
R$*$={SkipChkDom} $| $* $: $1 no checking
R$* $| $={SkipChkIP}$* $: $1 no checking
# deny with MAPS (Mail Abuse Protection System)
# RBL (Realtime Blackhole List)
R$* $| $-.$-.$-.$- $: $1 $| $2.$3.$4.$5 $|
$(host $5.$4.$3.$2.rbl.maps.vix.com. $: $)
R$* $| $* $| $+ $#error $@ 5.7.1 $: "550 Mail from " $2 "
refused, see http://maps.vix.com/rbl/"
R$* $| $* $: $1

注意: 本当は一行なところを折り返してあります



(page 18)


/etc/hosts.allow and RBL

daemonが直接25/tcpを聞いているのではなく、
inetd等経由でdaemonをfork()するようなソフト


tcp_wrapper [/etc/hosts.allow]

smtpd: ALL: spawn /usr/local/bin/rblcheck -q %a &&
exec /usr/local/bin/smtpd || /bin/echo
"469 Connection refused. See http://maps.vix.com/rbl/\r\b\r\n"





(page 19)


個人でのフィルタリング

(主に not on unix)


comp.answers の FILTERING MAIL FAQ
ftp://rtfm.mit.edu/pub/usenet/news.answers/mail/filtering-faq

応用としてRBLなどを呼ぶ

http://www.xnet.com/~emarshal/rblcheck/



(page 20)


Example: slocal, procmail

[slocal]
# anything from steve - destroy!
From steve destroy A -

[procmail]
:0
* ^Subject:.*ADULT
/dev/null



(page 21)


Example: procmail with rblcheck

:0
* ! ? if [ -n "$TCPREMOTEIP" ]; then rblcheck -q "$TCPREMOTEIP"; fi
{
EXITCODE=100
LOGABSTRACT=all
LOG="Filter: RBL-filtered address: \"$TCPREMOTEIP\"
"
:0:
$FILTER_FOLDER
}



(page 22)





UCE対策 II (Open Relay)


(page 23)


不正中継(1)



送り主が自ドメインと誤解される




(page 24)


ブラックリスト(1)

登録されると…


e.g. 1C, AS?



(page 25)


ブラックリスト(2)

同様な仕組みのUCE以外のリストを作る動き

MAPS Dial-up User List
http://maps.vix.com/dul/

リストは nanog 参照 http://www.nanog.org/
MAPSタイプのはまだらしい
1C, AS単位でblock?



(page 26)


不正中継対策(1)

例: @relay:foo@bar, foo%bar@relay, ! UUCP-Style

ブラックリスト
組織内にも制限を


e.g. mail header, log, ... ; see RFC2505



(page 27)


不正中継対策(2)

security全般についていえる
文化的背景
製造元依存(not on unix)


defaultで勝手に走ってるOSは駄目



(page 28)


MTA on UNIX

postfix, qmail, exim, smail, zmailer, ...
このPartではsendmailを例にするが…

e.g. smail (Debian?)

/etc/mailer.conf
/usr/libexec/{sendmail,postfix,zmailer,...}/sendmail



(page 29)


MTA on NON UNIX

製造元次第としかいえない…


割とそのままportingされてるのが便利
だけどよわよわ;-D
Sendmail Inc. になるので大丈夫?



(page 30)


sendmail overview (1)

ftp://www.sendmail.com/

ftp://www.sendmail.org/

http://www.jpcert.or.jp/tech/98-0001/



(page 31)


sendmail overview (2)

ftp://ftp.kyoto.wide.ad.jp/pub/mail/CF/
3.7以降は不正中継阻止がデフォールト

高速な配送エージェント(配送だけ)
現状はWIDEパッチが必要(8.10はOK?)
RFC2033: Local Mail Transfer Protocol
ftp://ftp.kyoto.wide.ad.jp/pub/mail/smtpfeed/



(page 32)


sendmail check_* rulesets

checkcompat(); C言語でhard-coded

/usr/src/usr.sbin/sendmail/src/srvrsmtp.c

ルールセット チェックする内容
------------------------------------
check_mail 発信者
check_rcpt 受信者
check_relay SMTPの接続要求
check_compat 発信者と受信者のペア



(page 33)


sendmail: 配送専用のサーバ(1)

[制限] 配送専用ならSMTP接続だけ
check_relayはSMTP接続が張られた時

check_relay => validate_connection() => libwrap.a

例: beth.fml.org からのSMTP 接続のみを許す

[/etc/hosts.allow]
sendmail: beth.fml.org

[/etc/hosts.deny]
ALL: ALL



(page 34)


sendmail: 配送専用のサーバ(2)

[CF]
MAIL_RELAY_RESTRICTION=yes
CHECK_HOST_ALLOW=/etc/sendmail.allow
CHECK_HOST_DENY=/etc/sendmail.deny
CHECK_RELAY_DEFAULT=deny

[/etc/sendmail.allow]
beth.fml.org

sendmail.allow SMTP接続を許すホストのアドレス
sendmail.deny SMTP接続を拒否するホストのアドレス
いずれにもマッチしないホストはdeny
(CHECK_RELAY_DEFAULT)



(page 35)


sendmail: ドメインマスタ(1)







(page 36)


sendmail: ドメインマスタ(2)

# 自分のドメイン(domain.dom.jp == $m)は受ける
ACCEPT_ADDRS='$m'

CHECK_HOST_ALLOW=/etc/sendmail.allow
CHECK_HOST_DENY=/etc/sendmail.deny
CHECK_RELAY_DEFAULT=allow

# 自ドメイン内部から外へ出ていくメールについて
# *.domain.dom.jp というホストからのメールの受信/中継を許可する
# 一般にはIPアドレスで制御する方が望ましい
LOCAL_HOST_DOMAIN=domain.dom.jp

# *.domain.dom.jp 宛以外のメールは拒否する。
ALLOW_RECIPIENT_DOMAIN=domain.dom.jp



(page 37)


sendmail: spamlist

[CF]
SPAM_LIST=/etc/sendmail.spamlist
SPAM_LIST_TYPE=hash

[/etc/sendmail.spamlist]
user@spam.co.jp comment
spam1.co.jp comment
10.2.3.4 comment

○ DBを作る
% makemap hash sendmail.spamlist < sendmail.spamlist

備考: DBなら動的



(page 38)


sendmail: セカンダリ

忘れられていることが多い
e.g. ドメインマスタで自分宛以外を受けとらない

例: domain.dom.jp のセカンダリではRELAY行が必要

[CF]
ALLOW_RELAY_TO=domain.dom.jp



(page 39)


sendmail: 組織内のチェック(1)

MAIL FROM:?

listname@foo.org

MUA依存

e.g. MAIL FROM: nobody@spam.org ...



(page 40)


sendmail: 組織内のチェック(2)

すべてCLIENT_*へ

許すドメイン
CLIENT_FROM_DOMAIN=domain.dom.jp

制限を貸すアドレスリスト
CLIENT_HOST_IPADDR=/etc/sendmail.clientip



(page 41)


sendmail: 組織内のチェック(3)

メーリングリストサーバなどは例外 => LOCAL_* の利用

[CF]
LOCAL_HOST_IPADDR=/etc/sendmail.localip



(page 42)


sendmail: 同じアドレスを使う(1)

どこからでも同じメールアドレスを使いたい


認証と配送リストが違うサーバは別として:)




(page 43)


sendmail: 同じアドレスを使う(2)

CFならROAM_*オプション

ちょっと危ない

POPしたIPアドレスからのメールリレーをN分間許す
MTA: 普通単なる設定オプションでは×
MUA: 仕様依存



(page 44)


sendmail: ROAM_* (1)

組織外から domain.dom.jp のEmailアドレスで

条件として

XXX: 自宅が専用線ならともかくDial UPでは…


(page 45)


sendmail: ROAM_* (2)

[CF]
# このルールを認める特定の送信者のリスト
ROAM_USERS=/etc/sendmail.roamusers

# このルールを許すIPアドレスやドメインのリスト
ROAM_HOST_IPADDR=/etc/sendmail.roamip
ROAM_HOST_DOMAIN=/etc/sendmail.roamdomain

[/etc/sendmail.roamusers]
foo@domain.dom.jp
bar@domain.dom.jp



(page 46)


POP and SMTP (1)



こんなのはperlでちょちょい
DBでない場合は sendmail restart




(page 47)


POP and SMTP (2)

サーチすれば色々出てくる…


/etc/postfix/access (postmapでDB)




(page 48)


Next Generation ?

RFC2444
"The One-Time-Password SASL Mechanism".
C. Newman. October 1998.

RFC2246
"The TLS Protocol Version 1.0".
T. Dierks, C. Allen. January 1999.



(page 49)


SASL

draft-myers-smtp-auth-12.txt


S: 220 smtp.example.com ESMTP server ready
C: EHLO jgm.example.com
S: 250-smtp.example.com
S: 250 AUTH CRAM-MD5 DIGEST-MD5
C: AUTH FOOBAR
S: 504 Unrecognized authentication type.
C: AUTH CRAM-MD5
S: 334 PENCeUxFREJoU0NnbmhNWitOMjNGNndAZWx3b29kLmlubm9zb2Z0LmNvbT4=
C: ZnJlZCA5ZTk1YWVlMDljNDBhZjJiODRhMGMyYjNiYmFlNzg2ZQ==
S: 235 Authentication successful.

  • SMAP with SASL
http://www.macgyver.org/software/smap-sasl.html



(page 50)


TLS

draft-hoffman-smtp-ssl-10.txt

S:
C:
S: 220 mail.imc.org SMTP service ready
C: EHLO mail.ietf.org
S: 250-mail.imc.org offers a warm hug of welcome
S: 250 STARTTLS
C: STARTTLS
S: 220 Go ahead
C:
C & S:
C & S:
C:
...



(page 51)





Mail Transport Agent


(page 52)


メールサーバ






(page 53)


sendmail








(page 54)


sendmail 利点



sendmail.cfで非常に細かい設定が可能




(page 55)


sendmail 問題(1)



single thread(sendmail/src/deliver.c)
MCIで5.xに比べれば早くなった:)
高速配送 => WIDEパッチ + smtpfeed



(page 56)


sendmail 問題(2)


Sendmail Inc.以降
NetBSDなどは8.8.8のまま



(page 57)


smtpfeed

LMTP(RFC2033)で配送を委す


  • ftp://ftp.kyoto.wide.ad.jp/pub/mail/smtpfeed/

http://mika.sys.wakayama-u.ac.jp/~watanabe/dsm-sympo99/program99.txt



(page 58)


smtpfeed 利点(1)

ref: qmail

select()駆動





(page 59)


smtpfeed 問題(1)


8.10ならOKかも?




(page 60)


smtpfeed 問題(2)

resolveしてsortして相乗りを考えるため
宛先が少ないとトータルではqmailが早い
thresholdは宛先数やMXの重なりの分布に依存
#注意: マシンへの負荷などを無視した比較考察

e.g. メモリ, 回線幅

=> 巨大MLを持っている人は考える価値あり



(page 61)


qmail



qmail is a modern replacement for sendmail, written by Dan
Bernstein, who also has a web page for qmail. qmail is a secure
package. There was a $1,000.00 prize for anyone who can show
otherwise, which went unclaimed. You can download qmail 1.03 (RPMs)
and redistribute qmail for free. You can get the "big picture" of
how qmail is organized. qmail is Y2K-compliant.


(page 62)


qmail internal

qmail-inject qmail-smtpd
\ /
\ /
qmail-queue ... [qmail-clean]
|
|
[qmail-send]
/ |
/ |
[qmail-lspawn] [qmail-rspawn]
|| ||
|| ||
qmail-local qmail-remote



(page 63)


qmail 利点(1)

年に一度くらい
今までsecurity絡みの緊急リリースはない
注意:外部から接続は受けないprogram



(page 64)


qmail 利点(2)

少数の配送先なら圧倒的に速い
安全? e.g. ~/.forward => ~/.qmail*
自動でなにかする分にはちょっと便利かも…
いろいろあるので詳細はマニュアル, FAQを


(page 65)


qmail 問題(1)

UNIXの期待/慣習と異なる
小さいファイルが平面的に広がってて読みにくい;_;
(大型機のファイルシステムみたい…)
マシンの負荷は大きい
確かに一つ一つは小さいが…
smtpfeed vs qmail
宛先が多いと宛先の重なりが効く
受ける側には負担増



(page 66)


qmail 問題(2)

C言語で直接hack
http://www.qmail.org/
相互に矛盾しないのか?などは不明
→直感が働かずはまる
qmail-smtpdは一度吸込んでみないと
user unknownなどの判定ができない



(page 67)


postfix

TCP Wrapper の作者として有名



IBM Secure Mailer ともいう



(page 68)


postfix Overview (1)

今言えば聞いてくれるとおもう:-)
みんなで鍛えていいものにしましょう!

uucpなんかも簡単に設定できる
#もの凄く複雑なものは直接C言語かな…

設定ファイルのシンタックスはそれっぽくて嬉しい
分野ごと程度の大きさのまとまり



(page 69)


postfix Overview (2)


Designとしての揺れはまだあるといえるのだろう
bugtraq の過去のメールを見られたい



(page 70)


Others

http://www.exim.org/
http://www.zmailer.org/
ftp://ftp.uu.net/networking/mail/smail/
http://www.tis.com/research/software/index.html
ftp://ftp.uu.net/networking/mail/mmdf/



(page 71)


references (1)

http://www.ietf.org/

ftp://ftp.isi.edu/internet-drafts/
http://www.ietf.org/internet-drafts/
ftp://ftp.iij.ad.jp/pub/internet-drafts/ (mirror)

ftp://ftp.isi.edu/in-notes/
ftp://ftp.iij.ad.jp/pub/rfc/ (mirror)



(page 72)


references (2)


"Users' Security Handbook"
Author(s): E. Guttman, L. Leong, G. Malkin
Status: Informational

"Anti-Spam Recommendations for SMTP MTAs"
Author(s): G. Lindberg
Status: Best Current Practice



(page 73)


references on SMTP/DNS

RFC821 RFC822 RFC974 RFC976 RFC987
RFC1035 RFC1049 RFC1123 RFC1344
RFC1413 RFC1428 RFC1652 RFC1869
RFC1870 RFC1891 RFC1892 RFC1893
RFC1894 RFC1985 RFC2033 RFC2045

RFC819 RFC920 RFC974
RFC1032 RFC1033 RFC1034 RFC1035
RFC1101 RFC1122 RFC1123 RFC1183
RFC1535 RFC1536 RFC1537 RFC1591
RFC1597 RFC1627 RFC1637 RFC1713
RFC1794 RFC1876 RFC1884 RFC1886
RFC1912 RFC1995 RFC1996 RFC2010
RFC2052 RFC2065 RFC2136 RFC2137
RFC2308



(page 74)





まとめ


(page 75)


まとめ

(page 76)