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
これで良さそうですー。
良かった良かった。
コメント