メールサーバ構築 virtual_mail_box

# メールサーバ構築
メールサーバ virtual mailbox (仮想メールボックス)の構築方法。
このページでは接続保護なしの認証の設定。 

## バージョン

```bash:
[root@mail ~]# dnf info postfix
Last metadata expiration check: 0:02:24 ago on Sun 25 May 2025 11:59:14 PM JST.
Installed Packages
Name         : postfix
Epoch        : 2
Version      : 3.5.25
Release      : 1.el9
Architecture : x86_64
Size         : 4.4 M
Source       : postfix-3.5.25-1.el9.src.rpm
Repository   : @System
From repo    : ol9_appstream

```

```bash:
[root@mail ~]# dnf info dovecot
Last metadata expiration check: 0:01:57 ago on Sun 25 May 2025 11:59:14 PM JST.
Installed Packages
Name         : dovecot
Epoch        : 1
Version      : 2.3.16
Release      : 15.el9
Architecture : x86_64
Size         : 18 M
Source       : dovecot-2.3.16-15.el9.src.rpm
Repository   : @System
From repo    : ol9_appstream
```

## Postfix
### ◆基本設定

```bash:/etc/postfix/main.cf
myhostname = mail.example123.local
mydomain = example123.local
#virtual_mailbox_domainsに設定する1ドメインを指定。
myorigin = virtual.local
inet_interfaces = all
inet_protocols = ipv4
#空にする
mydestination =
#メールクライアントのネットワーク
mynetworks = 192.168.10.0/24, 127.0.0.0/8
virtual_mailbox_domains = virtual.local
virtual_mailbox_base = /var/mail/vhosts
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
#virtual_mailbox用のLinuxユーザのID設定
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
#virtual_mailbox_domains へのメールは、Postfix内部のvirtual配送エージェントで処理するよう設定
virtual_transport = virtual
virtual_minimum_uid = 5000
virtual_mailbox_limit = 51200000
#相手（SMTPクライアント）が STARTTLS を使ってきたら、それに応じて暗号化通信を行う。
#使ってこなければ平文でも受け入れる
smtpd_tls_security_level = may
#SMTP認証だけ受け入れる → いいえ
#（SMTP認証がTLSなしでも許可する）
smtpd_tls_auth_only = no
#sasl認証設定
smtpd_sasl_type = dovecot
#unixソケット/var/spool/postfix/private/authで認証
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
#smtp受信設定（外部からのメール受信）
smtpd_recipient_restrictions =
    #SMTP AUTH（ユーザー認証）成功した人は許可
    permit_sasl_authenticated,
    #自分が信頼しているネットワーク（mynetworks）からは許可
    permit_mynetworks,
    #それ以外は拒否（＝オープンリレー防止）
    reject_unauth_destination
```

◆補足：パラメータ「`smtp_*`」「`smtpd_*`」の違い

| パラメータの先頭 | 説明 |
|:-----------:|:------------:|
| smtp_ | このPostfixサーバーが「他のSMTPサーバーへメールを送信する際（SMTPクライアントとして動作する際）」の動作を制御します。 | 
|  smtpd_ | このPostfixサーバーが「メールクライアントや他のSMTPサーバーからメールを受信する際（SMTPサーバーとして動作する際）」の動作を制御します。 | 

```bash:/etc/postfix/master.cf
smtp      inet  n       -       n       -       -       smtpd
virtual   unix  -       n       n       -       -       virtual
```

### ◆仮想メールユーザ用のlinuxユーザを作成
```bash:
groupadd -g 5000 vmail
useradd -u 5000 -g vmail -s /sbin/nologin vmail
```

### ◆仮想メールのベースディレクトリを作成
(自動でメールボックスは作られる)

```bash:
mkdir -p /var/mail/vhosts/
chown -R vmail:vmail /var/mail/vhosts
chmod -R 700 /var/mail/vhosts
```
### ◆ユーザ作成
+ virtual_mailbox_mapsで指定したファイルにユーザを記載する。
  - pathの最後に/をつける。
  - 相対パスにする。

```bash:/etc/postfix/vmailbox
user1@virtual.local virtual.local/user1/
user2@virtual.local virtual.local/user1/
```
```bash:
postmap /etc/postfix/vmailbox
```

### ◆確認

```bash:
postconf -n
postconf -d
postfix check
```
### ◆反映
```bash:
systemctl reload postfix
```

## Dovecot
### ◆Dovecot設定ファイルで使用される変数
%d = ドメイン名
%n = ローカルパート（例：`user1@virtual.local` の user1）
%u = メールアドレス
### ◆基本設定
```bash:/etc/dovecot/dovecot.conf
#protocols = submissionは削除。postfixに干渉するため。
protocols = imap pop3
listen = *
!include conf.d/*.conf
!include_try local.conf
#必要に応じてデバッグモードにする。
mail_debug = yes
```
```bash:/etc/dovecot/conf.d/10-mail.conf
#Dovecot がアクセスを許可するユーザーID（UID）の範囲。
first_valid_uid = 5000
last_valid_uid = 5000
#postfixのmain.cfのvirtual_mailbox_mapsで指定するファイル記載のパスに合わせる。
mail_location = maildir:/var/mail/vhosts/%d/%n
mail_uid = vmail
mail_gid = vmail
```

```bash:/etc/dovecot/conf.d/10-auth.conf 
#暗号化されていない接続（非TLS）でも、プレーンテキスト認証（ユーザー名とパスワードをそのまま送る方式）を許可する
disable_plaintext_auth = no
#ログインユーザー名（= メールアドレス全体）を小文字に変換したもの
auth_username_format = %Lu
auth_mechanisms = plain login
!include auth-passwdfile.conf.ext
```

+ 今回は、「ファイルベースの仮想ユーザー認証」を行うため、「!include auth-system.conf.ext」をコメントアウトする。
  - auth-passwdfile.conf.ext：ファイルベースの仮想ユーザー認証（例：/etc/dovecot/users）
  - auth-system.conf.ext：UNIXユーザー認証（PAMや /etc/passwd）など、システムユーザーを使った認証


```bash:/etc/dovecot/conf.d/auth-passwdfile.conf.ext
passdb {
  driver = passwd-file
  args = /etc/dovecot/users
}

userdb {
  driver = static
  #postfixのmain.cfのvirtual_mailbox_mapsで指定するファイル記載のパスに合わせる。
  args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n
}
```
```bash:/etc/dovecot/conf.d/10-master.conf
service imap-login {
  inet_listener imap {
    port = 143
  }
  inet_listener imaps {
    #port = 993
    #ssl = yes
  }
}

service pop3-login {
  inet_listener pop3 {
    port = 110
  }
  inet_listener pop3s {
    #port = 995
    #ssl = yes
  }
}

service auth {
#postfixのmain.cfのsmtpd_sasl_pathに合わせる
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = postfix
  }
}
```


```bash:/etc/dovecot/conf.d/10-ssl.conf
#IMAP, POP3 すべて「暗号化なし」で通信する
ssl = no
#パスワード発行（doveadm）に鍵が必要
ssl_cert = </etc/pki/tls/certs/postfix.pem
ssl_key = </etc/pki/tls/certs/postfix.pem
```

### ◆鍵作成

```bash:鍵作成コマンド
cd /etc/pki/tls/certs/
openssl genrsa 2048 > server.key
openssl req -new -key server.key > server.csr
openssl x509 -in server.csr -days 365000 -req -signkey server.key > server.crt
cat server.key > postfix.pem
cat server.crt >> postfix.pem
```

```bash:内容確認コマンド
openssl x509 -in postfix.pem -text -noout
```

### ◆ユーザ作成・パスワード発行
#### ■利用可能なパスワードハッシュスキームの一覧を表示
```bash:
doveadm pw -l
```

#### ■パスワード発行
```bash:
doveadm pw -s BLF-CRYPT -r 12  >> /etc/dovecot/users
```

#### ■ユーザ作成
```bash:
sed -Ei 's/^\{BLF-CRYPT\}/user1@virtual.local:{BLF-CRYPT}/' /etc/dovecot/users
```

```bash:/etc/dovecot/users
user1@virtual.local:{SHA1}password_hash
```

#### ■反映
```bash:
doveadm reload
```


### ◆ログイン確認
```bash:
doveadm auth test user1@virtual.local 'password'
```

### ◆確認

```bash:
dovecot -n
```

## Postfix & Dovecot を起動 or 再起動

```bash:
systemctl stop dovecot
systemctl stop postfix
systemctl start dovecot
systemctl start postfix
systemctl status dovecot postfix
```

### ◆Thunderbird
#### ■受信
プロトコル: pop3
ホスト名: mail.example123.local
ポート番号: 110
接続の保護: なし
認証方式: 通常のパスワード認証
ユーザ名: `user1@virtual.local`

#### ■送信
ホスト名: mail.example123.local
ポート番号: 25
接続の保護: なし
認証方式: 通常のパスワード認証
ユーザ名: `user1@virtual.local`

## POP3・SMTP認証　STARTTLS・SSL/TLS 
POP3・SMTP認証　STARTTLS・SSL/TLS の設定はこちら↓。
https://qiita.com/Linux_box/items/416494f5c6d4b4495ead

# 補足情報
## SASL認証の解説
（Simple Authentication and Security Layer）
さまざまなネットワークプロトコルで使える、汎用的な認証フレームワーク。
SASL認証を“Dovecot”が提供しており、Postfixがそれを使ってSMTP認証を実現している。

```
[メールクライアント]
       |
       |（SMTP認証要求）
       ↓
   [Postfix]───(SASL)───> [Dovecot]
                           ↑
                 （SQLやpasswdなどで認証）
```

+ Dovecot は /var/spool/postfix/private/auth という UNIXソケット（ファイル） を作成します。
+ Postfix はそのソケットに接続して、クライアント（ユーザー）から受け取ったユーザー名・パスワードを渡す。
+ Dovecot側でパスワードを検証（ファイル、SQL、LDAPなどのバックエンド）。
+ 成功すれば「認証成功」と返り、Postfixはそのユーザーにメール送信を許可します。