ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

sendmailコミュのメールゲートウェイサーバと内部メールサーバ

  • mixiチェック
  • このエントリーをはてなブックマークに追加
はじめまして。

sendmailでメールゲートウェイサーバと内部メールサーバを
構築してみようかと思っております。

セキュリティ対策としては、以下を考えてます。

・第三者中継
・SPAM対策

第三者中継に関しては、relay-domainsに許可するIPアドレス
及び、ドメイン名を記述する。

SPAM対策は、ブラックリスト(all.rbl.jp) を利用する。

以下現状です。

【環境】
OS:RedHat Linux9
MTA:sendmail-8.12.8-9.90

【構成】
メールゲートウェイ 1台
内部メールサーバ 1台

◎メールゲートウェイ
【relay-domains】
xxx.xxx.xxx.xxx
hoge.com

【mailertable】
aa.hoge.com local
hoge.com smtp:[192.168.1.10]

【local-host-names】
aa.hoge.com

【sendmail.mc】 ※有効に及び変更にした箇所
define(`STATUS_FILE', `/etc/mail/statistics')dnl
define(`confTO_QUEUERETURN', `1d')dnl
FEATURE(dnsbl,`all.rbl.jp')dnl
DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')dnl
MASQUERADE_AS(`aa.hoge.com')dnl
FEATURE(masquerade_envelope)dnl

◎内部メールサーバ
【relay-domains】
192.168.1
hoge.com

【local-host-names】
hoge.com

【sendmail.mc】 ※有効に及び変更にした箇所
define(`STATUS_FILE', `/etc/mail/statistics')dnl
define(`confTO_QUEUERETURN', `1d')dnl
FEATURE(dnsbl,`all.rbl.jp')dnl
DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')dnl
MASQUERADE_AS(`hoge.com')dnl
FEATURE(masquerade_envelope)dnl

後は、バージョンの隠蔽、SMTP認証、内部メールサーバから
メールを送信する際に、メールゲートウェイを通る様に設定
が出来ればと考えております。

この設定で本当に、第三者中継とSPAM対策が出来ているかも
心配です。

ご教授の程宜しくお願い致します。

コメント(24)

第3者中継はORDBとかで検査してしまうのも手かと.
http://www.ordb.org/?&setlang=ja
失敗したら第3者中継を行うホストのリストに登録されてしまうというリスクはありますけど.
Canadianさん返答有難う御座います。

ORDBでは登録されそうで怖かったので、RBL.JPでも
第三者中継のチェックが出来ましたので、実施して
みました。

結果は、第三者中継はしてない様でした。

SPAM対策は、RBL.JPを考えておりましたが、ORDBの
方が良いのでしょうか。

残るは、
・バージョンの隠蔽
・SMTP認証
・内部サーバからのメール送信のルート設定

現段階では、バージョンの隠蔽方法が記載されている
HPを以前発見したのですが、URLを忘れてしまったので
再度探している状態です。

【参考URL】
RBL.JP http://www.rbl.jp/
SMTP認証は、次のように追加設定して Submissionを使うのがよいかと思います。
DAEMON_OPTIONS(`Port=submission ,Addr=0.0.0.0, Name=MSA, Modify=Ea')dnl
電網研所長さん、有難う御座います。

ですがなぜ、Port=submissionのところは、smtpではなくsubmissionの方が
いいのでしょうか?

また、

DAEMON_OPTIONS(`Port=submission ,Addr=0.0.0.0, Name=MSA, Modify=Ea')dnl

の設定を追加するということは、

DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')dnl

の設定はそのままでも良いと言う事ですよね?


また、私が調べたSMTP認証は以下の様な方法でした。

・sendmail.mcの編集
 dnl TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
 dnl define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl

      ↓↓↓↓↓

 TRUST_AUTH_MECH(`DIGEST-MD5 CRAM-MD5')dnl
 define(`confAUTH_MECHANISMS', `DIGEST-MD5 CRAM-MD5')dnl

・/usr/lib/sasl/Sendmail.confを編集
 pwcheck_method:sasldb

・ユーザのパスワードを生成
 saslpasswd ユーザー名

 【参考URL】
  http://www.szk-st.net/~takashi/linux/tips/sendmail--smtp-auth.html

【調べて解った事】
◎以下のHPでMTAとMSAの違いやsubmissionの方が良く
 使われると書いてありました。

・MSA(Message Submission Agent)
 MUAがメール送信のために接続するプログラム。

・MTA(Mail Transfer Agent)
 SMTPでメールを受け取り、必要に応じてSMTPで他のホストに
 メールを配送したり、ローカル配信のためにMDAにメールを
 引き渡すといった処理を実行するプログラム。

 【参考URL】
  http://www.rbbtoday.com/column/spamadmin/20050221/page2.html

◎Modify=Eaはそれぞれの意味
・E:SMTPのETRNコマンドを使用しない
・a:すべての受信接続に対して認証を要求する
 
 TRNコマンドに関しては、どの様なものか今現在調べて
おります。
バージョンの隠蔽方法がわかりました。

・sendmail.mcに以下の行を追加
 define('confSMTP_LOGIN_MSG','unknown')dnl
 define(`confRECEIVED_HEADER',`$?sfrom $s $.$?_($?s$|from $.$_)
  $.$?{auth_type}(authenticated)
  $.by $j (sendmail)$?r with $r$. id $i$?u
  for $u; $|;
  $.$b')dnl

・/etc/mail/helpfileの以下の行をコメントアウト
 #smtp This is sendmail version $v
 #smtp To report bugs in the implementation send email to
 #smtp sendmail-bugs@sendmail.org.

【参考URL】
http://www.szk-st.net/~takashi/linux/tips/sendmail--version.html

これで私が考えていたメールサーバ構築は後、

・SMTP認証
・内部サーバからのメール送信のルート設定

だけですが、他にしておいた方が良い設定がありましたら
お教え下さい。
- SPFv1に対応したDNSへのエントリーの追加
- 書いてないとたまーに受け取ってくれないところがある

# 逆引きエントリのチェックはなしですかい?(所長専用ネタ:-)
説明不足ですいません。
TRUST_AUTH_MECH のあたりは、そのままです。
SASLを使用するようにしてコンパイルするところも同じです。

その上で、認証のためには別ポートを使用するというのが、最近の迷惑メール対策の流行です。
こうしておくと、接続に使用するプロバイダがWAKWAKのようにPort25をフィルタリングしたときにも問題なくメール送信が出来ます。

最新の迷惑メール対策に興味があるのであれば、sid-milter や dk-milter を入れてみるのもよいかもしれません。

逆引きチェックは、諸刃の剣なので、あえて書きませんでした。
中国や韓国からの迷惑メールは確実に減りますが、日本国内のISPを発信元としたメールは減らないのと、ポリシーによって逆引きを書いていない企業などからのメールが受け取れない可能性があります。
白点さん、ご指導有難うございます。

勉強不足で、SPFv1がどの様なものかわかりません。

もしかして、

> # 逆引きエントリのチェックはなしですかい?(所長専用ネタ:-)

からすると、送信元ドメインのMXレコードが存在するか
チェックして、無ければ受け付けないという方法もあると
聞いた事がありますが、その事でしょうか?



電網研所長さん、

DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')dnl
DAEMON_OPTIONS(`Port=submission ,Addr=0.0.0.0, Name=MSA, Modify=Ea')dnl

上記の2つの設定をするとポート番号587と25の両方で送信が
可能になってしまうと思うのですが・・・。

また、

DAEMON_OPTIONS(`Port=submission ,Addr=0.0.0.0, Name=MSA, Modify=Ea')dnl

だけだと、他のサーバからメールを受信出来なくなるのでは?

ですので、

DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA M=Ea')dnl

とメールゲートウェイサーバと内部メールサーバに設定する
のでは、駄目でしょうか?

> 最新の迷惑メール対策に興味があるのであれば、sid-milter や dk-milter を入れてみるのもよいかもしれません。

こちらに関しましては、一通りの設定が終了したら、調べて
見たいと思います。

またETRNコマンドに関しては、以下のURLに説明がありました。

●ETRNコマンド
 ダイヤルアップ接続でISP(接続業者)のMTAと接続されて
 いるローカルのMTAの場合に使用される。

 外部から来るメールは、ローカル側へ送信する術がない為、
 送受信の方向を切り替えて、ISPのMTAからローカルMTAへ
 キューイングされているメールを送信するコマンドだ。

 これを使えば、ローカルMTAからダイヤルアップした際に、
 メールを取り込むことができる。

このHPの説明からすると、今は常時接続の為必要の無いですね。

でも接続する度にETRNコマンドを実行する方法って、telnetで
接続して、ETRNコマンドを入力するのでしょうか?

【参考URL】
http://211.4.250.170/fnetwork/rensai/netpro06/netpro01.html
まず、DAEMON_OPTIONS をなぜ2つ書くかについて説明します。

メールサーバには2つの機能があります。
一つはインターネットの不特定多数のサーバからメールを受信すること。
もう一つはメール送信ソフトから受信したメールをインターネットに送信することです。
いままでの一般的なメールサーバでは、メールクライアントからの送信を受けて中継するポートと、他のメールサーバからの送信を受けるポートに同じもの(Port25 smtp)を使用していました。
外部からの受信用と内部からの中継用のポートが分離していないことにより、さまざまな問題が発生しています。


そして、Port25に代わってクライアントからのメール送信用には別のポートを使用することがRFCで標準化されています。
これが Submission Port (Port 587) です。

これによりメールサーバの動作は以下の2つになります。
Port25で受信したものは、外部からのメールとして扱います。これをMTA(Message Transfer Agent)と呼びます。
・自分のドメイン宛のメールを受信し、配送/中継します。
・IPアドレスが判っている内部サーバからのメールを中継します。

Port587で受信したものは、メールクライアントからのメールとして扱います。これをMSA(Message Submission Agent)と呼びます。
・認証を必須として、許可されたもののみ配送/中継します。
・自分のドメイン宛であっても認証していないものは受信しません。
・この設定のため、Sendmail では Modify=a フラグを使用します。
Port=smtp のものに、Modify=a を指定すると、外部からのメールが一切受信できなくなりますので、これを行ってはいけません。

Port25でも「認証すれば」送信(中継)が可能となる点については、確かにそのとおりです。
しかし認証しなければ送信できないのですから、その機能があっても問題はありません。
そして、Port25を使ってクライアントからメールを送信するという方法は、近いうちに使用が困難になります。

現在、SMTP の弱点である Port25 に送られてきた自ドメイン宛てのメールは必ず受信しないといけないという点を悪用して、大半の迷惑メールは正規のメールサーバを使用せずにISPが接続会員に動的に割り当てたIPアドレスから直接送信されています。
この現状に対して、各ISPは動的アドレスからのPort25送信を禁止しようという動きになりつつあり、WAKWAKやSANNETなどでは既にPort25が使用できなくなっています。

いまから立てるメールサーバでしたら、最初から Submission(Port 587) をクライアントからの送信のために使用することが望ましいです。


次に、ETRNコマンドですが、上記の書き込みで MTA と MSA について理解されたという前提で説明します。
外部への中継を仕事とする MTA は、常時接続でないメール受信先に送信出来なかった場合には、サーバの中でキューにためます。
そして相手先のサーバは自分がインターネットに接続されたときに、ETRNコマンドを送信して自分宛のメールを再送するよう依頼します。

MSAの場合は、相手先はメールクライアントですので、再送はありえません。
そのため ETRN コマンドを禁止しています。

不特定多数のMTAからETRNを使用することはまずありませんが、ノートパソコンでサーバを立ち上げて、MTAとして動作させながら各地のネットカフェを移動しているような場合には使用するかもしれません。(それってspammerみたい)
一点気づいたことがあります。

> 第三者中継に関しては、relay-domainsに許可するIPアドレス
> 及び、ドメイン名を記述する。

relay-domains は記述が曖昧なので、access_db を使用したほうがよいです。

FEATURE(access_db)dnl を指定する。

【/etc/mail/access】
Connect:192.168.1 RELAY
Connect:xxx.xxx.xxx.xxx RELAY
To:hoge.com RELAY

makemap hash /etc/mail/access < /etc/mail/access を実行
> 勉強不足で、SPFv1がどの様なものかわかりません。

SPFは最近「送信ドメイン認証」として分類されている技術のひとつです。送信ドメイン認証はそのドメインの正規のメール送信サーバのIPアドレスや公開鍵などの情報をDNS上に開示し、正規のメール送信サーバ以外からのメールを外部からでも識別できるようにすることで、昨今フィッシングなどで問題化している送信ドメインの詐称を見破るための技術です。

MXにはそのドメインのメール受信サーバを記述しますが、SPFはメール送信サーバを記述します。

# 「送信ドメイン認証」で検索するともっと良い説明がありそう。
電網研所長さん、ご説明有難う御座います。

しかしならが、

DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA M=a')dnl
DAEMON_OPTIONS(`Port=submission, Name=MSA, Modify=Ea')dnl

と設定しても、中継及び受信出来ました。

realy-domainsかmailertableに記述しているのが原因でしょうか?

第三者中継の制限をなぜ、accessではなくrealy-domainsで
行っているかといいますと、realy-domainsよりaccessの
方が細かい設定が出来るのは、知っていましたが難しそう
でしたので、realy-domainsを使用する事にしました。

accessでの制限が出来るように勉強致します。
ちなみに、relay-domainsの曖昧なのでしょうか。

またtelnetでもメールを送る事が出来るかと思いますが、
防ぐ事はできますか?


白点さん、ご説明有難う御座います。

設定はしておりませんが、SPFの設定とは以下の記述で
しょうか。

FEATURE(`relay_based_on_MX')dnl

電網研所長さんが

> 逆引きチェックは、諸刃の剣なので、あえて書きません
> でした。
> 中国や韓国からの迷惑メールは確実に減りますが、日本
> 国内のISPを発信元としたメールは減らないのと、ポリシー
> によって逆引きを書いていない企業などからのメールが
> 受け取れない可能性があります。

と仰っていますが、その辺は大丈夫なのでしょうか。
まず、信頼できるIP以外から接続して、以下のテストをしてみてください。

●MTAのテスト1
> telnet mail.xxx.com 25
Trying xxx.xxx.xxx.xxx...
Connected to mail.xxx.com.
Escape character is '^]'.
220 mail.xxx.com ESMTP Sendmail Thu, 2 Jun 2005 19:47:56 +0900 (JST)
EHLO tako.net
250-mail.xxx.com Hello xxx.xxx.ne.jp [xxx.xx.xxx.xx], pleased to meet you
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-SIZE
250-DSN
250-ONEX
250-XUSR
250-AUTH PLAIN LOGIN
250 HELP
mail from: ikeda@xxx.net ← 送信元を、適当なドメインにする。
250 2.1.0 ikeda@xxx.net... Sender ok
rcpt to: ikeda@xxx.com ← 送信先を、受け取りドメインにする。
250 2.1.5 ikeda@xxx.com... Recipient ok
rcpt to: ikeda@zzz.net ← 送信先を、受け取りドメイン以外にする。
550 5.7.1 ikeda@zzz.net... Relaying denied

このとおりの結果になれば第一段階は問題はありません。
これで、最後の行で Recipient ok と出るようであれば、明らかに不正中継を許可しています。

次に、以下のテストを行ってください。

●MTAのテスト2
> telnet mail.xxx.com 25
Trying xxx.xxx.xxx.xxx...
Connected to mail.xxx.com.
Escape character is '^]'.
220 mail.xxx.com ESMTP Sendmail Thu, 2 Jun 2005 19:47:56 +0900 (JST)
EHLO tako.net
250-mail.xxx.com Hello xxx.xxx.ne.jp [xxx.xx.xxx.xx], pleased to meet you
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-SIZE
250-DSN
250-ONEX
250-XUSR
250-AUTH PLAIN LOGIN
250 HELP
mail from: ikeda@xxx.com ← 送信元を、受け取りドメインにする。
250 2.1.0 ikeda@xxx.net... Sender ok
rcpt to: ikeda@xxx.com ← 送信先を、受け取りドメインにする。
250 2.1.5 ikeda@xxx.com... Recipient ok
rcpt to: ikeda@zzz.net ← 送信先を、受け取りドメイン以外にする。
550 5.7.1 ikeda@zzz.net... Relaying denied

これで、最後の行で Recipient ok と出るようであれば、それは relay-domeins が厳密ではにため不正中継を許可してしまっています。

この2つをパスしたら、以下のテストをしてください。

●MSAのテスト
> telnet mail.xxx.com 587
Trying xxx.xxx.xxx.xxx...
Connected to mail.xxx.com.
Escape character is '^]'.
220 mail.xxx.com ESMTP Sendmail Thu, 2 Jun 2005 19:47:56 +0900 (JST)
EHLO tako.net
250-mail.xxx.com Hello xxx.xxx.ne.jp [xxx.xx.xxx.xx], pleased to meet you
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-SIZE
250-DSN
250-ONEX
250-XUSR
250-AUTH PLAIN LOGIN
250 HELP
mail from: ikeda@xxx.net ← Authせずに送信してみる。
530 5.7.0 Authentication required

これで、 ok が出るようならば、設定がどこかで間違っています。
.mc から作成された .cf の中に、設定が反映されていることを確認してください。


> ちなみに、relay-domainsの曖昧なのでしょうか。

relay-domainsは、IPアドレスとFromとToを全部ごちゃまぜにして扱うので、たとえば From に自分のドメインを書かれると、そのメールの中継を許してしまうことになります。

これがなぜまずいかと言うと、Fromというのは自由に書くことが出来るため、簡単に詐称されてしまうからです。

中継をするメールは、認証を通ったものと信頼できるIPアドレスからのものだけにしなければ駄目です。
(がちゃぴんさん曰く)
> 設定はしておりませんが、SPFの設定とは以下の記述で
> しょうか。
> FEATURE(`relay_based_on_MX')dnl

いいえ。

送信側の立場でしておく設定はDNSにTXT(将来はSPFかも知れないが) RRを書くことです。逆に受信側で送信サイトの正当性をチェックするにはsid-milterを使います。

> 電網研所長さんが
(中略)
> と仰っていますが、その辺は大丈夫なのでしょうか。

送信ドメイン認証は、「逆引きチェック」でも「MX based relay」にも該当しない別モノです。受信側でのチェックをやる場合はポリシーによっては弊害が出る可能性はありますが、送信側でDNSにTXT RRを書くと、何も弊害がないどころか相手が送信ドメイン認証のチェックをしている場合にメールを撃墜されないための識別信号として作用します。
電網研所長さん、有難う御座います。

教えて頂いた方法で確認した結果問題ありませんでした。
今現在、accessでの制限に移行使用と勉強しております。

教えて頂いた、

Cnnect:192.168.1 RELAY
Cnnect:xxx.xxx.xxx.xxx RELAY
To:hoge.com RELAY

のCnnect:とTo:は、初めて知りました。
教えて頂き、有難う御座います。

To:    メッセージエンベロープの受信者アドレスだけを、
     条件テストのデータと照合する。
From:   メッセージエンベロープの送信者アドレスだけを、
     条件テストのデータと照合する。
Connect: 受信メールの接続を開始したりリモートシステムの
     IPアドレスだけを、条件テストのデータと照合する。


白点さん、有難う御座います。

調べた結果、

FEATURE(`relay_based_on_MX')dnl

は、受信メールのホスト部がMXレコードとしてリストアップ
されているかどうかに従って、それをリレーするかどうかを
決定するみたいですね。

申し訳ありませんでした。

設定するには、DNSの知識とsid-milterの知識が必要になる
のですね。

この設定は、もう少し知識がついてからにしたいと思います。
今回は、

DAEMON_OPTIONS(`Port=submission, Name=MSA, Modify=Ea')dnl

でSMTP認証をしましたが、この設定以外でsmtp認証をしないと
送信出来ない様にする方法ってあるんでしょうか。

また、587番ポートを使用して送信する理由は解りましたが、
25番ポートでの送信を制限するにはどんな方法がありますか?

これで、送信ドメイン認証は、今の私の知識では無理そう
でしたが、後は

・内部サーバからのメール送信のルート設定

となりました。
内部サーバからのメール送信のルート設定方法が
わかりました。

dnl define(`SMART_HOST',`smtp.your.provider')

を、

define(`SMART_HOST',`aa.hoge.com')

後は、aa.hoge.comの/etc/mail/accessに

Cnnect:192.168.1 RELAY
Cnnect:xxx.xxx.xxx.xxx RELAY
From:hoge.com RELAY
To:hoge.com RELAY

とするだけ。

お手数ですが、間違いが御座いましたらご指摘下さい。
参考までに、世界のメール関連大手がSPF/Sender-IDに
対してどう動いているかは、幸いにして

% dig msn.com txt
% dig aol.com txt
% dig gmail.com txt
% dig hotmail.com txt
% dig microsoft.com txt
% dig apple.com txt
% dig sendmail,com txt

あたりのコマンドを叩くだけで調べられます。
( % はコマンドプロンプトのつもりです )

「Phishingうぜー」とか言う前にやってみるべし。
> 25番ポートでの送信を制限するにはどんな方法がありますか?

25番ポートで送信を制限するのはクライアントが接続に使用するプロバイダなので、受信側は無条件リレーさえ不正でいればOKです。

それでも心配ならば、いちばん簡単なのは、sendmail を複数動かすことです。

ねむいので、詳細はまた後日。
白点さん、申し訳ありません。

sid-milterを以下のサイトから取得して、試してはみた
のですが、sid-filter/Makefile.m4をどの様に変更したら
よいのわかりません。

http://sourceforge.net/projects/sid-milter/

編集しないで、sh Buildしたらエラーになります。
メッセージからして、sid-filter.cが関連してるとは
思うのですが・・・

それにしても、sid-milterとdk-milterの設定情報って
少ないですね。


電網研所長さん

> 25番ポートで送信を制限するのはクライアントが接続に
> 使用するプロバイダなので、受信側は無条件リレーさえ
> 不正でいればOKです。

と言う事は、FireWallでメールサーバからの25番ポートを
閉じると言う事でしょうか。
そうじゃないです。
メールサーバからの25は閉じません。
メールサーバ以外からの25を閉じます。
milterについては、別トピにしたほうがよさげですね。
数ヶ月ぶりに設定を開始しようと思い、書き込みを読んでおります。

今頃ですが、自分の発言で気がついた事が・・・

15番目の発言で、

> To:    メッセージエンベロープの受信者アドレスだけを、
>      条件テストのデータと照合する。
> From:   メッセージエンベロープの送信者アドレスだけを、
>      条件テストのデータと照合する。
> Connect: 受信メールの接続を開始したりリモートシステムの
>      IPアドレスだけを、条件テストのデータと照合する。

と理解しておきながら、17番目の発言では、

> Cnnect:192.168.1 RELAY
> Cnnect:xxx.xxx.xxx.xxx RELAY
> From:hoge.com RELAY
> To:hoge.com RELAY

と書いております。

しかし、

Fromで許可しても他からのメールも受け取りました・・・
もしかして、拒否するだけのものなのでしょうか。

また、Toはlocal-host-namesで設定しているから不要なのでは
ないでしょうか。

FromとToに関して、再度教えて頂けないでしょうか。
宜しくお願い致します。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

sendmail 更新情報

sendmailのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング