4月 092015
 

Postfixの基本的な使い方についてまとめました。
リレーの方法などに関してはよくわかりませんでした。

Postfixの設定に関して

/etc/postfix/main.cfの設定情報に関して調べました。

myhostname

自分のメールサーバーのホスト名を指定します。基本的にMXレコードに設定した文字列を指定します。(例:mail.fagai.net)

myhostname = mail.fagai.net

mydomain

メールアドレスで利用するためのドメイン名を指定します。(例:fagai.net)

mydomain = fagai.net

myorigin

ローカルから配信されるメールは、mydomainのメールであることを認識させるための設定です。設定の際には、mydomainをそのまま利用すればいいので、

myorigin = $mydomain

と記述すれば良いようです。

inet_interfaces

メールを受信するネットワークインターフェースを指定します。通常はlocalhostとなっており、localhostから送信されるものしか受信出来ないので、allに変更する必要があります。

inet_interfaces = all

inet_protocols

使用するネットワークプロトコルを指定できます。allとipv4とipv6が指定できるみたいです。ipv6に対応していないサーバーの場合、ipv4のみを指定するのが良さそうです。(特に、gmailを通して送信するとスパム扱いされます。リレーでの送信先がipv6になってることが多いです)

inet_protocols = ipv4

mydestination

自分宛てのメールをメールボックスに入れるために、ここでドメインを指定します。ここで指定したドメインに一致するものだけメールを受信し、このサーバー上のメールボックスにメールが追加されます。

デフォルトだと、

mydestination = $myhostname, localhost.$mydomain

が設定されています。つまり、mail.fagai.netと、localhost.fagai.netに送られてきたメールをメールボックスに入れます。

今回は、ドメイン全てのメールを受信したいので

mydestination = $myhostname, localhost.$mydomain, $mydomain

と指定します。

mynetworks

信頼するネットワークの指定です。ここから来たSMTPは認証なしに他のサーバーへリレーします。基本的には自分宛(127.0.0.0/8)だけで良いと思います。メールサーバーを複数置いている等の場合には、指定をするとよいでしょう。

mynetworks = 127.0.0.0/8

relayhost

外部へメールを送信する際に送るメールサーバーを指定します。例えば、プロバイダから25番ポートを拒否(OP25B)されている際にそのプロバイダが指定している経由するためのメールサーバーのホスト名を指定したり、組織内に部署ごとにメールサーバーが存在しており、外部に送る際にDMZにあるサーバーを指定する場合等に利用します。  
VPSとかを使用する場合には指定しなくて良さそうです。

home_mailbox

受信したメールの保存形式と、保存場所を指定します。Mailbox形式と、Maildir形式が存在し、Maildir形式が通常使用されます。POP3サーバーが使用する形式と合わせるのが良いらしい。Mailbox形式は1つのファイルにメールがまとめられ、Maildir形式は1ディレクトリにメールがまとめられる方式です。そのため、Maildir形式の場合は、最後に/が必要になります。(ディレクトリであることを認識させるため)
メールボックスの保存先はホームディレクトリからの相対パスとなっています。
基本的にMaildir/が指定されるようです。

home_mailbox = Maildir/

smtpd_banner

バナー情報(サーバー自身のソフトウェア名、バージョン番号情報)の出力を指定します。これはあまり出力しないほうが良いので、変更します。

smtpd_banner = $myhostname ESMTP unknown

これ以降の設定は、cfファイル上には書かれてないので追記が必要ですね。

disable_vrfy_command

SMTPにはVRFYというコマンドがあり、このコマンドを利用するとアカウントの有無が確認できます。
この機能は脆弱性にもなり得るので、このコマンドは使えないようにすべきです。これを無効にするオプションがこれです。
多分デフォルトでyesになってるのかな。

disable_vrfy_command = yes

 SMTP_AUTH用の設定

smtpd_sasl_auth_enable

SMTP_AUTHを有効にするかの設定です。

smtpd_sasl_auth_enable = yes

smtpd_sasl_local_domain

認証に使用するメールサーバーの名前を指定します。これは後ほど、saslpasswd2の-uで同じ値を指定する事になります。

smtpd_sasl_local_domain = $myhostname

smtpd_recipient_restrictions

このオプションはRCPT TOに対する制限を設定出来ます。RCPT TOは送信先アドレスを通知する為のコマンドです。よく分からないので、一旦は先人の人達が設定してる内容をパクります。

permit_mynetworksは自分のネットワークからの接続を無条件で許可。permit_sasl_authenticatedはSMTP_AUTHで認証された接続を無条件で許可。reject_unauth_destinationは「mydestination」「inet_interfaces」「virtual_alias_domains」「virtual_mailbox_domains」「relay_domains」これらのパラメータに設定されているアドレス宛の場合は許可、それ以外は拒否。

smtpd_recipient_restrictions =
  permit_mynetworks,
  permit_sasl_authenticated,
  reject_unauth_destination

smtpd_sasl_secrity_options

使用可能な認証方式を指定します。設定値には複数の値がありますが、大抵はこの2つだけみたいです。noanonymousは匿名認証を許可しません。noplaintextはPLAIN認証を許可しません。

smtpd_sasl_secrity_options = noanonymous, noplaintext

SMTP_AUTHについて

SMTP_AUTHはRFC2554で定義されている、ESMTPのオプションの1つ。なお、ESMTPはSMTPを拡張の枠組み。あくまでこれは枠組みで、拡張方法に関しては別のRFCで規定されている。その一つにSMTP_AUTHがある。
SMTP_AUTHには、SASL(Simple Authentication and Secrity Layer)という認証メカニズムを利用している。

なお、認証アルゴリズムにあるCRAM-MD5及び、DIGEST-MD5にはcyrus-sasl-md5というパッケージが必要。詰む前に先に入れておくべき。

yum install -y cyrus-sasl-md5

PLAIN

普通の平文による認証方式です。
「[認可ID]認証IDパスワード」の形式になっている。Base64でエンコすることもある。SSLで暗号化を行うのが前提。

LOGIN

同じく平文を用いた認証方式。標準仕様には存在していない方式だが、おそらくいちばん使われている。
結局、互換性も低いので、PLAINへ標準化される?

CRAM-MD5

CRAMは、Challenge-Response Authentication Mechanismの略。
MTAサーバー(接続先)からあらかじめ示された任意の文字列(Challenge)にクライアントがパスワードを含め、MD5暗号化を利用してメッセージダイジェストを作り、これをサーバーに送信する。サーバーでも同様の検証を行い、この値が一致していれば、クライアントは正しいパスワードを所持しているとみなし、ログインを許可する方式。パスワードがネットワークに流れないので、結構安全。

実際のメールサーバーとクライアントの流れとしては、
1.EHLOコマンドというコマンドをメールサーバーに流し、メールサーバーが対応しているAUTHコマンドを調べる
2.AUTHコマンドという物を利用して、認証を利用することをメールサーバーに伝えます。(AUTH CRAM-MD5)
3.メールサーバーからChallenge文字列が返ってくる。
4.その文字列とパスワードを合わせて暗号化し、その先頭にユーザ名を付けたものをBASE64エンコして送信。base64encode(md5(password + ‘ ‘ + challenge))
5.認証が出来たことがメールサーバーから返ってくる

DIGEST-MD5

辞書攻撃とかに対処できるようにHMACでの認証とかにも対応したバージョン。あんまり使われてない。
今回はCRAM-MD5を利用するので、割愛した。

SMTP_AUTHが利用できるか確認しておく

とりあえず、postfixは再起動しておいてね。

# telnet localhost 25
220 mail.fagai.net ESMTP unknown
[入力待ち状態]
EHLO local
250-mail.fagai.net
250-PIPELINING
250-SIZE 10240000
250-ETRN
250-AUTH PLAIN LOGIN
250-ENHANCEDSTASTUSCODES
250-8BITMIME
250 DSN
[入力待ち状態]

あれ、AUTHのリストに出てきてないですね。調べてみたら、もうちょっと設定が必要っぽいです。

やるべきことは、sasl2の認証ユーザーの登録と、設定ファイルで認証にsaslauthd(UNIX認証)をauxprop(sasl2に登録したユーザーでの認証)に変更が必要みたい。

sasl2の認証ユーザーの登録

このままでは、SMTP_AUTHを設定してもユーザーが居ないので、送れないので、ユーザーを作りましょう。
ユーザーの作成には、saslpasswd2を利用します。

# saslpasswd2 -u mail.fagai.net -c smtpuser
[パスワードの入力]

また、この状態ではpostfixが参照できないと思うので、ユーザーを設定しておきます。

sudo chown postfix /etc/sasldb2

Cyrus SASLの設定

今回、認証をsaslauthdではなく、saslに登録されているユーザーで認証を行うので、pwcheck_methodをauxpropに変更します。
変更すべきは、/usr/lib64/sasl2/smtpd.confです。(無かったら作りましょう。なお、32bit版はlib64じゃなくてlibです)

cd /usr/lib64/sasl2
vi smtpd.conf

以下を追加or変更

pwcheck_method: auxprop

あとは、もう一度postfixをreloadします。

service postfix reload

もう一度telnetで打ってみる。

# telnet localhost 25
220 mail.fagai.net ESMTP unknown
[入力待ち状態]
EHLO local
250-mail.fagai.net
250-PIPELINING
250-SIZE 10240000
250-ETRN
250-AUTH CRAM-MD5 PLAIN DIGEST-MD5 LOGIN
250-ENHANCEDSTASTUSCODES
250-8BITMIME
250 DSN
[入力待ち状態]

追加されてましたー。
やったー!

あとは、DNSの設定が必要です。自分はお名前comさんを使ってたので、お名前さんのところでAレコードとMXレコードを追加します。

TTLは両方とも3600。
Aレコードのホスト名はメールのホスト名(mail.fagai.net)です。多分mailだけ書けば良いはず。VALUEはIPアドレスですね。
MXレコードの値にはホスト名。優先を10に。

SPFレコードを登録する

SPFレコードは迷惑メールに振り分けられないためにも設定が必要です。
同じくお名前comさんでの設定だと

ホスト名はmail.fagai.netで、TYPEがTXT、VALUEが「v=spf1 a:mail.fagai.net -all」
こんな感じですねー。

これで大丈夫なはずです。一応海外のSPFのレコードチェックで試しました。(アスメルの奴は、includeを強制してくるので)

サブミッションポートを受け付けるようにする

587番ポート(サブミッションポート)のが受け付ける設定になっているか確認しておきましょう。

/etc/postfix/master.cfを確認しましょう。

submissionの部分が#でコメントアウトされてあればsubmissionポートが受け付けてないので、コメントアウトを外します。

- #submission inet n - n - - smtpd
+ submission inet n - n - - smtpd

で、リロードしましょう。

service postfix reload

ついでに、submissionが587ポートに接続されるか確認しておきます。

# cat /etc/services |grep "submission"
submission 587/tcp msa  # mail message submission
submission 587/udp msa  # mail message submission

iptablesに登録する

これはそもそも登録されてるかもですが、、、登録されてなかったらやってね。

# iptables -I INPUT -p tcp --dport 25 -j ACCEPT
# iptables -I INPUT -p tcp --dport 587 -j ACCEPT
# service iptables save
# service iptables restart

これで良さそうですー。
良かった良かった。

Pocket

 Posted by at 12:28 AM

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*