CentOS8.3にPostfixとDovecotをセットアップする手順

| [../](https://qiita.com/taconana/items/e45f19e83c825a9ba75e) |
---

VPSサーバー（CentOS8.3）にメールサーバーを構築してみた。PostfixとDovecotをセットアップする手順をメモしておく。Postfixはメールの送受信を行い、DovecotはクライアントPCからのメール受信を担うサービスである。以下の例では、mail.kankeri.com というサーバー名とする。

Postfixでは、SMTP認証にSASLを利用する。SASLにはいくつかの実装があるが、一般的なcyrus-saslを利用する。また、SASLはさまざまな認証のメカニズムに対応しているが、初期状態で選択されているものがPAM認証である。PAMは、UNIXのユーザーアカウントとパスワードを利用するものであり、loginやsuコマンドなどでも利用されている。

メールの送信や転送では、SMTP(25ポート)とSMTP-SUBMISSION(587ポート)を使い、STARTTLSで通信する。STARTTLSは、受信側がSTARTTLSに対応していれば暗号化して通信され、対応していなければ平文で通信する方式である。今回は、SMTPS(465ポート)は利用せず、またSSL/TSLは使用しないものとする。メールクライアントからの送信では、OP25B対策として25ポートではなく、587ポートを利用する。

メールの受信では、IMAP(143ポート)とPOP3(110ポート)を使い、STARTTLSで通信する。今回は、IMAPS(993ポート)やPOP3S(995ポート)は利用せず、またSSL/TSLは使用しないものとする。クライアントでサーバーからメールを取得した際に、メール本体をサーバーに残したままにするのがIMAPであり、サーバーに残さないのがPOP3である。Dovecotでは、IMAPとPOP3のどちらでも選択利用できるように設定する。

- cyrus-saslのセットアップ
- メールボックスの作成
- DNSレコードの設定
- PostfixとDovecotのインストール
- Postfix：main.cfの設定
- Postfix：master.cfの設定
- Dovecotの設定
- サービス起動とFirewall設定
- メールクライアント(Thunderbird)からの送受信の確認

## cyrus-saslのセットアップ

cyrus-saslをインストールする。SMTP認証にsaslauthdを指定し、メカニズムにPAMを指定する。デフォルトの設定のままである。/etc/passwdに登録されたユーザーとパスワードを使用して認証する。PAM以外には、sasldbという選択肢もあるが、今回は利用しない。sasldbは、/etc/passwdとは別に独自にユーザーとパスワードを登録して管理するものになる。ユーザー数が少ない場合はPAMで十分であり、ユーザー数が多くなるならsasldbを選択することになるのだろう。今回は、デフォルト設定でsaslauthd＋PAMとする。

```bash
$ yum install cyrus-sasl cyrus-sasl-plain
$ saslauthd -v							# pamが含まれていること
saslauthd 2.1.27
authentication mechanisms: getpwent kerberos5 pam rimap shadow ldap httpform

$ vi /etc/sasl2/smtpd.conf
pwcheck_method: saslauthd				# saslauthdであること
mech_list: plain login					# plain loginであること

$ vi /etc/sysconfig/saslauthd 
MECH=pam								# pamであること

$ systemctl start saslauthd
$ systemctl enable saslauthd
```

## メールボックスの作成

PAM認証を使うので、UNIXのユーザーアカウントごとにメールボックスを作成しておく。既存のユーザーにはホームの配下に規定のディレクトリを作成し、未来のユーザー用にはスケルトンを設定しておく。また、存在しないユーザー宛のメールが届いた場合に不達メールを送信元へ返すことはせず、破棄するようにしたいので、unknown_userを/etc/aliasesに追加しておく。

```bash
# 例えば、既存のtaconanaユーザーの場合
$ su - taconana
$ mkdir -p Maildir/{new,cur,tmp}
$ chmod -R 700 Maildir

# 未来のユーザーのためにスケルトンを設定
$ su -
$ mkdir -p /etc/skel/Maildir/{new,cur,tmp}
$ chmod -R 700 /etc/skel/Maildir/

# 存在しないユーザー宛のメール対応
$ vi /etc/aliases
unknown_user: /dev/null
```

##  DNSレコードの設定と確認

メール送信(SMTP)も、メール受信(IMAP/POP3)も、今回はバーチャルホストで mail.kankeri.com とする。利用しているDNSプロバイダのWebページで、DNSレコードを以下の感じに設定しおく。

- MX：kankeri.com
- A：mail.kankeri.com

そして、DNSが機能していることをpingやnslookupコマンドなどで確認しておく。

```bash
$ su -
$ nslookup mail.kankeri.com
```

## PostfixとDovecotのインストール

PostfixとDovecotをインストールする。また、MTA(メール転送エージェント)をpostfixに設定しておく。MTAとしてsendmailが選択されている場合があるので、念のため確認し、変更しておく。

```bash
$ yum install postfix
$ postconf | grep version
mail_version = 3.3.1

$ yum install dovecot
$ dovecot --version
2.3.8 (9df20d2db)

$ alternatives --config mta
1 プログラムがあり 'mta' を提供します。
  選択       コマンド
-----------------------------------------------
*+ 1           /usr/sbin/sendmail.postfix

Enter を押して現在の選択 [+] を保持するか、選択番号を入力します: 1
```

## Postfix：main.cfの編集

/etc/postfix/main.cfを以下の感じで編集する。編集後に`postconf -n`で確認するとよい。

```bash
$ vi /etc/postfix/main.cf
myhostname = mail.kankeri.com
mydomain = kankeri.com
myorigin = $mydomain

inet_interfaces = all
#inet_interfaces = localhost

#inet_protocols = all
inet_protocols = ipv4	# IPv4 のみ

#local_recipient_maps = unix:passwd.byname $alias_maps
local_recipient_maps =

mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
#mynetworks = 168.100.189.0/28, 127.0.0.0/8
mynetworks = 127.0.0.0/8, 10.0.0.0/24

home_mailbox = Maildir/

luser_relay = unknown_user@localhost

smtpd_banner = $myhostname ESMTP

# TLS CONFIGURATION
#smtpd_tls_cert_file = /etc/pki/tls/certs/postfix.pem
smtpd_tls_cert_file = /etc/letsencrypt/live/kankeri.com/fullchain.pem
#smtpd_tls_key_file = /etc/pki/tls/private/postfix.key
smtpd_tls_key_file = /etc/letsencrypt/live/kankeri.com/privkey.pem
smtpd_tls_security_level = may
#smtp_tls_CApath = /etc/pki/tls/certs
smtp_tls_CApath = 
#smtp_tls_CAfile = /etc/pki/tls/certs/ca-bundle.crt
smtp_tls_CAfile = 
smtp_tls_security_level = may

# 以下を末尾に追加
message_size_limit = 10485760
mailbox_size_limit = 1073741824

# SMTP-AUTHの設定
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
#smtpd_recipient_restrictions = permit_mynetworks, permit_auth_destination, permit_sasl_authenticated, reject

# SSL/TLSの設定
smtpd_use_tls = yes
smtp_tls_protocols = !SSLv2, !SSLv3
smtp_tls_mandatory_protocols = !SSLv2, !SSLv3
smtpd_tls_protocols = !SSLv2, !SSLv3
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache

# 変更された変数の確認
$ postconf -n
```

## Postfix：master.cfの編集

/etc/postfix/master.cfは、以下の感じで編集する。SUBMISSIONを有効化して、SASL認証(smtpd_sasl_auth_enable=yes)を設定する。SMTPも活かしておくこと。SMTPSは、今回は使用しないのでコメントアウトのままにしておく。

```bash
# vi /etc/postfix/master.cf
smtp       inet n       -       n       -       -       smtpd
submission inet n       -       n       -       -       smtpd
  -o syslog_name=postfix/submission
# -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
#smtps     inet n       -       n       -       -       smtpd
# -o syslog_name=postfix/smtps
```

## Dovecotの設定

Dovecot の設定ファイルを編集する。

```bash
$ vi /etc/dovecot/dovecot.conf
#listen = *, :: 
listen = *         # IPv4 のみ

$ vi /etc/dovecot/conf.d/10-auth.conf
#disable_plaintext_auth = yes
disable_plaintext_auth = no
auth_mechanisms = plain login

$ vi /etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:~/Maildir

$ vi /etc/dovecot/conf.d/10-master.conf
# Postfix smtp-auth
unix_listener /var/spool/postfix/private/auth {
  mode = 0666
  user = postfix
  group = postfix
}

$ vi /etc/dovecot/conf.d/10-ssl.conf
ssl = required
#ssl_cert = </etc/pki/dovecot/certs/dovecot.pem
#ssl_key = </etc/pki/dovecot/private/dovecot.pem
ssl_cert = </etc/letsencrypt/live/kankeri.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/kankeri.com/privkey.pem
ssl_protocols = !SSLv2 !SSLv3
```

## サービス起動とFirewall設定

PostfixとDovecotのサービスを起動し、自動実行可能に設定しておく。また、Firewallにsmtp(25ポート、smtp-submission(587ポート)、pop3(110ポート)、imap(143ポート)も設定しておく。

```bash
# サービス登録
$ systemctl start postfix
$ systemctl enable postfix
$ systemctl start dovecot
$ systemctl enable dovecot

# Firewall設定
$ firewall-cmd --add-service={smtp,smtp-submission,pop3,imap} --permanent
$ firewall-cmd --reload
$ firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: dhcpv6-client http https imap mysql pop3 smtp smtp-submission ssh vnc-server
  ports: 8080/tcp 8443/tcp 8009/tcp
  protocols:
```

## メールクライアント(Thunderbird)からの送受信の確認

例えば、WindowsPCのメールクライアントとしてThunderbirdを利用して確認してみる。アカウント作成時にメールアドレス（例えば、taconana@kankeri.com）を指定して進めると、自動でメールサーバー（mail.kankeri.com）を検出し、IMAP/POP3、ポート番号、STARTTLSかSSL/TLSか、パスワード認証かどうかを自動で判別してくれる。

- 受信サーバー：mail.kankeri.com、POP3、110ポート、STARTTLS、通常のパスワード認証
- 送信サーバー：mail.kankeri.com、SMTP、587ポート、STARTTLS、通常のパスワード認証

送信、受信のテストをする。STARTTLSだと、初回のメール送信時には「メッセージを送信できませんでした。Unable to communicate securely with peer: requested domain name does not match the server’s certificate. mail.kankeri.com に関する設定を見直してください」が出る。送信サーバーの「587ポート、STARTTLS」を確認して、再度試行する。「セキュリティ例外の追加」の警告が出たら「次回以降にもこの例外を有効にする」にチェックを入れて「セキュリティ例外を承認」をクリックする。パスワード入力画面に進んだら、入力して保存しておく。

以上

| [../](https://qiita.com/taconana/items/e45f19e83c825a9ba75e) |
---