ラベル Postfix の投稿を表示しています。 すべての投稿を表示
ラベル Postfix の投稿を表示しています。 すべての投稿を表示

2015年3月8日日曜日

【Postfix】【Dovecot】メールサーバにSMTP-AUTH(送信メール認証)を実装する

先日、クイックセットアップについて記載しました。

メールサーバのクイックセットアップ①
メールサーバのクイックセットアップ②

ここから1つずつ認証や暗号化等の設定を追加していきます。

なお、主な環境は以下の通りです。

OS : CentOS6.5
MTA : postfix2.6.6
MRA : dovecot2.0.9

まずは、SMTP-AUTH(送信メール認証)機能を追加します。

※2016/05/06 一部加筆

設定の前に、SMTP-AUTHについて、(自分の頭の整理のために)ざっと説明します。

  • もともとメールシステムは、SMTPサーバを使って、誰でも匿名で、自由にメールを送信することができた。(そもそもコンピュータを使用する人自体が極端に限られていたので、悪意を持ったメールを送信する事自体が想定されていなかった。)
  • コンピュータの普及に伴いスパムメール送信や、不正中継の悪用等が増え、対策が必要になった。
  • その対策の1つとして認証機能があり、メールを送信するためには、「ユーザ名」「パスワード」を用いてログインすることが求められる。
  • サーバ管理者の立場からすると、第三者が自分のメールサーバを不正に使用することを防止できる。

以下、具体的な設定方法に移ります。

まず、SMTP-AUTHの実装には、認証システムを提供するライブラリ=SASLが必要となります。SASLにはCyrus-SASLとDovecot-SASLがありますが、ここではDovecot-SASLを用います。

Dovecot-SASLを用いるので、Postfixだけでなく、Dovecotについても、設定の変更が必要になります。


① Postfixの設定


1.PostfixがDovecot-SASLライブラリに対応しているか確認
  # postconf -a
  (Dovecot と返ってくればOK)

2./etc/postfix/main.cf の末尾に、次のパラメータを追記
 ・smtpd_sasl_type = dovecot
  ⇒ SASLプラグインタイプの設定

 ・smtpd_sasl_auth_enable = yes
  ⇒ SASL認証を有効にする

 ・smtpd_sasl_path = private/auth
  ⇒ 認証ソケットファイルの場所(/var/spool/postfixからの相対パス)。
    ソケットファイルはDovecotを再起動すると自動で作成される。

 ・smtpd_recipient_restrictions = permit_mynetworks,
                      permit_sasl_authenticated,
                      reject_unauth_destination
  ⇒ 認証を通過すればリレーを許可する設定を追記
    mynetworks 以外のネットワークからも、メール送信が可能になる。

以下2つはオプションで。

 ・broken_sasl_auth_clients = yes
  ⇒ SASL認証で[AUTH=PLAIN]を使っているクライアントソフト(古いOutlook等)
     での認証を可能とする。

 ・smtpd_sasl_authenticated_header = yes
  ⇒ Received:フィールドに認証されたユーザ名を表示

3.Postfixの設定を読み込む。
 # postfix reload


② Dovecotの設定


1./etc/dovecot/conf.d/10-auth.conf
 ・auth mechanisms = plain login
  ⇒ 平文パスワードを利用する。

2./etc/dovecot/conf.d/10-master.conf
 ・unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}




3.Dovecotを再起動
 # service dovecot restart


③ telnet でログインテストしてみる。


1.準備
 ログインには、ユーザ名、パスワードをBase64でエンコードした文字列を用いる。
 下記の様にをBase64でエンコードする。
$ perl -MMIME::Base64 -e 'print encode_base64("ユーザ名\0ユーザ名\0パスワード”);’
 エンコードされた文字列が出力される。

2.telnet で25番ポートに接続

 telnet localhost 25

 Trying ::1...

 Connected to localhost.

 Escape character is '^]'.

 220 mail.○○○○.mydns.jp ESMTP Postfix

 EHLO mail.○○○○.mydns.jp  (← 『EHLO ホスト名』を入力)

 250-mail.○○○○.mydns.jp
 250-PIPELINING
 250-SIZE 10240000
 250-VRFY
 250-ETRN
 250-AUTH PLAIN
 250-AUTH=PLAIN
 250-ENHANCEDSTATUSCODES
 250-8BITMIME
 250 DSN
 AUTH PLAIN エンコードされた文字列 (←AUTH PLAIN に続いてエンコードされた文字列を入力)
 235 2.7.0 Authentication successful (←ログイン成功!)
 QUIT
 221 2.0.0 Bye
 Connection closed by foreign host.

※手順通りにやっても正常にログインできない事象が発生。パスワードが数字から始まるとダメみたい。
(参考:postfixでsmtpログイン出来ない)
但し、ThunderBirdからは正常にログイン&メール送信が可能。

④ ThunderBird で確認してみる。


  送信サーバの設定をして、認証方式を『平文のパスワード認証』に設定する。


 メール送信時にパスワードが求められるようになった。


 (パスワードマネージャにパスワードが保存されていたら、入力は求められない。
  テストしたい場合はパスワードマネージャから一旦削除する。)

 また、クイックセットアップの段階では“Relay access denied” で、メール送信に失敗
 していた場合でも、smtpd_recipient_restrictions に permit_sasl_authenticated が
 追加されたため、メール送信可能に。

2015年3月6日金曜日

【Postfix】【myDNS】Gmail宛のメールが550, "5.7.1"エラーで届かない場合の対処

自サーバーのPostfixを使ってメール送信すると、gmailアドレス宛のメールが受信拒否されてしまいました。

エラーの内容は、こちらです。
550, "5.7.1", Our system has detected that this message is likely unsolicited mail. To reduce the amount of spam sent to Gmail, this message has been blocked. For more information, review this article.(550, "5.7.1", このメッセージはシステムによって未承諾メールであると検出されました。Gmail に送信されるスパムの量を減らすために、このメッセージはブロックされています。詳細については、こちらの記事をご覧ください。)
google SMTP エラー リファレンス から引用
ちょっとググってみたところ、SPFレコードが登録されていない事が原因の様です。
参考(Postfixから送信したメールがGmailに届かないGmail相手に迷惑メール扱いされる場合(SPFレコードのIPv6対応)

myDNSを使っていれば、SPFレコードは自動生成されます。
では、何故届かなかったかというと、私がAレコードしか登録しておらず、かつ両サーバがIPv6に対応していたのが原因の様です。

MyDNSでは、

Aレコード登録 → IPv4のSPFレコード
AAAAレコード登録 → IPv6のSPFレコード

が、自動生成されるみたいです。

また、両サーバがIPv6に対応してる状態では、IPv6のアドレスで処理されるらしいので、Aレコードしか登録していない場合は、SPFレコードが無い状態になってしまいます。

解決方法としては、こちら側のサーバをIPv6を使わない設定(inet_protocols = ipv4)にするか、
MyDNSにAAAAレコードも設定して、IPv6のSPFレコードについても自動生成してもらえばOKです。


私の環境では、これで正常に届くようになりました。


2015年3月5日木曜日

【CentOS6.5】【Postfix】【Dovecot】メールサーバのクイックセットアップ②

その①から続いて、

③ Dovecotの設定


/etc/dovecot/conf.d/10-mail.conf

     mail_location = maildir:~/Maildir

       (/etc/postfix/main.cfの設定がMailboxだった場合は、
    mail_location = mbox:~/mail:INBOX=/var/mail/%u
         その場合、/var/mail/%uのアクセス権限を変更する必要あり)

/etc/dovecot/conf.d/10-auth.conf

     disable_plaintext_auth = no

       平文でのパスワード認証を禁止するか設定
       テストの段階では、暗号化はしないのでとりあえずnoに設定

Dovecot を起動(既に動いていれば、再起動)する。
# service dovecot start

④ telnetで接続して動作確認してみる。


Dovecot(POPサーバ)への接続

→ ログイン&受信メールの確認をしてみる。
→ 予め『testuser』というユーザ用のアカウントを作成し、パスワードも付与。
  # useradd testuser
    # passwd testuser

 $ telnet localhost 110
 Trying ::1...
 Connected to localhost.
 Escape character is '^]'.
 +OK Dovecot ready.
 USER testuser  (←『 USER サーバのユーザアカウント』 を入力)
 +OK
 PASS xxxxxx  (←『 PASS アカウントのパスワード』 を入力)
 +OK Logged in.
 LIST (←受け取ったメールを確認する)
 +OK 3 messages: (← 予めメールを送っておけば、届いているのが確認できる)
 1 1060 (← 3通のメールが届いている)
 2 1113
 3 1852.
 TOP 1 (←1番目のメールのヘッダを表示)
 (省略)
 RETR 1 (←1番目のメールのボディを表示)
 (省略)
 QUIT  (← telnet から抜ける。)
 +OK Logging out.
 Connection closed by foreign host.

Postfix(SMTPサーバ) への接続

→ メールを送信してみる。

 $ telnet localhost 25
 Trying ::1...
 Connected to localhost.
 Escape character is '^]'.
 220 mail.xxx.mydns.jp ESMTP Postfix
 EHLO mail.xxx.mydns.jp (← 『EHLO ホスト名』を入力)
 250-mail.xxx.mydns.jp
 250-PIPELINING
 250-SIZE 10240000
 250-VRFY
 250-ETRN
 250-ENHANCEDSTATUSCODES
 250-8BITMIME
 250 DSN
 MAIL FROM:<testuser@xxx.mydns.jp> (← 『MAIL FROM:<送信元アドレス>』を入力) 
 250 2.1.0 Ok
 RCPT TO:<送信先のメールアドレス> (← 『RCPT TO:<送信先のメールアドレス>』を入力)
 250 2.1.5 Ok
 DATA
 354 End data with <CR><LF>.<CR><LF>
 Test (←メール本文を入力する)
 . (←メール本文を終了する)
 250 2.0.0 Ok: queued as 860ADBF609
 QUIT  (← telnet から抜ける。)
 221 2.0.0 Bye
 Connection closed by foreign host.

⑤ MUA(Thunderbird)を使って送受信してみる。


ツール > アカウント設定 > アカウント操作 > メールアカウントを追加

メールアドレスは、『 ユーザアカウント@mydomain 』
パスワードは、アカウントのパスワード


続けるを押下した後、手動設定


サーバのホスト名等を入力して、再テスト → 完了


セキュリティ警告が出てくるが、取り敢えず了解しておく。

試しに他のメールアカウントと送受信してみる。 

受信は問題なく行えるはずだが、送信に関しては、私の様にVPSを使って外部のネットワーク
から接続している場合、“Relay access denied” となって、送信に失敗する。

これは、/etc/postfix/main.cf がデフォルトで

smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination
(この設定はmain.cfには記入されていないが、postconf -d コマンドで確認できる)

と設定されており、外部ネットワークからのリレーを許可しないからだ。
送信メール認証の設定後、下記の様に設定変更すれば、送信可能になる。

smtpd_recipient_restrictions = permit_mynetworks,
                                                  permit_sasl_authenticated,
                                                  (認証を通過すればリレーを許可)
                                                  reject_unauth_destination

※VPSではなく自宅のサーバでも同様の事象が起こったので、上記の説明は誤っている可能性が高い。但し、自宅サーバでも認証設定後には正常に送信できた。(2016/05/06追記)

この段階で、どうしても送信テストしたい場合は、main.cf のmynetworks に、MUAを使うクライアントのIPアドレスを追加してやれば送信できる。ただし、ダイナミックIPアドレスの場合、IPアドレスが変わってしまうので、一時的なテストに留めておいた方が良いと思う。

最小限の設定は以上。
ここから、暗号化や認証等の設定を追加していく。

【CentOS6.5】【Postfix】【Dovecot】メールサーバのクイックセットアップ①

メールサーバの再セットアップも、ひと通り終わったので、設定についてメモしておく事にした。

(※2016/05/06 一部加筆)


まずは最小限の設定で、『これだけやっておけば外部とメールが送受信できる』というところまで、
設定する。

ここまでできれば、ネットワークやiptables等の、メールソフト以外の設定には問題ない事が分かるので、後ほど認証や暗号化等の設定を追加した際にも、問題の切り分けがしやすい、はず。

環境は以下の通り。

OS : CentOS6.5
MTA : postfix2.6.6
MRA : dovecot2.0.9
MUA : Thunderbird
DNS : myDNS

ドメイン名(例) = xxx.mydns.jp (xxxは伏せ字
ホスト名(例) = mail.xxx.mydns.jp (xxxは伏せ字


  • 名前解決にはダイナミックDNSサービスの MyDNS を使っているので、下記のMXレコードの設定前に、登録と初期設定を行っておく必要がある。
  • また、ポート開放についてもここでの説明は割愛しているが、適宜サーバのiptablesやファイアウォールの設定を事前に行う必要がある。


① myDNSの設定


MXレコードとAレコードに、メールサーバのホスト名を入力する。
(他に、IPアドレスの設定は事前にやっておく)

※MXレコードの欄は、FQDNで登録しないとうまく動作しなかった。



② postfixの設定

postfixの設定ファイル 『/etc/postfix/main.cf』 の下記項目を編集する。
なお、デフォルト値はpostconf -d で確認できる。

myhostname = mail.xxx.mydns.jp

        メールサーバのホスト名(FQDN)を記入。
        DNSのMXレコード、Aレコードの設定と一致させる。

      myorigin = $mydomain (行頭の"#(コメントアウト)"を外す)

        送信メールに付加される送信元アドレスの@以降の形式を指定
        (myhostname か mydomain)。
        mydomainに設定することで、送信元メールアドレスは、foo@xxx.mydns.jpになる。

inet_interfaces = all

        外部のメールサーバから送られてくるメールを受け取る。

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

        他のメールサーバに転送を行わない(=このメールサーバが受信する)ホスト、ドメイン
        を指定する。$mydomain を含めておくことで、foo@xxx.mydns.jp宛のメールを受信できる。

      home_mailbox = Maildir/ (または Mailbox)を指定

        メールを保存する場所を設定。
        Mailbox 形式は、全てのメールを1つのファイルに保存する。
        Maildir/ 形式は、1つのメール=1つのファイルになる。パフォーマンスやセキュリティ等、
        Maildir/ の方が優れている、らしい。

         Mailbox を指定した場合は、さらにメールスプールディレクトリを指定する。
         → (mail_spool_directory = /var/mail または /var/spool/mail)

   ※Maildir/ ディレクトリは、各ユーザのホームディレクトリ配下に自動で生成される。   

以下は基本的にはデフォルト値のままでもいいが、場合によっては変更する。

      mydomain = xxx.mydns.jp

        何も指定しなければ、myhostnameの最初の".(ドット)"までが削除された値が指定される。
        myhostname = mail.xxx.mydns.jp であれば自動的に mydomain = xxx.mydns.jp となる。
        (ホスト名がaaa.bbb.xxx.mydns.jp のような場合は変更する)
      

      mynetworks_style = subnet

      mynetworks = aaa.bbb.ccc.0/dd(自ホストのネットワーク), 127.0.0.0/8(自ホスト)

        メールサーバを利用可能なクライアントのネットワークを設定。
        上記は両者とも自ホストと、自ホストのネットワークを指定している。
        両方記載した場合には、mynetworks が優先される。
        (自ホストのネットワークを明示したい場合には、mynetworksに記載する。)



inet_interfaces を変更した際はreloadではなく再起動が必要。
main.cf の編集後、忘れずにpostfixを再起動させる。

# service postfix restart

長くなってきたので、次回に続く