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

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月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

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