メールサーバ構築
メールサーバ virtual mailbox (仮想メールボックス)の構築方法。
このページでは接続保護なしの認証の設定。
バージョン
[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
[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
◆基本設定
myhostname = mail.example123.local
mydomain = example123.local
#このPostfixサーバー自体が送信するメールのドメインを指定します。
#例えば、メールサーバーからのエラー通知、バウンスメール、システム生成のメール(cronの結果など)の #From: ヘッダに使用されるドメインです。
#通常は、$mydomain (このサーバーのプライマリドメイン) に設定するか、サーバーの正式なホスト名 ($myhostname) を設定します。
myorigin = $myhostname
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サーバーとして動作する際)」の動作を制御します。 |
smtp inet n - n - - smtpd
virtual unix - n n - - virtual
◆仮想メールユーザ用のlinuxユーザを作成
groupadd -g 5000 vmail
useradd -u 5000 -g vmail -s /sbin/nologin vmail
◆仮想メールのベースディレクトリを作成
(自動でメールボックスは作られる)
mkdir -p /var/mail/vhosts/
chown -R vmail:vmail /var/mail/vhosts
chmod -R 700 /var/mail/vhosts
◆ユーザ作成
- virtual_mailbox_mapsで指定したファイルにユーザを記載する。
- pathの最後に/をつける。
- 相対パスにする。
user1@virtual.local virtual.local/user1/
user2@virtual.local virtual.local/user1/
postmap /etc/postfix/vmailbox
◆確認
postconf -n
postconf -d
postfix check
◆反映
systemctl reload postfix
Dovecot
◆Dovecot設定ファイルで使用される変数
%d = ドメイン名
%n = ローカルパート(例:user1@virtual.local
の user1)
%u = メールアドレス
%Lu = ユーザー名を小文字に変換する
◆基本設定
#protocols = submissionは削除。postfixに干渉するため。
protocols = imap pop3
listen = *
!include conf.d/*.conf
!include_try local.conf
#必要に応じてデバッグモードにする。
mail_debug = yes
#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
#暗号化されていない接続(非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)など、システムユーザーを使った認証
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
}
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
}
}
#IMAP, POP3 すべて「暗号化なし」で通信する
ssl = no
#パスワード発行(doveadm)に鍵が必要
ssl_cert = </etc/pki/tls/certs/postfix.pem
ssl_key = </etc/pki/tls/certs/postfix.pem
◆証明書・秘密鍵の作成
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
openssl x509 -in postfix.pem -text -noout
◆ユーザ作成・パスワード発行
■利用可能なパスワードハッシュスキームの一覧を表示
doveadm pw -l
■パスワード発行
doveadm pw -s BLF-CRYPT -r 12 >> /etc/dovecot/users
■ユーザ作成
sed -Ei 's/^\{BLF-CRYPT\}/user1@virtual.local:{BLF-CRYPT}/' /etc/dovecot/users
user1@virtual.local:{BLF-CRYPT}password_hash
■反映
doveadm reload
◆ログイン確認
doveadm auth test user1@virtual.local 'password'
◆確認
dovecot -n
doveconf
Postfix & Dovecot を起動 or 再起動
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はそのユーザーにメール送信を許可します。