実践Linux
CentOS7 CentOS7 目次へ TOP(HOME)へ
Mailサーバー(dovecot & postfix) 2016年6月
333.333.333.210(ns1.my-dom.xxx)にはDNSで別名mail.my-dom.xxxが設定されているものとする。
さらに、新しいドメインnew-dom.xxxも追加され、別名mail.new-dom.xxxが設定されているものとする。(こちらを参照)
設定については、外部からの送信要求を想定し、バーチャルメールボックスとSMTP/Submission Over SSL/TLSを使用した設定にする。CentOS5/6.5参照。
SMTP認証(SMTP-AUTH)には、SASLライブラリを用いて実現する。Cyrus-SASLとDovecot SASLというライブラリが主に利用されるが、PostfixとDovecotは親和性が高いので、Dovecot SASLを利用する=Dovecotとアカウントを共用できる。
PostfixがDovecot SASLライブラリに対応しているか確認
# postconf -a dovecotが表示されればOK
dovecotの設定
/etc/dovecot/dovecot.conf
protocols = pop3
listen = * デフォルトの「listen = *, ::」を変更。IPv6の設定をとる。
!include conf.d/*.conf
/etc/dovecot/conf.d/10-ssl.conf
ssl = yes 強制する場合は、ssl = required
ssl_cert = </etc/pki/dovecot/certs/dovecot.crt
ssl_key = </etc/pki/dovecot/private/dovecot.key
/etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:/var/spool/mail/vhosts/%u/Maildir
/etc/dovecot/conf.d/15-lda.conf (dovecotがエラーメールを送信するとき使用するアドレスの設定)
postmaster_address = postmaster@mail.my-dom.xxx
/etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = no Plaintextでの認証の有効化 10行目
auth_mechanisms = plain login cram-md5 平文パスワードと暗号化パスワード 100行目
#!include auth-system.conf.ext コメントアウト(これは使わない=pam認証を無効にする)
!include auth-passwdfile.conf.ext コメントアウトをはずす(こちらを使う)
/etc/dovecot/conf.d/auth-system.conf.ext(これは使わない)
passdb {
driver = pam
}
userdb {
driver = passwd
}
/etc/dovecot/conf.d/auth-passwdfile.conf.ext(こちらを使用)
passdb {
driver = passwd-file
#args = scheme=CRYPT username_format=%u /etc/dovecot/users コメントアウト
args = /etc/dovecot/passwd 追加
}
userdb {
driver = passwd-file
#args = username_format=%u /etc/dovecot/users コメントアウト
args = /etc/dovecot/passwd 追加
}
CRYPTは、/etc/passwd、shadowなど、従来の DES で暗号化されるパスワード形式です。
●Dovecot用証明書の作成
既存の/etc/pki/dovecot/certs/dovecot.pem、/etc/pki/dovecot/private/dovecot.pemを使ってもよいかもしれないが、ここでは作り直す。
# cd /etc/pki/tls/certs
Makefileの編集 有効期限が365日に設定されているので、-days 365を3650(10年)等に変更しておく。3カ所ある。
# make dovecot.crt 名称はなんでもよい
パスフレーズの入力(2回)。秘密鍵を暗号化するために利用される。
再度、パスフレーズの入力(3回目)。
証明書の情報を入力。(適当に入力)
国名
都道府県名
市区名
組織名
部署名
サーバーFQDN名
監理者のメールアドレス
以上で、サーバーの秘密キー(/etc/pki/tls/certs/dovecot.key)と証明書(/etc/pki/tls/certs/dovecot.crt)が作成される。
これらを/etc/pki/dovecot/certs/、/etc/pki/dovecot/private/に移動しておく。
# mv /etc/pki/tls/certs/dovecot.key /etc/pki/dovecot/private/
# mv /etc/pki/tls/certs/dovecot.crt /etc/pki/dovecot/certs/
秘密鍵からのパスフレーズの削除
# cd /etc/pki/dovecot/private
# mv dovecot.key dovecot.key.org
# openssl rsa -in dovecot.key.org -out dovecot.key
# chmod 700 dovecot.key
●virtualグループとユーザーの作成
# groupadd -g 5000 virtual
# useradd -g 5000 -u 5000 -s /sbin/nologin -d /var/spool/mail/vhosts virtual
●パスワードファイル /etc/dovecot/passwdの作成
ここでは暗号化したパスワードを使う。
まず、パスワードを決めて(tarou@my-dom.xxxとhanako@my-dom.xxxのパスワード)、doveadmコマンドで暗号化。
(# doveadm pw -s 認証スキーム。スキームを省くとCRAM-MD5になる。スキームの種類は、# doveadm pw -l)
# doveadm pw
{CRAM-MD5}abcdefg・・・・・・・・・・・・・・・・・・・・・ これをコピーして/etc/dovecot/passwdに貼り付ける
/etc/dovecot/passwdの作成 (dovecot.confを-aオプション付きでコピーして作成するとよい。権限、Selinuxを引き継げる。)
hanako@new-dom.xxx:{CRAM-MD5}hijklmn・・・・・・・・・・・・・・・・・・・・:5000:5000::/var/spool/mail/vhosts/hanako@new-dom.xxx/Maildir
(ユーザー名):{CRAM-MD5}abcdefg123456....:(uid):(gid):::::(メールボックスへのパス)
ディレクトリパスはメールディレクトリ名の"Maildir"まで必要です。
これで、tarou@my-dom.xxx等のアカウント名を使って、指定ディレクトリのメールを取りに行けるようになる。
firewalldの設定
ポート995(POPS)を開ける。
trustedゾーンに対しては、必要ない。
externalゾーンの設定
# firewall-cmd --get-services 定義されているサービス一覧
/usr/lib/firewalld/services/pop3s.xmlをみると、これが995ポートであることがわかる。
# firewall-cmd --list-service --zone=external
# firewall-cmd --add-service=pop3s --zone=external
# firewall-cmd --add-service=pop3s --zone=external --permanent
dovecotサービスの起動
# systemctl --type=service list-unit-files インストールされたサービス一覧
# systemctl --type=service list-units | grep dovecot 実行中のサービスにdovecotがあるか
# systemctl start dovecot
# systemctl enable dovecot
dovecotの設定つづき(PostfixでDovecot SASL認証を利用できるようにする)
/etc/dovecot/conf.d/10-master.conf
# auth_socket_path points to this userdb socket by default. It's typically
# used by dovecot-lda, doveadm, possibly imap process, etc. Its default
# permissions make it readable only by root, but you may need to relax these
# permissions. Users that have access to this socket are able to get a list
# of all usernames and get results of everyone's userdb lookups.
unix_listener auth-userdb {
#mode = 0600
#user =
#group =
}
# Postfix smtp-auth 以下を編集
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}
# Auth process is run as this user.
#user = $default_internal_user
}
Dovecotを再起動すると、/var/spool/postfix/private/authが作成される。
Postfixの設定
/etc/postfix/main.cfを編集・追加
mydomain = my-dom.xxx
myorigin = $myhostname
inet_interfaces = all localhostになっていたらallに変更する。
inet_protocols = all または、ipv4
mydestination = $myhostname, localhost.$mydomain, localhost
mynetworks = 192.168.7.0/24, 127.0.0.0/8
home_mailbox = Maildir/
バーチャルメールボックス形式ではmydestinationには取得したドメイン関係は基本的には指定しない。(virtual_mailbox_domainsに指定。)
「mydestination = $myhostname, localhost」は、エラーメッセージなど内部メールの受け取り用。
############################ Dovecot SASLを利用した認証 ####################################
smtpd_sasl_auth_enable = yes SASL認証を有効にする
smtpd_sasl_authenticated_header = yes 認証されたユーザー名を表示する(必須ではない)
broken_sasl_auth_clients = yes OutlookExpress4等のSASL認証「AUTH=PLAIN」でも利用できるようにする
smtpd_sasl_type = dovecot SASLプラグインタイプ
smtpd_sasl_path = private/auth 認証ソケットファイル(Postfixのキューディレクトリ/var/spool/postfixからの相対パス[/etc/postfix/main.cf queue_directory=/var/spool/postfix]。先のようにdovecot.confを変更してdovecotを再起動するとこのファイルが作成される。このソケットをDovecotとPostfixで共有することで、ユーザアカウントを共用できるようになる。)
############################ TLS暗号化 ####################################
smtpd_use_tls = yes TLSを使用する
#smtpd_enforce_tls = yes TLSを使用できないクライアントを拒否する場合。ここではコメントアウト。master.cfのsubmissionの方でTLS強制にし(587使用に対してのみ強制)、ポート25使用に対しては強制しないようにする。
smtpd_tls_loglevel = 1 ログレベルの設定
smtpd_tls_cert_file = /etc/pki/tls/certs/postfix.crt 証明書を指定
smtpd_tls_key_file = /etc/pki/tls/private/postfix.key 秘密鍵を指定
#smtpd_tls_CAfile = /etc/pki/CA/cacert.pem 認証局によるCAファイルの場合
smtpd_tls_session_cache_database = btree:/etc/postfix/smtpd_scache 接続キャッシュファイル
smtpd_tls_session_cache_timeout = 3600s キャッシュの保存時間
############################ リレー許可 ####################################
smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination
smtpd_recipient_restrictions = のデフォルトは、smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination
つまり、デフォルトでは$mynetworksにマッチするものしかリレーは許可されていない。
ここに"permit_sasl_authenticated"を追加することによって、SMTP認証を通過したものはリレーが許可されるようになる。
############################ バーチャルメールボックス ####################################
virtual_mailbox_domains = $mydomain, new-dom.xxx バーチャルメールボックスを利用するドメインを指定
virtual_mailbox_base = /var/spool/mail/vhosts バーチャルメールボックスの場所を指定 。バーチャルメールボックスはこのフォルダ配下になる。
virtual_mailbox_maps = hash:/etc/postfix/vmailbox メールアドレスとそれに対する配送先を記したテーブル
virtual_minimum_uid = 5000 virtual_uid_mapsから受け取るuidの最小値
virtual_uid_maps = static:5000 配送エージェントがメールボックスの書き込みに使用するユーザーID
virtual_gid_maps = static:5000 配送エージェントがメールボックスの書き込みに使用するグループID
#virtual_alias_domains = これは指定しない
virtual_alias_maps = hash:/etc/postfix/virtual 転送リスト
virtual_mailbox_domainsに指定したドメインはmydestinationやvirtual_alias_domainsには指定しないように注意。
SMTP/Submission Over SSL/TLS ポート587番を使用(ここではポート25も利用できるようにしておいた)
/etc/postfix/master.cf 16行〜
#smtp inet n - n - 1 postscreen
#smtpd pass - - n - - smtpd
#dnsblog unix - - n - 0 dnsblog
#tlsproxy unix - - n - 0 tlsproxy
submission inet n - n - - smtpd ←ポート587用
# -o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt TLSを強制使用する
-o smtpd_sasl_auth_enable=yes SASL認証を有効にする
# -o smtpd_reject_unlisted_recipient=no
# -o smtpd_client_restrictions=$mua_client_restrictions
# -o smtpd_helo_restrictions=$mua_helo_restrictions
# -o smtpd_sender_restrictions=$mua_sender_restrictions
-o smtpd_recipient_restrictions=permit_sasl_authenticated,reject SASL認証できないクライアントは拒否
# -o milter_macro_daemon_name=ORIGINATING
?o に後ろは、Submission ポートでメールを受け付けたときに Postfix に渡すパラメーターになる。
●postfix用の自己署名証明書の作成
# cd /etc/pki/tls/certs
# make postfix.crt
パスフレーズの入力(2回)。秘密鍵を暗号化するために利用される。
再度、パスフレーズの入力(3回目)。
証明書の情報を入力。(適当に入力)
国名
都道府県名
市区名
組織名
部署名
サーバーFQDN名
監理者のメールアドレス
以上で、サーバーの秘密キー(/etc/pki/tls/certs/postfix.key)と証明書(/etc/pki/tls/certs/postfix.crt)が作成される。
秘密キーは/etc/pki/tls/private/に移動しておく。
# mv /etc/pki/tls/certs/postfix.key /etc/pki/tls/private/
秘密鍵からのパスフレーズの削除
# cd /etc/pki/tls/private
# mv postfix.key postfix.key.org
# openssl rsa -in postfix.key.org -out postfix.key
# chmod 700 postfix.key
●/etc/postfix/vmailboxを作成(同じディレクトリ内のファイルを-aオプション付きでコピーして作成するとよい。権限、Selinuxを引き継ぐ。)
受信するメールアドレスとそれに対する配送先ディレクトリを記述。配送先の指定が / で終わっているとMaildir形式となる。
tarou@my-dom.xxx tarou@my-dom.xxx/Maildir/
hanako@new-dom.xxx hanako@new-dom.xxx/Maildir/
vmailboxファイルをデータベース化
# postmap /etc/postfix/vmailbox
●/etc/postfix/virtualを編集(最後に追加)
エイリアスの設定 受信するメールアドレスとその転送先。
postmaster@my-dom.xxx postmaster (これはさらに/etc/aliasesによって、root→tarou@my-dom.xxxと転送されるようにする。)
postmaster@new-dom.xxx hanako@new-dom.xxx
tarou@mail.my-dom.xxx tarou@my-dom.xxx
hanako@mail.new-dom.xxx hanako@new-dom.xxx
foo@my-dom.xxx ***@*****.ne.jp fooは仮想でかまわない
データベース化
# postmap /etc/postfix/virtual
●/etc/aliasesを編集(最後に追加)
root tarou@my-dom.xxx
データベース化
# postalias /etc/aliases
firewalldの設定
ポート25(TCP/INPUT,OUTPUT)と同時に、ポート587(TCP/INPUT)を開ける。
trustedゾーンに対しては、必要ない。
externalゾーンの設定
# firewall-cmd --get-services 定義されているサービス一覧
/usr/lib/firewalld/services/smtp.xmlをみると、これが25ポートであることがわかる。
これをコピーして、/etc/firewalld/services/に貼り付け編集する。
<port protocol="tcp" port="25"/>の下に、
<port protocol="tcp" port="587"/>を追加。
# firewall-cmd --list-service --zone=external
# firewall-cmd --add-service=smtp --zone=external
# firewall-cmd --add-service=smtp --zone=external --permanent
# firewall-cmd --reload firewalldのリロード
postfixサービスの起動
# systemctl --type=service list-unit-files インストールされたサービス一覧
# systemctl --type=service list-units | grep postfix 実行中のサービスにpostfixがあるか
# systemctl start postfix
# systemctl enable postfix
●クライアント(アカウント設定)
以上の設定で、25ポートは内部=mynetworksからのものは認証、TLSなしでも送信を受け付けるが、外部からのものはプロバイダが25ブロックしている場合がほとんどなのでアクセスに失敗する。アクセスできたとしても、送信には認証が必要となる(前のmain.cfの「リレーの許可」の項参照。TLSは必ずしも必要としない)。
587ポートは、認証とTLS両方が強制されるが、こちらは内部、外部からの送信に使える。
ここでは暗号化パスワードを使ったが、クライアントが暗号化パスワードに対応していない場合でも、dovecot.confの「mechanisms = 」に「plain login」を加えておけば問題なく使えるようだ。
Thunderbird
受信(サーバー設定)
ユーザー名 tarou@my-dom.xxx
ポート番号を995番にする。
セキュリティ設定では、「SSL/TLS」、「暗号化されたパスワード認証」を選択。
「ダウンロード後もサーバーにメッセージを残す」のチェックをはずす。(適宜)
送信(送信サーバー)
外部からの送信接続では、POPと同じアカウントとパスワードを使うことになる。ポート=587、セキュリティ=「STARTTLS」、「暗号化されたパスワード認証」、ユーザー名=tarou@my-dom.xxx。
内部からの送信には、25ポートを使用し、接続の保護は「なし」、認証は「認証なし」で使うとよい。
Outlook
暗号化パスワードには対応していないがdovecot.confの「mechanisms = 」に「plain login」が加えてあれば使えるようだ。
名前 hanako@new-dom.xxx
電子メールアドレス hanako@new-dom.xxx
受信メールサーバー mail.new-dom.xxx
送信メールサーバー mail.new-dom.xxx
アカウント名 hanako@new-dom.xxx
パスワード ************
詳細設定/送信サーバー
認証が必要をチェック
次のアカウントとパスワードでログオンする
アカウント名 hanako@new-dom.xxx
パスワードは、同じ。
詳細設定/詳細設定
受信サーバー ポート=995 SSLが必要をチェック
送信サーバー
【外部から接続する場合】 ポート=587 暗号化接続の種類=TLS(古いOutlookではSSLしかないが、それでもかまわないようだ。)
【内部から接続する場合】 ポート=25 暗号化接続の種類=なし
TOP(HOME)へ