AlmaLinux8をPostfix+dovecotでE-mailサーバーにする

・ システムアカウントとE-mailアカウントは別にしたい
・ user1@hirohiro716.comのようなアドレスで主に送受信する
・ 別名でuser1@alias.hirohiro716.comでも受信したい
・ メーリングリストも使用したい
・ AlmaLinuxのバージョン: 8.5
・ Postfixのバージョン: 3.5.8
・ Dovecotのバージョン: 2.3.8
・ プロトコル: smtp/smtps/imaps/pop3s

DNSレコード

先にDNSレコードを登録しておく。
mydomain: email.hirohiro716.com
virtual_mailbox_domains: hirohiro716.com
virtual_alias_domains: alias.hirohiro716.com

email.hirohiro716.com A 0 153.126.160.145
hirohiro716.com A 0 153.126.160.145
hirohiro716.com MX 10 hirohiro716.com
hirohiro716.com TXT 0 v=spf1 +mx ~all
alias.hirohiro716.com A 0 153.126.160.145
alias.hirohiro716.com MX 10 alias.hirohiro716.com
alias.hirohiro716.com TXT 0 v=spf1 +mx ~all

SSL証明書

この手順ではZeroSSLで発行した証明書を使用する。ZeroSSLにログインして発行した証明書のzipファイルを解凍する。

# unzip email.hirohiro716.com.zip -d /etc/ssl/email.hirohiro716.com/

解凍されたファイルは「ca_bundle.crt」「certificate.crt」「private.key」で、中間CA証明書がないので作成する。

# cd /etc/ssl/email.hirohiro716.com/
# cat certificate.crt ca_bundle.crt > fullchain.crt

証明書のSELinuxコンテキストのラベル付けを復元する。

# restorecon -RF /etc/ssl/email.hirohiro716.com/

Dovecot

Dovecotをインストールする。

# dnf install dovecot

SSL証明書の設定をする。
※変更箇所のみ記載

ssl_cert = </etc/ssl/email.hirohiro716.com/fullchain.crt
ssl_key = </etc/ssl/email.hirohiro716.com/private.key

使用するプロトコルを設定する。
※変更箇所のみ記載

protocols = imap pop3

認証の際に受け付けるポート、Postfix認証用ソケットファイルの設定をする。ソケットファイルのパーミッションとか所有者とかはコメントを読む限り0666で問題なさそうなのでそのまま。
※変更箇所のみ記載

service imap-login {
  inet_listener imap {
    port = 0
  }
  inet_listener imaps {
    port = 993
    ssl = yes
  }
}
service pop3-login {
  inet_listener pop3 {
    port = 0
  }
  inet_listener pop3s {
    port = 995
    ssl = yes
  }
}
unix_listener /var/spool/postfix/private/auth {
  mode = 0666
}

バーチャルメールボックス用のシステムアカウントとディレクトリを作成する。

# groupadd -g 5000 vmail
# useradd -u 5000 -g vmail -s /sbin/nologin vmail
# mkdir /var/spool/mail/virtual
# chown vmail:vmail /var/spool/mail/virtual
# chmod 770 /var/spool/mail/virtual

Dovecotにバーチャルメールボックスの場所を設定する。
※変更箇所のみ記載

mail_location = maildir:/var/spool/mail/virtual/%d/%n/Maildir

Dovecotの認証方法に関する設定を変更する。システムアカウントで認証はしない。
※変更箇所のみ記載

#!include auth-system.conf.ext
!include auth-passwdfile.conf.ext
!include auth-static.conf.ext

auth-passwdfile.conf.extはデフォルトのまま使用する。

passdb {
  driver = passwd-file
  args = scheme=CRYPT username_format=%u /etc/dovecot/users
}
userdb {
  driver = passwd-file
  args = username_format=%u /etc/dovecot/users
}

auth-passwdfile.conf.extで指定されているusersファイルを作成する。

user1@hirohiro716.com:{PLAIN}password-1234
user2@hirohiro716.com:{PLAIN}password-5678

auth-static.conf.extを編集して作成したアカウント「vmail」を指定する。homeの指定はしなくても大丈夫だと思われる。
※変更箇所のみ記載

userdb {
  driver = static
  args = uid=vmail gid=vmail
}

Postfix

基本的な設定

Postfixをインストールする。

# dnf install postfix

main.cfを編集して基本的な設定をする。
※変更箇所のみ記載

# Not matching the actual hostname.
myhostname = email.hirohiro716.com
mydomain = $myhostname
myorigin = $mydomain

# Receive mail on all network interfaces.
inet_interfaces = all

# Disable IPv6.
inet_protocols = ipv4

# Specifies the domain that this machine delivers locally.
mydestination = $myhostname, localhost.$mydomain, localhost

# Not publish.
smtpd_banner = $myhostname ESMTP unknown

# Certificate settings.
smtpd_tls_cert_file = /etc/ssl/email.hirohiro716.com/fullchain.crt
smtpd_tls_key_file = /etc/ssl/email.hirohiro716.com/private.key

# Disable user search.
disable_vrfy_command = yes

# SASL settings.
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, defer_unauth_destination

# Client restriction settings.
smtpd_client_restrictions = permit_mynetworks, reject_unknown_client, permit

# HELO restriction settings.
smtpd_helo_required = yes
smtpd_helo_restrictions = permit_mynetworks, reject_unknown_hostname, reject_non_fqdn_hostname, reject_invalid_hostname, permit

# Sender restriction settings.
smtpd_sender_restrictions = permit_mynetworks, reject_unknown_sender_domain, reject_non_fqdn_sender

master.cfを編集して利用するプロトコルの種類を設定する。smtpsのsmtpd_tls_wrappermodeを有効にしないとtcp/465でもSTARTTLSが試行される。
※変更箇所のみ記載

smtp      inet  n       -       n       -       -       smtpd
submission inet n       -       n       -       -       smtpd
smtps     inet  n       -       n       -       -       smtpd
  -o smtpd_tls_wrappermode=yes
メールの容量に関する設定

現在のサイズに関する設定値を確認する。

berkeley_db_create_buffer_size = 16777216
berkeley_db_read_buffer_size = 131072
body_checks_size_limit = 51200
bounce_size_limit = 50000
header_size_limit = 102400
lmdb_map_size = 16777216
mailbox_size_limit = 51200000
message_size_limit = 10240000
tcp_windowsize = 0

メールボックスが50MB、メッセージが10MBに制限されている。ちょっと少ないので設定変更する。再度「main.cf」を編集して最下部に追記する。
※追記する箇所のみ記載

# Maximum mailbox size 1GB. Maximum message size 20MB.
mailbox_size_limit = 1024000000
message_size_limit = 20480000
バーチャルメールボックスの設定

バーチャルメールボックスの設定をする。再度「main.cf」を編集して最下部に追記する。
※追記する箇所のみ記載

# Virtual mailbox settings.
virtual_mailbox_domains = hirohiro716.com
virtual_mailbox_base = /var/spool/mail/virtual
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000

main.cfで指定したバーチャルメールボックスの場所を定義するファイルを作成する。

user1@hirohiro716.com hirohiro716.com/user1/Maildir/
user2@hirohiro716.com hirohiro716.com/user2/Maildir/

作成したvmailboxから検索テーブル(vmailbox.db)を生成する。

# postmap /etc/postfix/vmailbox
バーチャルエイリアスの設定

バーチャルエイリアスの設定をする。再度「main.cf」を編集して最下部に追記する。
※追記する箇所のみ記載

# Virtual ailias settings.
virtual_alias_domains = alias.hirohiro716.com
virtual_alias_maps = hash:/etc/postfix/virtual

main.cfで指定したバーチャルエイリアスの転送先を定義するファイルを作成する。

@alias.hirohiro716.com @hirohiro716.com

作成したvirtualから検索テーブル(virtual.db)を生成する。

# postmap /etc/postfix/virtual
メーリングリストの設定

メーリングリストはバーチャルエイリアスの設定で実現する。再度「main.cf」を編集して「virtual_alias_maps」に「regexp:/etc/postfix/ml」をカンマ区切りで追記する。
※変更箇所のみ記載

virtual_alias_maps = hash:/etc/postfix/virtual, regexp:/etc/postfix/ml

main.cfで指定したメーリングリストの設定を定義するファイルを作成する。

# Group1
/^group1@(hirohiro716\.com|alias\.hirohiro716\.com)$/
        user1@hirohiro716.com,
        user2@hirohiro716.com,

# Team2
/^team2@(hirohiro716\.com|alias\.hirohiro716\.com)$/
        user1@hirohiro716.com,

ファイアウォールの例外設定をする。

# firewall-cmd --permanent --add-service={smtp,smtp-submission,smtps,imaps,pop3s}
# firewall-cmd --reload

サービスを有効化して実行する。

# systemctl enable --now dovecot
# systemctl enable --now postfix