VPS

>

メールサーバー構築

公開日 : 2024/03/05

最終更新日時 : 2024/08/20 06:40:20

環境
CentOS Stream release 9
Apache/2.4.57 (CentOS Stream)
Xserver VPS

 
WEBサーバーとメールサーバーを同居させる前提

DNS レコードの設定
ホスト名 種別 内容 TTL 優先度
.example.com MX mail.example.com 3600 0
mail A 162.43.49.56 3600 0
TXT v=spf1 +a:x162-43-49-56.static.xvps.ne.jp +a:mail.example.com +mx include:spf.sender.xserver.jp ~all 3600 0

メールサーバー用ディレクトリの作成

chown -R www:www /var/www/html/mail && chmod 705 /var/www/html/mail

mail.example.com 用の独自 conf 作成

vi /etc/httpd/conf.d/mail.conf

下記を貼り付ける(キー取得用)

<VirtualHost *:80>
    DocumentRoot /var/www/html/mail
    ServerName mail.example.com

    # for Let's Encrypt
    Alias /.well-known /var/www/html/mail/.well-known

    <Directory /var/www/html/mail>
        Require all granted
    </Directory>
</VirtualHost>

キー取得

certbot certonly --webroot -w /var/www/html/mail -m info@example.com -d mail --agree-tos

各キーが生成されているのを確認

ls /etc/letsencrypt/live/mail.example.com

output

README  cert.pem  chain.pem  fullchain.pem  privkey.pem

mail.conf の編集

vi /etc/httpd/conf.d/mail.conf

下記を貼り付ける

<VirtualHost *:80>
ServerName mail.example.com
ServerAdmin info@example.com
DocumentRoot "/var/www/html/mail"
<Directory "/var/www/html/mail">
AllowOverride All
Allow from all
</Directory>
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
ErrorLog logs/mail-error_log
CustomLog logs/mail-access_log combined
</VirtualHost>

http でアクセスしてきたら問答無用に https にリダイレクトさせる

ssl.confの設定

vi /etc/httpd/conf.d/ssl.conf

## SSL Virtual Host Context 以降をすべて削除してある前提

下記を貼り付ける

<VirtualHost *:443>
SSLEngine on
SSLProtocol All -SSLv2 -SSLv3 -TLSv1
ServerName mail.example.com
DocumentRoot "/var/www/html/mail"
SSLCertificateFile /etc/letsencrypt/live/mail.example.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/mail.example.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/mail.example.com/chain.pem
<Directory "/var/www/html/mail">
AllowOverride All
Allow from all
</Directory>
ErrorLog logs/mail-ssl_error_log
CustomLog logs/mail-ssl_access_log combined
</VirtualHost>

Apache 2.4.8以降では SSLCertificateChainFile の指定は不要で、SSLCertificateFile に fullchain.pem を指定すればいいようだが、Apache 2.4.57 なので従来の方法で行く。
後々、検証した結果、Apache 2.4.57 でも下記2つの記述だけで問題なかった。

SSLCertificateFile /etc/letsencrypt/live/mail.example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/mail.example.com/privkey.pem

httpd リスタート

systemctl restart httpd

確認用 php ファイル作成

echo "<?php phpinfo(); ?>" > /var/www/html/mail/phpinfo.php

https でアクセスできれば OK
 

Postfix(送信サーバー)、Dovecot(受信サーバー)、cyrus-sasl(SMTP 認証用)のインストール

dnf -y install postfix dovecot cyrus-sasl

Postfix 設定ファイル編集

vi /etc/postfix/main.cf
myhostname = mail.example.com # FQDNを指定

#mydomain = domain.tld
#↓
mydomain = example.com # ドメインを指定)

#myorigin = $mydomain
#↓
myorigin = $mydomain

inet_interfaces = localhost
#↓
inet_interfaces = all # 外部からのメール受信を許可

inet_protocols = ipv4

mydestination = $myhostname, localhost.$mydomain, localhost
#↓
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

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

mynetworks = 192.168.0.0/24, 127.0.0.0/8

relay_domains = $mydestination

relayhost =

#alias_maps = dbm:/etc/aliases
#↓
alias_maps = hash:/etc/aliases

#home_mailbox = Maildir
#↓
home_mailbox = Maildir/

#luser_relay = admin+$local
#↓
luser_relay = unknown_user@localhost

#smtpd_banner = $myhostname ESMTP $mail_name ($mail_version)
#↓
smtpd_banner = $myhostname ESMTP unknown

#smtpd_tls_cert_file = /etc/pki/tls/certs/postfix.pem
#↓
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example.com/fullchain.pem

#smtpd_tls_key_file = /etc/pki/tls/private/postfix.key
#↓
smtpd_tls_key_file = /etc/letsencrypt/live/mail.example.com/privkey.pem

#サーバーがTLSに対応している場合、TLSを使用する
smtp_tls_security_level = may
meta_directory = /etc/postfix
shlib_directory = /usr/lib64/postfix

# 最終行へ下記を追加(SMTP認証設定)
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_recipient_restrictions =
    permit_mynetworks
    permit_sasl_authenticated
    reject_unauth_destination

# 受信メールサイズ制限
message_size_limit = 10485760

# TLSログレベルの設定
smtpd_tls_loglevel = 1

# 暗号に関する情報を "Received:" メッセージヘッダに含める
smtpd_tls_received_header = yes

# 接続キャッシュファイルの指定
smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache

# キャッシュの保持時間の指定
smtpd_tls_session_cache_timeout = 3600s

master.cf 編集

vi /etc/postfix/master.cf
submission inet n       -       n       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_reject_unlisted_recipient=no
#  -o smtpd_client_restrictions=$mua_client_restrictions
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING

smtps     inet  n       -       n       -       -       smtpd
#  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_reject_unlisted_recipient=no
#  -o smtpd_client_restrictions=$mua_client_restrictions
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING

# smtps セクションの下あたりに以下を追加
# SASL authentication with dovecot
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth
  -o smtpd_sasl_security_options=noanonymous
  -o smtpd_sasl_local_domain=$myhostname
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o smtpd_recipient_restrictions=reject_non_fqdn_recipient,reject_unknown_recipient_domain,permit_sasl_authenticated,reject

ルックアップテーブル作成

postmap /etc/postfix/access

Postfix 起動と自動起動設定

systemctl start postfix && systemctl enable postfix

Dovecot 設定

vi /etc/dovecot/dovecot.conf
#protocols = imap pop3 lmtp submission
#↓
protocols = imap pop3

# 最終行に追加
service auth {
  unix_listener /var/spool/postfix/private/auth {
    user = postfix
    group = postfix
    mode = 0660
  }
  user = root
}
vi /etc/dovecot/conf.d/10-master.conf
service imap-login {
  inet_listener imap {
    port = 143
    #port = 0
  }
  inet_listener imaps {
    port = 993
    ssl = yes
  }
}

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

service submission-login {
  inet_listener submission {
    port = 587
  }
}

# SASL 認証ソケットファイルを指定
service auth {
 (略)
  # Postfix smtp-auth
  #unix_listener /var/spool/postfix/private/auth {
  #  mode = 0666
  #}
 #↓
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = postfix
  }
}
vi /etc/dovecot/conf.d/10-auth.conf
#disable_plaintext_auth = yes
#↓プレインテキスト認証を許可
disable_plaintext_auth = no
#auth_mechanisms = plain
#↓
auth_mechanisms = plain login
vi /etc/dovecot/conf.d/10-ssl.conf
# SSL接続有効化
ssl = no
#↓
ssl = yes
 
# 証明書と秘密キーを指定
ssl_cert = </etc/letsencrypt/live/mail.example.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.example.com/privkey.pem

 

vi /etc/dovecot/conf.d/10-mail.conf
#mail_location =
#↓ Maildir形式にする
mail_location = maildir:~/Maildir

ログの出力先を変更

vi /etc/dovecot/conf.d/10-logging.conf
#log_path = syslog
 ↓
log_path = /var/log/dovecot/dovecot.log

ログ出力先のディレクトリ作成

mkdir /var/log/dovecot 

Dovecot 起動、自動起動設定

systemctl start dovecot && systemctl enable dovecot

 

証明書の自動更新設定

crontab -e

毎朝 5 時に証明書を自動更新し Postfix と Dovecot をリロード

0 5 * * * certbot renew -q --deploy-hook "systemctl restart postfix dovecot"

Postfix ログの設定

SSLメールサーバ構築メモ Postfix + Dovecot【2024年版】 | あぱーブログ を参考にさせて頂いた。

出力先ディレクトリ作成

mkdir /var/log/mail

出力先の変更

vi /etc/rsyslog.conf
mail.*                                                  -/var/log/maillog
#↓変更
mail.*                                                  -/var/log/mail/maillog

syslog リスタート

systemctl restart rsyslog

不要なログを削除

rm -f /var/log/maillog*

ローテーション設定

vi /etc/logrotate.d/rsyslog
# 下記を削除
/var/log/maillog
vi /etc/logrotate.d/maillog
# 下記を追加
/var/log/mail/maillog {
    daily
    missingok
    dateext
    rotate 60
    sharedscripts
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}

Dovecot ログの設定

vi /etc/logrotate.d/dovecot
vi /etc/logrotate.d/dovecot
# 下記を追加
/var/log/dovecot/dovecot.log {
    daily
    missingok
    dateext
    rotate 60
    sharedscripts
    postrotate
        /bin/kill -USR1 `cat /var/run/dovecot/master.pid 2>/dev/null` 2> /dev/null || true
    endscript
}

saslauthd 起動、自動起動設定

systemctl start saslauthd && systemctl enable saslauthd

ファイアーウォールの設定

firewall-cmd --add-service={smtp, smtp-submission, smtps, imaps} --zone=public --permanent
firewall-cmd --reload

後々、判明したことだが smtp 25番ポートを開かないと Gmail とのメール送受信ができない

SASL による認証方法は UNIX ユーザー認証(PAM認証)で行うこととする

新規でノーログインユーザー info を追加してみる
info はデフォルトだと追加できないので下記の設定をする

vi /etc/aliases
#以下をコメントアウト
#info:          postmaster

反映させる

newaliases

info ユーザー追加

useradd -s /sbin/nologin info

パスワード設定

passwd info

パスワード入力、Enter を繰りかえして

passwd: 全ての認証トークンが正しく更新できました

が表示されれば OK

あとは Thunderbird 等のメールソフトで設定すればいい

ここの例だと下記の設定内容になる