Postdix、DovecotでSMTPサーバー、POP3/IMAP4サーバ構築

メールサーバ設定 SMTPサーバ

次の設定は、CentOS6.2での構成になります。

CentOSで標準のsendmailからpostfixに変更します。

[root@localhost ~]# groupadd postfix
[root@localhost ~]# groupadd postdrop
[root@localhost ~]# useradd  postfix -g postfix
[root@localhost ~]# yum install postfix

メールサーバプログラムをPostfixに切り替えます。

[root@localhost ~]# alternatives --config mta
There are 2 programs which provide 'mta'.
  Selection    Command
-----------------------------------------------
*+ 1           /usr/sbin/sendmail.postfix

Enter to keep the current selection[+], or type selection number:  1

/etc/postfix/main.cf ファイルを作成。

[root@localhost ~]# vi /etc/postfix/main.cf
myhostname = mail.exsample.com //FDQNで入力
mydomain = exsample.com   
$myorigin = $mydomain //先頭の#を削除
mydestination=$myhostname, localhost.$mydomain, localhost, $mydomain
inet_interfaces = all //追加
#inet_interfaces = localhost //先頭に#を追加して無効化
home_mailbox = Maildir/ //追加  
allow_mail_to_commands = alias,forward,include //MLドライバを利用の場合追加(デフォルトでは記述はないがalias,fowardのみの設定。includeを追加するのはセキュリティ上問題有り。MLドライバを利用する場合設定する。) 
#mynetworks_style = host #を付けて無効化
mynetworks = 168.100.189.0/28, 127.0.0.0/8 //先頭の#を削除して有効化
mynetworksを有効にすると、mynetworks_styleの設定は無効化される。デフォルトではsubnetは168.100.189.0/28, 127.0.0.0/8のみを送信許可にする設定
relay_domains = $mydestination  //#を外して有効化
#sendmail_path = /usr/sbin/sendmail.postfix
sendmail_path = /usr/sbin/sendmail //cgiなどでメールサーバーを動かす場合のパスをsendmail.postfixからsendmailに変更
mailbox_command = /usr/libexec/dovecot/deliver //mailboxへの配送をdovecotにする

sendmailのパスを通すため、シンボリックリンクをとおします。

[root@localhost ~]# mv /usr/sbin/sendmail /usr/sbin/sendmail.bak
[root@localhost ~]# ln -s /usr/sbin/sendmail.postfix /usr/sbin/sendmail

最下段に次の内容を記述します。

allow_min_user = yes  //「-」で始まっているメールアドレスの配送を許可。
mailbox_size_limit = 0 //無制限の設定。
message_size_limit = 0  //無制限設定にしたほうが無難。

smtpクライアント認証を有効にします。

#以下を最終行辺りに追加
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
broken_sasl_auth_clients = yes

外部SMTPサーバーにメール中継させるには次の設定を行います。

#以下を最終行辺りに追加
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/smtp-auth-passwd
smtp_sasl_mechanism_filter = cram-md5, plain, login
#SMTPサーバ名を [ ] 内に指定
relayhost = [mail.example.com]
[root@localhost ~]# vi /etc/postfix/smtp-auth-passwd
example.jp           username:password
[root@localhost ~]# postmap /etc/postfix/isp_passwd
[root@localhost ~]# ls -la /etc/postfix/isp_passwd

次の設定はIPアドレスでのメール拒否。極力ドメイン名や差出人名で拒否設定をしないと、共用サーバーなども拒否リストに入ってしまう可能性があります。

[root@localhost ~]# vi /etc/postfix/reject_client
(拒否するIPアドレス) REJECT
[root@localhost ~]# postmap /etc/postfix/reject_client
[root@localhost ~]# ls -la /etc/postfix/reject_client.db
[root@localhost ~]# vi /etc/postfix/main.cf
smtpd_client_restrictions = permit_mynetworks,check_client_access hash:/etc/post
fix/reject_client,permit
//mynetworkは許可、rejict_client.dbに記載のIPは拒否、それ以外は許可。
[root@localhost ~]# service postfix restart

上記設定で個別にIP制限をかけます。

更にセキュアにするには/etc/postfix/main.cfに、

# HELOコマンドを要求するようにしておく。
smtpd_helo_required = yes
# ホスト名を知らないメールシステムを拒否。
#smtpd_helo_restrictions = reject_unknown_hostname //ホスト名とドメイン名が違う場合も拒否するのでホワイトリストと併用して使う方がいい。とりあえずコメントアウトして無効化。
# ホワイトリスティング: ローカルクライアントはどの配送先でも指定でき、それ以外は行わない。
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
# 送信者のドメインによる拒否
smtpd_sender_restrictions =  permit_sasl_authenticated, reject_unauth_destination, reject_unknown_sender_domain, reject_non_fqdn_sender hash:/etc/postfix/reject_sender

を追加します。

そして以下で設定を反映

[root@localhost ~]# vi /etc/postfix/reject_sender
spam@hoge.com   REJECT  //拒否するドメインやメールアドレスを入力
[root@localhost ~]# postmap /etc/postfix/reject_sender
[root@localhost ~]# ls -la /etc/postfix/reject_sender.db
[root@localhost ~]# service postfix restart

telnetで確認してみる。

[root@sake-hamaoka ~]# telnet example.com 25
Trying 111.222.333.444...
Connected to example.com (111.222.333.444).
Escape character is '^]'.
220 mail.example.com ESMTP Postfix
helo example.com  //helo ドメイン名を入力
250 mail.example.com  //250 ホスト名で返された。
quit  //退室
221 2.0.0 Bye

okのようです。

ssl通信の設定

[root@localhost ~]# cd /etc/pki/tls/certs/
[root@localhost certs]# make mail.pem
Country Name (2 letter code) [GB]:JP //国名応答
State or Province Name (full name) [Berkshire]:Tokyo //都道府県名応答
Locality Name (eg, city) [Newbury]:Shinjuku //市区町村名応答
Organization Name (eg, company) [My Company Ltd]://会社名など
Organizational Unit Name (eg, section) []: //空ENTER
Common Name (eg, your name or your server's hostname) []:mail.example.com //メールサーバー名応答
Email Address []:postmaster@example.com //メールアドレス入力
[root@localhost certs]# chmod 400 mail.pem

[root@localhost certs]# cd
[root@localhost ~]# vi /etc/postfix/main.cf
最終行くらいに以下の内容を入力
smtpd_use_tls = yes
smtpd_tls_loglevel = 1
smtpd_tls_cert_file = /etc/pki/tls/certs/mail.pem
smtpd_tls_key_file = /etc/pki/tls/certs/mail.pem
smtpd_tls_session_cache_database = btree:/etc/postfix/smtpd_scache
tls_random_source = dev:/dev/urandom
tls_daemon_random_source = dev:/dev/urandom

[root@localhost ~]# vi /etc/postfix/master.cf
submission inet n       -       n       -       -       smtpd #587番ポートの設定
#  -o smtpd_enforce_tls=yes
 -o smtpd_sasl_auth_enable=yes #SMTP認証の有効化
 -o smtpd_client_restrictions=permit_sasl_authenticated,reject #クライアントの接続制限
以下の3行の先頭の#を外してssl通信の有効化
smtps     inet  n       -       n       -       -       smtpd
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
[root@localhost ~]# service postfix restart
postfix を停止中:                                          [  OK  ]
postfix を起動中:                                          [  OK  ]
[root@localhost ~]# chkconfig postfix on

アカウントの設定。

[root@localhost ~]# adduser -s /sbin/nologin アカウント名 //メールのユーザーを追加
[root@localhost ~]# saslpasswd2 -u ホスト名 アカウント名 #例:saslpasswd2 -u exsample.com admin
Password:(パスワード)
Again (for verification):(パスワード)
// さらに作成した認証用アカウントの情報をpostfixが参照できるように、以下のコマンドを実行します。
[root@localhost ~]# chgrp postfix /etc/sasldb2
[root@localhost ~]# chmod 640 /etc/sasldb2
[root@localhost ~]# yum -y install cyrus-sasl-md5  //インストールされていなかったら入れる。

[root@localhost ~]# vi /usr/lib64/sasl2/smtpd.conf //CentOS32ビット版は/lib/ディレクトリです。
#以下を追加。ssl(tls)通信を使わないならplainとloginを外したほうが良いみたいです。但しメールソフトによっては暗号化パスワードに対応してないのもあるみたいです。
mech_list: plain login cram_md5 digest-md5 ntlm
[root@localhost ~]# service postfix restart
[root@localhost ~]# service saslauthd restart
[root@localhost ~]# chkconfig saslauthd on

例:ホスト名→exsample.com アカウント名→admin

saslパスワードによる認証

SMTP_AUTH で使用するパスワードをsaslパスワード(/etc/sasldb2)で行う方法を示します。こちらの方法ならUNIXパスワードとは別のパスワードを使用することができます。

[root@localhost ~]# service saslauthd stop
[root@localhost ~]# chkconfig saslauthd off

この場合はsaslauthdは利用しないのでストップさせます。そして次のようにsmtp.confを設定変更します。

※CentOS6よりパスが変わりました。

[root@localhost ~]# chgrp postfix /etc/sasldb2 //所有者をpostfixに。
[root@localhost ~]# vi /etc/sasl2/smtpd.conf  
pwcheck_method: auxprop

続いて、パスワードデータベースを作成します。

[root@localhost ~]# saslpasswd2 -u ホスト名 -c アカウント名 
例:saslpasswd2 -u mail.example.com -c admin  

登録内容を確認。

[root@localhost ~]# sasldblistusers2

パスワードの削除は次のようにします。

[root@localhost ~]# saslpasswd2 -d -u ホスト名 アカウント名 

エイリアスの設定。よく使うメールアカウントを通常のメールアカウントにする設定です。以下はアカウントinfoを有効にする設定です。infoの前に#を入力します。

[root@localhost ~]# vi /etc/aliases
#info:          postmaster
root: user #rootあてメールはuserという特定ユーザーに送られる設定です。
[root@localhost ~]# newaliases

バーチャルドメイン設定

[root@localhost ~]# vi /etc/postfix/main.cf
virtual_alias_domains = example.jp,example.net
virtual_alias_maps = hash:/etc/postfix/virtual
※ファイルの一番下に上記を追記。example.jpなどのドメインをカンマ区切りで入力
※warning回避のため以下を記述
parent_domain_matches_subdomains = debug_peer_list, fast_flush_domains, mynetworks, permit_mx_backup_networks, qmqpd_authorized_clients, smtpd_access_maps

[root@localhost ~]# service postfix restart
[root@localhost ~]# vi /etc/postfix/virtual
※最下段に設定を入力
postmaster@example.com  postmaster
user1@example.com  user1
user2@example.com  user2
user1@example.jp  user1,****@gmail.com
@example.com user1 #example.comのオールアドレスをuser1のメールボックスに入れる設定

上記の設定は一例です。適宜環境に合わせて設定していきます。

[root@localhost ~]# postmap /etc/postfix/virtual
[root@localhost ~]# ls -l /etc/postfix/virtual

上記のコマンドで設定を実行します。

システムユーザーをメールのアカウント名に使う場合

rootやapacheなどのシステムユーザーのメールアカウントを作る場合は次の通りです。

[root@localhost ~]# echo "パスワード" | saslpasswd2 -p -u example.com -c システムユーザー名
[root@localhost ~]# mkdir -p /etc/skel/Maildir/{new,cur,tmp} ← 新規ユーザ追加時に自動でMaildir形式メールボックス作成

[root@localhost ~]# chmod -R 700 /etc/skel/Maildir/ ← メールボックスパーミッション設定

DovecotでPOP3/IMAP4サーバ構築

[root@localhost ~]# yum install dovecot[root@localhost ~]# service dovecot start
Dovecot Imap を起動中: Error: Login user doesn't exist: dovecot
Fatal: Invalid configuration in /etc/dovecot.conf
                                                           [失敗]

起動に失敗しました。dovecotユーザーを作成してください、とあるので
[root@sakuemon ~]# useradd  dovecot 
useradd: グループ dovecot は存在します - もしこのユーザをそのグループへ追加するには, -g  を利用してください.

と表示される。

[root@localhost ~]# cd /var/log
[root@localhost log]# grep dovecot *

logを見ても原因が分からず。

再インストールを試みました。

[root@localhost ~]# yum remove dovecot
[root@localhost ~]# yum install dovecot
[root@localhost ~]# service dovecot start
Dovecot Imap を起動中: Error: Login user doesn't exist: dovecot
Fatal: Invalid configuration in /etc/dovecot.conf
                                                           [失敗]

起動に失敗する原因が分からない。

[root@localhost ~]# useradd  dovecot -g dovecot
[root@localhost ~]# service dovecot start
Dovecot Imap を起動中:                                     [  OK  ]

動いた!

[root@localhost ~]# rm /etc/pki/dovecot/private/dovecot.pem 
rm: remove regular file `/etc/pki/dovecot/private/dovecot.pem'? y
[root@localhost ~]# rm /etc/pki/dovecot/certs/dovecot.pem  
rm: remove regular file `/etc/pki/dovecot/certs/dovecot.pem'? y

既存の秘密キー、証明書を削除。これを使っても一応動くそうですけど、メール送信時変なことになるそうです。


$ cd /etc/pki/tls/certs
$ openssl req -new -x509 -nodes -days 365 -out mail.crt -keyout mail.key
Generating a 1024 bit RSA private key
....++++++
.......................................................++++++
writing new private key to 'mail.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:
State or Province Name (full name) [Berkshire]:
Locality Name (eg, city) [Newbury]:
Organization Name (eg, company) [My Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:www9999u.sakura.ne.jp
Email Address []:
$chmod 600 mail.key

Dovecotの設定

上記で作ったセルフ証明書は必要なかったです。make mail.pemで作ったものでOKだったようです。

[root@localhost ~]# vi /etc/dovecot/conf.d/10-ssl.conf
ssl_cert_file = </etc/pki/tls/certs/mail.pem  //先頭の#を削除して先に作ったssl用ファイルを指定
ssl_key_file = </etc/pki/tls/certs/mail.pem  //先頭の#を削除して先に作ったssl用ファイルを指定
[root@localhost ~]# vi /etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:%h/Maildir //先頭の#を削除して%h/Maildirを付与
自動起動設定
[root@localhost ~]# chkconfig dovecot on
再起動して設定を反映
[root@localhost ~]# service dovecot restart
Dovecot Imap を停止中:                                     [  OK  ]
Dovecot Imap を起動中: Error: Can't use SSL certificate /etc/pki/dovecot/certs/dovecot.pem: No such file or directory
Fatal: Invalid configuration in /etc/dovecot.conf
                                                           [失敗]

また失敗。ググッてみたらしままる@はてな様の設定方法でうまくいきました。

[root@localhost ~]#  vi /etc/dovecot/dovecot.conf // CentOS6からパスが変わりました。
ssl_disable = no  //sslを使用するのでnoにする
[root@localhost ~]# service dovecot restart
Dovecot Imap を停止中:                                     [失敗]
Dovecot Imap を起動中:                                     [  OK  ]

デフォルトから設定変更

[root@localhost ~]# vi /etc/dovecot/dovecot.conf
# 31行目:変更 ( IPv6をリスンしない場合 )
listen = *
[root@localhost ~]# vi /etc/dovecot/conf.d/10-auth.conf
# 9行目:コメント解除し変更(プレーンテキスト認証も許可する)
disable_plaintext_auth = no
# 97行目:追記
auth_mechanisms = plain login
[root@localhost ~]# vi /etc/dovecot/conf.d/10-mail.conf
# 30行目:コメント解除して追記
mail_location = maildir:~/Maildir
[root@localhost ~]# vi /etc/dovecot/conf.d/10-master.conf
# 84-86行目:コメント解除し追記
# Postfix smtp-auth
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix # 追記
group = postfix # 追記
}
[root@localhost ~]# vi /etc/dovecot/conf.d/10-ssl.conf
ssl_cert = /etc/pki/tls/certs/mail.crt
ssl_key = /etc/pki/tls/certs/mail.key

自動起動設定

[root@localhost ~]# chkconfig dovecot on

起動成功!しままる@はてな様ありがとうございます。

SSL証明書をクライアントPCにインストール。

[root@localhost ~]# cd /etc/pki/tls/certs
[root@localhost certs]# (cat server.crt ; cat server.key) > mail.pem
[root@localhost certs]# openssl x509 -in mail.pem -outform DER -out mail.der
[root@localhost certs]# cp mail.der /var/www/html 証明書を公開ディレクトリに移動

FTPソフトなどでダウンロードして、ローカル環境に証明書をインストールします。

ダウンロードした証明書をダブルクリックすると、インストールのウイザードが開きますので、次へ、OKなどでウイザードを進めていくと、ローカルPCにインストールされます。

あとはOutlookなどのメールクライアントソフトにSSLの設定を行います。

ちなみにですが、ローカルPCのOSに最初からインストールされている認証局のSSL証明書なら、わざわざクライアント側にインストールする必要がありません。

つまりオレオレ証明書ではなく有償の証明書なら上記のような手順でローカル環境に証明書をインストールする必要がありません。

CentOS5にSSL証明書をインストールする手順で取得したSSL証明書を、以下の手順でメールサーバーにも反映させます。

[root@localhost ~]# cd /etc/pki/tls/certs
[root@localhost certs]# mail.pem
[root@localhost certs]# cp /etc/httpd/conf/ssl.crt/server.crt  server.crt
[root@localhost certs]# cp /etc/httpd/conf/ssl.key/server.key  server.key
[root@localhost certs]# (cat server.crt ; cat server.key) > mail.pem //右コマンドでmail.pemを作成
[root@localhost certs]# rm server.crt
[root@localhost certs]# rm server.key

これでいちいちローカルのPCの設定をしなくてよくなりました。

もし、メールの送受信がうまくいかない場合。

[root@localhost ~]# postfix check

上記コマンドでmain.cfの構文エラーなどがチェックできます。何も構文エラーが無ければ、何も表示されません。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です