LinuxTweet前回のエントリーを踏まえて、具体的な設定を明かしていきます。yesあまり奇をてらったものはありません。バナーで自ホスト名は名乗った方がいいかと思いつつ、ディストリ名まで名乗る筋合いはないかなと。biffは今さら使い道があるようにも思わないので無効にしてしまっていいですし、readmeもググればもっと気の利いたものが見つかるので必要ないでしょう。VRFY/EXPNコマンドはユーザ名が漏洩する可能性に繋がるので無効にしてしまいます。これが必須なクライアントやサーバってのも聞いたことがありませんし。ipv4,ipv6ここは素直に名乗ります。mynetworksにはlocalhost関連と自身のグローバルIPアドレスを書いておけば十分です。IPv6対応は一応この辺だけですね、必要なのかっていう気はしますし、ログとかを見てるとGoogleくらいしかIPv6で送ってくる人いないわけで。送信時も今のところは問題に遭遇してませんが、先にIPv6を試すようなので、問題があるなら無効にしてしまうのもまたアリかもしれません。0これもあまり複雑なことはないです。一時的なメアドを作りたい時とかもaliasesに書いてしまう運用。存在しないユーザ宛のメールは550を返してやるのが正義だと思います。デフォルトで550なので書かなくてもいいですが、運用上450を返したい時とかもあるかなということでとりあえず明記しています。yessmtp_use_tls=yessmtp_tls_security_level=mayこの辺りから徐々に本気。証明書の配置とプロトコルバージョンについて定義しておきます。SSLv2とSSLv3を無効にするのは大人のマナーですよね。クライアント認証の証明書関連も一応ここで定義しておきます。ちなみに証明書自体は独自認証局で作ったオレオレ証明書です。あとはsmtpd_tls_security_level=mayを設定しておくことで、GmailなどのSTARTLESに対応したMTAからはSSL送信を受け付けます。逆にsmtp_use_tls=yesとsmtp_tls_security_level=mayを設定しておけばGmailなどに送る時にSSL送信を試みます。言うと、25番に接続してEHLO後にサーバ側から提示される可能コマンドの中にSTARTTLSがあれば、以降はSTARTTLSをしてしまう感じですね。こちらのサーバもEHLO後にSTARTTLSを提示しています。どちらもsecurity_level=mayが今のところの世の中のコンセンサスというところ。これだと証明書の検証もちゃんとしないので良いのかどうか際どいところです。いえmayとencryptの間に位置するパラメータもないし、少なくとも2015年末現在ではGmailを始めとしてオレオレ証明書であってもちゃんとSSLで送ってきているのでよしとします。Encryptなどの無料証明書での運用もありかなぁとは思います。$myhostname認証周りの設定はまるっとSASL経由でDovecotに投げています。Dovecot側ではpasswd-fileで認証をしてることもあり、smtpd_sasl_security_optionsにnoplaintextを指定しています。MUA側では「暗号化されたパスワード」を指定できます。SSLしてるのでどっちでもという感はありますが、できるならやっとこうと。yesをmain.cfに書いている設定例が多いですが、これはやっちゃダメだと思ってます。ここではnoを指定しておいて、後述のmaster.cfで書きます。ここから先が本気でアクセス制御を試みます。hash:/etc/postfix/accessSMTPの接続元での制御は、まず自ホストからの接続を無条件で許可しつつ、IPアドレスで拒否できるようなブラックリストを用意します。これは運用しながら柔軟に追記できるようにしています。これを潜り抜ければ他は許可してしまいます。RBLを参照するパターンも状況によっては有用だと思いますが、少なくとも私の運用では誤爆リスクの方が高いので入れていません。hash:/etc/postfix/access,reject_invalid_hostnameここも似たような感じでブラックリストでの運用ができるようにします。ログなどを見ているとHELOで名乗るホスト名は結構自由な感じなので、ここで弾ける可能性はあまり期待していません。特定のbotなどが送ってくるスパムの場合は一意なHELOを名乗ることが多いので、一定の有効性はあるかなとも思います。reject_non_fqdn_hostnameやreject_unknown_hostnameを指定している設定例もよく見かけますが、誤爆リスクの方が大きいように感じるのであえて入れてません。reject_invalid_hostnameもなんとなくで書いてる感は否めませんが。hash:/etc/postfix/accessここではEnvelope-Fromのドメインが存在しない場合に拒否するようにします。諸般の事情から存在しないEnvelope-Fromで受け取りたい場合のホワイトリストとしても、あるいはブラックリストとしても利用できるようにします。ここのパラメータで引っ掛けられるのはHeader-FromではなくEnvelope-Fromであることには注意が必要です。unix:private/policy-spfここが最大の肝ですかね。上から順番にこんな条件で処理されます。・SPF判定を実施これで自ドメイン宛のメールはpostfix-policyd-spfに処理が回され、SPF判定が実施されます。SPF関連の細かい設定は後ほど。上記の通り、25番宛のアクセスに対してはSMTP-Authを許可していないので、permit_ssl_authenticatedをここで書いてやる筋合いはありません。この辺も後ほどのmaster.cfに関する辺りで。regexp:/etc/postfix/content_checksこれも対スパムのブラックリストとして利用します。IPアドレスやHELOやFROMで落としにくいものを、例えばHeader-FromやMessage-IDやReceivedに書かれている中継サーバ、あるいはX-MailerやUser-Agentやcharsetなどを条件として弾いたり、添付ファイルの拡張子フィルタなどの運用を想定します。body_checksの方は、本文中のURLやNGワードの登録を想定。定義ファイルを分ける意義もあまりないと思うので、同じファイルを参照するようにしちゃいます。2送信時・受信時共にsmtpdからmilterを経由してOpenDKIMとOpenDMARCに処理を投げて、それぞれのヘッダを付加します。現在のところはとりあえず付けてるだけで、スパム除去には積極的には利用していませんが、ゆくゆくは主流になってくる可能性はあると思うので、早めに対応しておきたいところ。この辺の解説は別エントリーに回します。acceptを指定しておきます。ここでmilter経由でアンチウィルスするプランも想定はしたんですが、JessieのClamAVのバージョンがやや古いのと、どうせMacでしか受信しないという割り切りで棄却しました。4hメール送信時に一時エラーが発生した際の再送間隔をデフォルトより短くしてます。queue_lifetimeがデフォルトだと5日とかなのでちょっと長すぎ。それ以外も常識的な範囲で再送はしたいところなので、デフォルトよりは短くしてみてます。そんなアクティブに大量送信する予定もないのでという割り切りもありますが、送信量などによってはある程度の一時エラーは想定されるのでその辺は利用状況に応じて適宜というところ。15メッセージサイズ制限はデフォルトのままですが、状況によっては上下させる可能性もあるのでとりあえず書いておきます。他もデフォルトでもいいとは思いますが、流量がそんなに多くなくてしかもさくらのVPSの最安プランでリッチな構成のサーバではないにも関わらずPostfix以外にApacheやMySQLなんかも動いているので、プロセス数などは少なめに絞っています。テストしてみたところSPF判定で意外とメモリを食ってて、コンテンツサイズにもよりますがメール1通の処理に20MBくらいは使っていたので、万が一DoSを食らったりしてもスワップが発生しないようにはしたいなという目論見。SMTPの送信・接続制限もある程度のDoS耐性になるかなという緩い期待です。本気でヤバければiptablesとかもっと低いレイヤーで叩き落とした方が正解かなとも思います。企業ユースで「全従業員に個別メールを一括送信したい」みたいな使い方だと制限が発動されがちなので、流量やユーザ数などに応じて適切に調整したいところです。ここまででmain.cfの設定は以上。/etc/postfix-policyd-spf-python/policyd-spf.confデフォルトから変更しているのは最初の方にあるsmtpとsmtpsの設定、それから最後にSPFの設定を追記しています。SMTPの設定では特に指定するものはなし。main.cfの設定がそのまま引き継がれる格好ですね。smtpsの方ではsmtpd_sasl_auth_enable=yesを指定し、smtpd_tls_wrappermodeを有効にすることでSTARTTLSではなくセッションの最初からSSL通信を実施しつつ、同時にクライアント認証の証明書を要求します。SMTP-Authの認証に成功したら場合のみ配送を許可します。main.cfの設定ではなく、465番固有の設定を適用したい項目をここで書くわけです。SSLと認証周りの挙動は25番と分けたいのでこうしています。smtpd_sasl_auth_enableにはちょっと思うところがあります。main.cfでyesにしていてmaster.cfに何も書いていない設定例をよくみかけますが、この状態で試してみたところ25番に接続してSMTP-Authが通ってしまうということに気がついてしまいました。実に無意味なので、25番というかデフォルトではSMTP-Authは拒否しつつ、465番で接続した場合のみ許可をします。enabled」というエラーを返すことができます。failed」を返すのでエラい違いです。Debianではpostfix-policyd-spf-pythonとpostfix-policyd-spf-perlが利用できます。perlの方が設定はシンプル、pythonの方ができることが多い代わりにやや設定が複雑です。スパム除去のためにきめ細かい判定と拒否を行いたいのでpython版を使っています。127.0.0.0/8,::ffff:127.0.0.0/104,::1HELO_rejectに関してはデフォルトのままですが、Mail_From_rejectはfail判定が出た場合Rejectするようにしてしまっています。いえ~allまでしか指定していないドメインも多いので、あんまり弾ける気はしていません。ちなみに当ドメインは-allを指定しているので、未知のホストから来たメールが当ドメインを名乗った場合はここに引っかかってrejectされます。いくつかの指定したドメイン(携帯キャリア、大手フリーメールなど。~allを指定している)に関しては、Passしない限りRejectします。これでかなり多くのスパムメールを受信時にSMTPのセッション中に拒否することができます。この辺は考え方次第で、ヘッダにsoftfailを付記するだけにして、あとはMUA側の振り分けルールで対応するというのもありだとは思います。設定としては以上です。この設定でしばらく運用して、ブラックリストも充実してくるとSPAMの9割くらいはSMTPのセッション中にエラーを返すことができています。ログを見ている感じでも誤爆はほぼ皆無といっていい状況。Wheezyをインストールした後に最低限やるべきことを紹介します。別にさくらのVPSやDebi...記事を読むぼくのかんがえたさいきょうのPostfix(DKIM&DMARC編)さらに引き続きネタ。最新の送信ドメイン認証技術であるDKIMとDMARCをPostfixで使う設定を書いていきます。"Wheezy"がリリースされました。ブログを放置してますが、ちょっと琴線に触れたので。はてブのホッテントリから流れてきて、いい感じに意識が高くて素晴らし...記事を読むぼくのかんがえたさいきょうのPostfix(設計編)このブログが動いてるサーバのPostfixの設定について何回かに分けて書きます。コメントをキャンセルメールアドレスが公開されることはありません。