Cento7.x postfix + dovecot 仮想ユーザーでの運用手順

# ドメインとDNSの設定
各サービスによるので一概に言えないが
freenomなどで無料ドメインを取得するか
各ドメインサービスよりドメインを取得する（例：black.jp）
ドメインが取れたらVPSなどのサーバのIPにDNS設定をする

digコマンドで設定したIPアドレスが引けていればOK

```
$ dig black.jp
(略)
; ANSWER SECTION:
black.jp.                300     IN      A       XXXX.XXX.XXX.XXX
```
# ポートの開放
メールの送受信で使用されるポートを適宜解放する

| サービス | ポート | 説明 |
|:-:|:-:|:--|
| smtp | 25 | 送信。SMTPリレーに使用。暗号化なし |
| smtp-submission | 587 | 送信。SMTPサブミッション用。TLS |
| smtps | 465 | 送信。SMTPS(SMTP over SSL) |
| pop3 | 110 | 受信。POP3。暗号化なし |
| pop3s | 995 | 受信。POP3 over SSL。暗号化あり |
| imap | 143 | 受信。IMAP4。暗号化なし |
| imaps | 993 | 受信。IMAP4S。暗号化あり |

```bash
# firewall-cmd --add-service={imaps,pop3,smtp,smtps} --permanent
# firewall-cmd --reload
```

# 仮想ユーザー管理用のアカウント作成
通常のメールアドレスはOSのログインアカウントと紐づけているが
運用的にシステムのアカウントの増減が手間になるので
１つのダミーのアカウントを用意し、そのアカウント権限内で
メールアカウントを管理できるようにする。

ログイン不要のアカウント作成（例：アカウント名：vmail、uid：5000、gid：5000）

```bash
# groupadd -g 5000 vmail
# useradd -u 5000 -g vmail -s /sbin/nologin vmail
```
メールを受信するディレクトリを用意する

```bash
# mkdir /var/spool/virtual
# chown -R vmail:vmail /var/spool/virtual
```

# Postfixのインストール
yumでパッケージインストール

```bash
# yum install postfix
```

編集するファイルは`main.cf`と`master.cf`。
変更箇所のみを抜粋。

```conf:/etc/postfix/main.cf
myhostname = black.jp
mydomain = black.jp
# 外部からのアクセスを許可。IPアドレスで制限かけることも可能
inet_interfaces = all
# 仮想ユーザーの場合はブランクとするらしい
mydestination = 
# メールの保存方式をMaildir形式にする
home_mailbox = Maildir/
# バナーにメールソフトの情報を隠蔽する
smtpd_banner = $myhostname ESMTP unknown

#以下を追加。sasl authの設定
# sasl authを有効化
smtpd_sasl_auth_enable = yes
# sasl authの種別を設定。
# dovecotとcyrusがある。postconf -aで設定できるか確認。
# デフォルトはcyrusぽい。cyrusを使う場合はsaslauthdが別途必要。
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
# 古いメールクライアント用
broken_sasl_auth_clients = yes

# 仮想ユーザの設定
# ドメイン設定、カンマ区切りで複数指定も可能
virtual_mailbox_domains = $myhostname
# 上記で作成したフォルダを指定
virtual_mailbox_base = /var/spool/virtual
# メールアドレスとメール保存先のmappingファイルを指定
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
# 上記で作成したアカウントのuidとgidを指定
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
```
# vmailboxの作成
メールアドレスとフォルダの対情報を記載
保存先のフォルダ構成は、複数ドメインを考慮し
`ドメイン名/ユーザー名/Maildir`とする。

```conf:/etc/postfix/vmailbox
admin@black.jp black.jp/admin/Maildir/
webmaster@black.jp black.jp/webmaster/Maildir/
yamada@black.jp black.jp/yamada/Maildir/
```
postmapコマンドでdbファイル化する。(vmalbox.dbファイルが生成される)

```bash
# postmap vmailbox
```

`master.cf`ファイルを編集する。以下の行のコメント化を解除

```bash:/etc/postfix/master.cf
smtp      inet  n       -       n       -       -       smtpd
 -o smtpd_sasl_auth_enable=yes
 -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
```
postfixを再起動。

```bash
# systemctl restart postfix
```

# dovecotのインストール
```bash
# yum install dovecot
```
編集するファイルは`10-auth.conf`、`10-ssl.conf`、`10-auth.conf`、`10-master.conf`。
`10-auth.conf`で指定する以下のファイルも編集する。
`auth-passwdfile.conf.ext`、`auth-static.conf.ext`
## 10-auth.conf
!includeの行で
`auth-passwdfile.conf.ext`と`auth-static.conf.ext`のコメント化を解除する。

```conf:/etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = no
auth_mechanisms = cram-md5 plain
(略)
!include auth-system.conf.ext
#!include auth-sql.conf.ext
#!include auth-ldap.conf.ext
!include auth-passwdfile.conf.ext
#!include auth-checkpassword.conf.ext
#!include auth-vpopmail.conf.ext
!include auth-static.conf.ext
```

## 10-ssl.conf
sslの行を変更。noとする。

```conf:/etc/dovecot/conf.d/10-ssl.conf
ssl = no
```

## 10-master.conf
service auth セクションのpostfix smtp-authを有効化する

```conf:/etc/dovecot/conf.d/10-master.conf
service auth {
  # Postfix smtp-auth
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
  }
}
```
## auth-passwdfile.conf.ext
passwddbとuserdb内のarg行を編集。schemeをCRAM-MD5に変更

```conf:/etc/dovecot/conf.d/auth-passwdfile.conf.ext
passdb {
  driver = passwd-file
#  args = scheme=CRYPT username_format=%u /etc/dovecot/users
  args = scheme=CRAM-MD5 username_format=%u /etc/dovecot/users
}
userdb {
  driver = passwd-file
#  args = scheme=CRYPT username_format=%u /etc/dovecot/users
  args = scheme=CRAM-MD5 username_format=%u /etc/dovecot/users
}
```
## auth-static.conf.ext
uidとgidを仮想ユーザー用のアカウントのid、homeに受信用のフォルダを指定
%dがドメイン名、%nがユーザー名

```conf:/etc/dovecot/conf.d/auth-static.conf.ext
userdb {
  driver = static
  args = uid=5000 gid=5000 home=/var/spool/virtual/%d/%n
}
```
## パスワードファイルの生成

```bash
# doveadm pw
Enter new password:
Retype new password:
{CRAM-MD5}XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
```
ファイルに`メールアドレス:パスフレーズ`形式で追記する

```conf:/etc/dovecot/users
admin@black.jp:{CRAM-MD5}XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
yamada@black.jp:{CRAM-MD5}XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
```

dovecotの再起動
`systemctl restart dovecot`


# ユーザー管理

## 受信フォルダの作成
```bash
# mkdir -p /var/spool/virtual/black.jp/admin/Maildir
# mkdir -p /var/spool/virtual/black.jp/webmaster/Maildir
# mkdir -p /var/spool/virtual/black.jp/yamada/Maildir
# chown -R vmail:vmail /var/spool/virtual/black.jp/
# chmod 700 /var/spool/virtual/black.jp/
```