Red Hat Enterprise Linux 9 にメールサーバーを構築(前編)

ConoHa Enterprise Linux 9
このサイトはアフィリエイト広告(Amazonアソシエイト含む)を掲載しています。
スポンサーリンク

ここまで、ConoHa の VPS 上に RHEL9 をインストールし、そこに OpenLiteSpeed によるウェブサーバーなどを構築してきました。

Red Hat Enterprise Linix 9 の OpenLiteSpeed に WordPress (LiteSpeed Cache) をインストール
これまで ConoHa の VPS に Red Hat Enterprise Linix 9 をインストールし、ウェブサーバー(OpenLiteSpeed)とデータベースサーバー(MariaDB)を構築してきました。今回は WordPres...

今回はそこにメールサーバーを構築していこうと思います。

方針としては、お決まりの Postfix +Dovecot を使い、ユーザー認証は MySQL と連動させようと思います。

ConoHa VPS

事前準備

ファイアウォールの設定

まず、サーバーがメールを受信できるように 25 番ポートを開放する必要があります。

また、メールクライアントから接続する SMTPS(465 番ポート)と IMAPS(993 番ポート)は国内からしか接続しない想定で、国内のみに向けて開放するようにします。

POP 接続はしない方針なので、POPS(995 番ポート)は塞いでおきます。

また、SSL 接続しか許可しない方針なので POP(110 番ポート)、IMAP(143 番ポート)も塞いでおきます。

Sieve の設定は同じサーバーに設置した SnappyMail から行うので、ManageSieve(4190 番ポート)は塞いでおきます。MUA(Thunderbird など)から設定を行う場合は、国内のみに向けて開放してください。

Red Hat Enterprise Linux 9 のファイアウォール(nftables)設定
ここまで ConoHa の VPS に RHEL9 をインストールする方法と、初期設定の解説をしてきました。今回はサーバー構築において、最も大事な部分であるファイアウォールの設定をしていきます。ファイアウォールの設定方針以前までは fire...

詳しい設定方法は以前の記事をご参照ください。

ついでに、Fail2ban の postfix・postfix-sasl と dovecot を有効にしておくと、連続して不正なアクセスがあった場合に自動でブロックしてくれます。

[postfix]
enabled = true
mode = aggressive

[postfix-sasl]
enabled = true

[dovecot]
enabled = true

postfix のモードを aggressive にすることで、通常の認証失敗だけでなく HELO 拒否などのプロトコル違反も検知対象になります。

/etc/fail2ban/jail.local の最終行に上記 3 項目を追加して、設定を反映させておきます。

fail2ban-client reload

メールユーザーを作成する

メール用のユーザーとグループを ID 番号を指定して作成します。

groupadd -g 10000 vmail
useradd -g 10000 -u 10000 -s /sbin/nologin vmail

※UID は設定ファイルに記述しますので、わかりやすくするために 10000 としました。

データベースを作成

メールのユーザーをデータベースで管理するので、phpMyAdmin から postfix ユーザーを作成し、同名のデータベースにすべての権限を与えます。

PostfixAdmin

PostfixAdmin 現時点での最新版である Version 3.3.13 をダウンロードします。

wget https://github.com/postfixadmin/postfixadmin/archive/refs/tags/postfixadmin-3.3.13.zip
unzip postfixadmin-3.3.13.zip
mv postfixadmin-postfixadmin-3.3.13 /usr/share/postfixAdmin
mkdir /usr/share/postfixAdmin/templates_c
chown nobody. /usr/share/postfixAdmin/ -R
rm -f postfixadmin-3.3.13.zip

OpenLiteSpeed に合わせて PostfixAdmin の所有者(グループ)を nobody にしていますが、Apache や Nginx の場合は適宜合わせてください。

PHP 関連パッケージのインストール

PostfixAdmin で使用する php-imap をインストールします。

dnf install lsphp82-imap
(out) サブスクリプション管理リポジトリーを更新しています。
(out) 依存関係が解決しました。
(out) =============================================================================================================================================================================================================================================================================================================================
(out)  パッケージ                                                                    アーキテクチャー                                                        バージョン                                                                    リポジトリー                                                                      サイズ
(out) =============================================================================================================================================================================================================================================================================================================================
(out) インストール:
(out)  lsphp82-imap                                                                  x86_64                                                                  8.2.11-2.el9                                                                  litespeed-update                                                                   43 k
(out) 
(out) トランザクションの概要
(out) =============================================================================================================================================================================================================================================================================================================================
(out) インストール  1 パッケージ
(out) 
(out) ダウンロードサイズの合計: 43 k
(out) インストール後のサイズ: 113 k
(out) これでよろしいですか? [y/N]: y

※OpenLiteSpeed 用の PHP8.2 に対応した lsphp82-imap をインストールしました。

各種スクリプトの設置

PostfixAdmin を解凍すると、ADDITIONS ディレクトリにサンプルスクリプトが入っています。

メールアドレス削除時の処理と、ドメイン削除時の処理をユーザーディレクトリにコピーします。

mkdir /home/vmail/bin
cp /usr/share/postfixAdmin/ADDITIONS/postfixadmin-mailbox-postdeletion.sh /home/vmail/bin/
cp /usr/share/postfixAdmin/ADDITIONS/postfixadmin-domain-postdeletion.sh /home/vmail/bin/
chown vmail:nobody -R /home/vmail/bin/
chmod 700 /home/vmail/bin/*.sh
mkdir /home/vmail/.deleted-maildirs
chown vmail. /home/vmail/.deleted-maildirs/

メールアドレス作成時のディレクトリの作成は Dovecot に任せますので、postfixadmin-mailbox-postcreation.sh は設定不要です。

メールアドレス削除時に走るスクリプトの編集

PostfixAdmin からメールアドレスを削除する際のスクリプトを編集します。

# Change this to where you keep your virtual mail users' maildirs.
#basedir=/var/spool/maildirs
basedir=/home/vmail

# Change this to where you would like deleted maildirs to reside.
#trashbase=/var/spool/deleted-maildirs
trashbase=/home/vmail/.deleted-maildirs

if [ ! -e "$maildir" ]; then
    echo "maildir '$maildir' does not exist; nothing to do."
    #exit 1
    exit 0
fi

ドメイン削除時に走るスクリプトの編集

PostfixAdmin からドメインを削除する際のスクリプトを編集します。

# Change this to where you keep your virtual mail users' maildirs.
#basedir=/var/spool/maildirs
basedir=/home/vmail

# Change this to where you would like deleted maildirs to reside.
#trashbase=/var/spool/deleted-maildirs
trashbase=/home/vmail/.deleted-maildirs

スクリプトの実行権限を調整

スクリプトを実行させるときのユーザーを sudo の例外に追加します。

visudo

スクリプトに対してパスワードなしで sudo できるように設定を追加します。

## Same thing without a password
# %wheel        ALL=(ALL)       NOPASSWD: ALL
nobody ALL=(vmail) NOPASSWD: /home/vmail/bin/postfixadmin-mailbox-postdeletion.sh
nobody ALL=(vmail) NOPASSWD: /home/vmail/bin/postfixadmin-domain-postdeletion.sh

※OpenLiteSpeed から実行するので nobody になっています。Apache やNginx の場合は適宜ユーザーを合わせてください。

https://e-garakuta.net/techinfo/doku.php/linux/postfix-virtual#%E5%89%8A%E9%99%A4%E5%87%A6%E7%90%86

※PostfixAdmin からメールアドレス削除やドメイン削除を行った時の処理は、メールアドレス(ドメイン)のディレクトリを .deleted-maildirs に移動するだけなので、ディスク容量を空けるためには手動で削除する必要があります。

OpenLiteSpeed の設定

OLS の管理画面から「バーチャルホスト」⇒ ホスト名 ⇒「コンテキスト」と辿り、静的コンテキストを追加します。

  • タイプ:Static
  • URI:/postfixadmin
  • 場所:/usr/share/postfixAdmin/public

ロケーションには PostfixAdmin のディレクトリ配下の public を指定します。

PostfixAdmin の設定ファイルを作成

PostfixAdmin の設定ファイル(config.inc.php)は編集せず、同じ階層の config.local.php で設定していきます。

<?php
$CONF['configured']        = true;
$CONF['setup_password']    = '';
$CONF['default_language']  = 'ja';
$CONF['database_type']     = 'mysqli';
$CONF['database_host']     = 'localhost';
$CONF['database_user']     = 'postfix';
$CONF['database_password'] = 'XXXXXXXXXXXX';
$CONF['database_name']     = 'postfix';
$CONF['database_prefix']   = '';
$CONF['footer_text']       = 'ドメイン名';
$CONF['footer_link']       = 'https://ドメイン名';
# パスワードのバリデーションを無効にする場合
#$CONF['password_validation'] = array();

$CONF['mailbox_postdeletion_script'] = 'sudo -u vmail /home/vmail/bin/postfixadmin-mailbox-postdeletion.sh';
$CONF['domain_postdeletion_script']  = 'sudo -u vmail /home/vmail/bin/postfixadmin-domain-postdeletion.sh';
?>

セットアップパスワードの取得

PostfixAdmin のセットアップ画面(https://ドメイン名/postfixadmin/setup.php)にアクセスして、Generate setup_password hash を行います。

ここで生成した setup_password を設定ファイル(config.local.php)に貼り付けます。

PostfixAdmin のセットアップ画面にログインして、エラーがなければ完了です。

※Postfix データベースの中のテーブルもこのタイミングで作成されます。

セットアップユーザーが完了したら、管理ユーザーとパスワードを登録しておきましょう。

Postfix のインストール

dnf install postfix postfix-mysql
(out) 依存関係が解決しました。
(out) ============================================================================================================================================================
(out)  パッケージ                        アーキテクチャー           バージョン                         リポジトリー                                         サイズ
(out) ============================================================================================================================================================
(out) インストール:
(out)  postfix                           x86_64                     2:3.5.9-24.el9                     rhel-9-for-x86_64-appstream-rpms                     1.5 M
(out)  postfix-mysql                     x86_64                     2:3.5.9-24.el9                     rhel-9-for-x86_64-appstream-rpms                      27 k
(out) 
(out) トランザクションの概要
(out) ============================================================================================================================================================
(out) インストール  2 パッケージ
(out) 
(out) ダウンロードサイズの合計: 1.5 M
(out) インストール後のサイズ: 4.4 M
(out) これでよろしいですか? [y/N]: y

Postfix の基本設定

#myhostname = virtual.domain.tld
myhostname = mail.ドメイン名

#mydomain = domain.tld
mydomain = ドメイン名

#myorigin = $mydomain
myorigin = $mydomain

#inet_interfaces = localhost
inet_interfaces = all

#home_mailbox = Maildir/
home_mailbox = Maildir/

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

home_mailbox(メールボックス形式)を Maildir 形式にするところがポイントです。

認証の設定

SASL(Simple Authentication and Security Layer)を設定して、メールの認証は Dovecot に任せます。

# SASL
smtpd_sasl_type             = dovecot
smtpd_sasl_path             = private/auth
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain     = $myhostname

# ここに記述すると 25 番ポートで認証してしまうので
# master.cf の smtps(465)や submission(587)に記述する
#smtpd_sasl_auth_enable    = yes
#
# Outlook Express 4 や Microsoft Exchange 5 向けなので不要
#broken_sasl_auth_clients  = yes

Virtual Mail Box の設定

ユーザー認証に MySQL(MariaDB)を使用するので、データベース接続用の各種クエリを作成します。

user = postfix
password = XXXXXXXXXXXX
hosts = localhost
dbname = postfix
table = mailbox
select_field = maildir
where_field = username
additional_conditions = and active = '1'
user = postfix
password = XXXXXXXXXXXX
hosts = localhost
dbname = postfix
table = domain
select_field = domain
where_field = domain
additional_conditions = and active = '1'
user = postfix
password = XXXXXXXXXXXX
hosts = localhost
dbname = postfix
table = alias
select_field = goto
where_field = address
additional_conditions = and active = '1'

Postfix の main.conf の最終行にバーチャルメールボックスについての設定を入れていきます。

また、メールのローカル配送は Dovecot に任せるため、virtual_transport には Dovecot を指定します。

# Virtual Mail Box
local_transport         = local
virtual_transport       = dovecot
virtual_uid_maps        = static:10000
virtual_gid_maps        = static:10000
virtual_minimum_uid     = 10000
virtual_mailbox_base    = /home/vmail
virtual_mailbox_maps    = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_alias_maps      = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_alias_domains   = $virtual_alias_maps
dovecot_destination_recipient_limit = 1

Postfix の master.cf の最終行に、ローカル配送を Dovecot に送る設定を追加します。

# Dovecot LDA
dovecot     unix  -      n       n       -       -       pipe
  flags=DRhu user=vmail:vmail argv=/usr/libexec/dovecot/dovecot-lda -f ${sender} -d ${recipient}

Postfix のセキュリティ設定

Postfix のセキュリティに関する設定を追加します。

main.cf の最終行に下記を追加してください。

# 内部ユーザの隠蔽
disable_vrfy_command = yes

# HELO/EHLO コマンドの要求
smtpd_helo_required = yes

# HELO/EHLO コマンド時の制限設定
smtpd_helo_restrictions =
        # $mynetworks 内からの接続は許可
        permit_mynetworks
        # EHLO ホスト名の文法が不正な場合に要求を拒否
        reject_invalid_hostname
        # EHLO ホスト名の文法が RFC で要求されているような完全修飾ドメイン形式ではない場合に要求を拒否
        reject_non_fqdn_hostname

# MAIL FROM コマンド時の制限設定
smtpd_sender_restrictions =
        # 送信者ドメインが存在しない(DNSに「A」や「MX」レコードが無い)場合に要求を拒否
        reject_unknown_sender_domain
        # 送信者ドメインが RFC で要求されているような完全修飾ドメイン形式ではない場合に要求を拒否
        reject_non_fqdn_sender

# RCPT TO コマンド時の制限設定
smtpd_recipient_restrictions =
        # アクセスしてきているクライアントのIPアドレスが$mynetworksにマッチする場合許可
        permit_mynetworks
        # SASL 認証に成功した場合のメール送信を許可
        permit_sasl_authenticated
        # このサーバで配送終了とならないドメイン宛メール送信要求を拒否(不正中継対応)
        reject_unauth_destination
        # このサーバで配送終了となるドメイン宛メール送信を許可
        permit_auth_destination

# メールリレーの設定
smtpd_relay_restrictions =
        # $mynetworks に記載されたクライアントからのメールリレーを許可
        permit_mynetworks
        # SASL 認証されたメールのリレーを許可
        permit_sasl_authenticated
        # 不明な宛先からのメールリレーを一時的なエラーコード(4xx)で拒否
        defer_unauth_destination

Postfix の起動

ここまでできたら、Postfix を起動します。

systemctl start postfix
systemctl enable postfix
(out) Created symlink /etc/systemd/system/multi-user.target.wants/postfix.service → /usr/lib/systemd/system/postfix.service.

Dovecot のインストール

Dovecot をインストールしていきます。MySQL でユーザー認証するため dovecot-mysql を、Sieve でメール振り分けをするので dovecot-pigeonhole もあわせてインストールします。

dnf install dovecot dovecot-mysql dovecot-pigeonhole
(out) 依存関係が解決しました。
(out) =============================================================================================================================================================
(out)  パッケージ                       アーキテクチャー     バージョン                                       リポジトリー                                   サイズ
(out) =============================================================================================================================================================
(out) インストール:
(out)  dovecot                          x86_64               1:2.3.16-10.el9                                  rhel-9-for-x86_64-appstream-rpms               4.9 M
(out)  dovecot-mysql                    x86_64               1:2.3.16-10.el9                                  rhel-9-for-x86_64-appstream-rpms                21 k
(out)  dovecot-pigeonhole               x86_64               1:2.3.16-10.el9                                  rhel-9-for-x86_64-appstream-rpms               390 k
(out) 依存関係のインストール:
(out)  clucene-core                     x86_64               2.3.3.4-42.20130812.e8e3d20git.el9               rhel-9-for-x86_64-appstream-rpms               590 k
(out)  libexttextcat                    x86_64               3.4.5-11.el9                                     rhel-9-for-x86_64-appstream-rpms               249 k
(out)  libstemmer                       x86_64               0-18.585svn.el9                                  rhel-9-for-x86_64-appstream-rpms                85 k
(out) 
(out) トランザクションの概要
(out) =============================================================================================================================================================
(out) インストール  6 パッケージ
(out) 
(out) ダウンロードサイズの合計: 6.2 M
(out) インストール後のサイズ: 22 M
(out) これでよろしいですか? [y/N]: y

Dovecot の設定ファイルは、dovecot.conf と同じディレクトリに local.conf を新規作成して、全てそちらに記述するようにします。

touch /etc/dovecot/local.conf
# デバッグ関係
#auth_verbose = yes
#auth_debug = yes
#mail_debug = yes
#auth_debug_passwords = yes

listen = *
log_path = syslog
maildir_stat_dirs = yes
disable_plaintext_auth = no
auth_mechanisms = cram-md5 plain login

# @以降なし
mail_location = maildir:/home/vmail/%d/%n
# @以降あり
#mail_location = maildir:/home/vmail/%d/%u

first_valid_uid = 10000

protocols = imap lmtp sieve
protocol imap {
  mail_plugins = $mail_plugins
}
protocol lmtp {
  mail_plugins = $mail_plugins
}
protocol lda {
  mail_plugins = $mail_plugins
}

passdb {
  driver = sql
  args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
  driver = sql
  args = /etc/dovecot/dovecot-sql.conf.ext
}

service auth {
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = vmail
  }
}

service stats {
  unix_listener stats-reader {
    user = vmail
    group = vmail
    mode = 0660
  }
  unix_listener stats-writer {
    user = vmail
    group = vmail
    mode = 0660
  }
}

# 初回ログイン時にディレクトリを自動作成
namespace inbox {
  inbox = yes
  location = maildir:~/maildir
  mailbox Drafts {
    auto = subscribe
  }
  mailbox Junk {
    auto = subscribe
  }
  mailbox Trash {
    auto = subscribe
  }
  mailbox Sent {
    auto = subscribe
  }
}
# Archive フォルダのみ sdbox 形式
namespace archive {
  location = sdbox:~/
  separator = .
  prefix = Dbox.
  mailbox Archive {
    auto = subscribe
  }
}

Archive フォルダーにはパフォーマンスが高いといわれている Single-dbox(sdbox)形式を使ってみます。そのため、Maildir 形式の場合は maildir に纏めるように location を変更しました。

Attention Required! | Cloudflare

10-auth.conf を編集して、使用しない設定を読み込まないようにします。

auth_mechanisms = plain
↓(コメントアウトする)
#auth_mechanisms = plain

!include auth-system.conf.ext
↓(コメントアウトする)
#!include auth-system.conf.ext

Dovecot の SQL 接続設定ファイル(dovecot-sql.conf.ext)を作成します。

touch /etc/dovecot/dovecot-sql.conf.ext
chmod 700 /etc/dovecot/dovecot-sql.conf.ext
driver = mysql
connect = host=/var/lib/mysql/mysql.sock dbname=postfix user=postfix password=XXXXXXXXXXXX
default_pass_scheme = MD5-CRYPT
password_query = SELECT username AS user, password FROM mailbox WHERE username = '%u' AND active = '1'
user_query = SELECT concat('/home/vmail/', maildir) AS home, 10000 AS uid, 10000 AS gid FROM mailbox WHERE username = '%u' AND active = '1'
iterate_query = SELECT username as user FROM mailbox WHERE active = '1'

Dovecot を起動します。

systemctl start dovecot
systemctl enable dovecot
(out) Created symlink /etc/systemd/system/multi-user.target.wants/dovecot.service → /usr/lib/systemd/system/dovecot.service.

SSL 対応

ウェブサーバー構築の際に取得した SSL 証明書を再利用します。

Let's Encrypt のワイルドカード証明書を取得した場合は、下記のように設定します。

Postfix

まず main.cf を編集します。

smtpd_~ は受信時に対して、smtp_~ は送信時に対する設定となります。

# TLS CONFIGURATION
#
# Basic Postfix TLS configuration by default with self-signed certificate
# for inbound SMTP and also opportunistic TLS for outbound SMTP.

tls_high_cipherlist = ECDHE+AESGCM:ECDHE+CHACHA20:ECDHE+AES

# The full pathname of a file with the Postfix SMTP server RSA certificate
# in PEM format. Intermediate certificates should be included in general,
# the server certificate first, then the issuing CA(s) (bottom-up order).
#
#smtpd_tls_cert_file = /etc/pki/tls/certs/postfix.pem
smtpd_tls_cert_file = /etc/letsencrypt/live/ドメイン名/fullchain.pem

# The full pathname of a file with the Postfix SMTP server RSA private key
# in PEM format. The private key must be accessible without a pass-phrase,
# i.e. it must not be encrypted.
#
#smtpd_tls_key_file = /etc/pki/tls/private/postfix.key
smtpd_tls_key_file = /etc/letsencrypt/live/ドメイン名/privkey.pem

# Announce STARTTLS support to remote SMTP clients, but do not require that
# clients use TLS encryption (opportunistic TLS inbound).
#
smtpd_tls_security_level = may

# 受信時の暗号設定
smtpd_use_tls                 = yes
smtpd_tls_ciphers             = high
smtpd_tls_protocols           = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtpd_tls_eecdh_grade         = strong
smtpd_tls_mandatory_ciphers   = high
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1

smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache

# Directory with PEM format Certification Authority certificates that the
# Postfix SMTP client uses to verify a remote SMTP server certificate.
#
smtp_tls_CApath = /etc/pki/tls/certs

# The full pathname of a file containing CA certificates of root CAs
# trusted to sign either remote SMTP server certificates or intermediate CA
# certificates.
#
smtp_tls_CAfile = /etc/pki/tls/certs/ca-bundle.crt

# Use TLS if this is supported by the remote SMTP server, otherwise use
# plaintext (opportunistic TLS outbound).
#
smtp_tls_security_level = may

# 送信時の暗号設定
smtp_tls_ciphers             = high
smtp_tls_protocols           = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtp_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtp_tls_loglevel            = 1
メールサーバー間通信内容暗号化(Postfix+Dovecot+OpenSSL+Let's Encrypt+Certbot) - AlmaLinuxで自宅サーバー構築
メールサーバー間通信内容暗号化(Postfix+Dovecot+OpenSSL+Let's Encrypt+Certbot)

次に master.cf の smtps の項目をコメント解除します。

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=
#  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING

設定したら、Postfix を再起動します。

systemctl restart postfix

Dovecot

Dovecot は 10-ssl.conf で証明書の場所を指定します。

#ssl_cert = </etc/pki/dovecot/certs/dovecot.pem
ssl_cert = </etc/letsencrypt/live/ドメイン名/fullchain.pem

#ssl_key = </etc/pki/dovecot/private/dovecot.pem
ssl_key = </etc/letsencrypt/live/ドメイン名/privkey.pem

設定したら、Dovecot を再起動します。

systemctl restart dovecot

Quota(容量制限)の設定

ユーザーごとにメールボックスの容量を制限したい場合は、Quota の設定を追加します。

Quota の方法としては、過去には Postfix に VDA パッチを当てたり、データベースのディクショナリ(dict)形式があったりしましたが、Dovecot 2.2.19 以降では count 形式が推奨されているようです。

Dovecot の設定

Dovecot の設定に Quota の設定を追加します。

mail_plugins = $mail_plugins quota

protocol imap {
  mail_plugins = $mail_plugins imap_quota
}

# Quota の設定
service quota-status {
  executable = quota-status -p postfix
  inet_listener {
    port = 12340
  }
  client_limit = 1
}
plugin {
  quota_status_success = DUNNO
  quota_status_nouser = DUNNO
  quota_status_overquota = "552 5.2.2 Mailbox is full"
  # 容量超過猶予
  quota_grace = 10%%
}
plugin {
  quota = count:User quota
  quota_max_mail_size = 100M
  quota_vsizes = yes
}

Dovecot の SQL 接続設定ファイル(dovecot-sql.conf.ext)を修正して、Quota の値を取得するようにします。

#user_query = SELECT CONCAT('/home/vmail/', maildir) AS home, 10000 AS uid, 10000 AS gid FROM mailbox WHERE username = '%u' AND active = '1'
user_query = SELECT CONCAT('/home/vmail/', maildir) AS home, 10000 AS uid, 10000 AS gid, CONCAT('*:bytes=', quota) AS quota_rule FROM mailbox WHERE username = '%u' AND active = '1'
postfixadmin/DOCUMENTS/DOVECOT.txt at master ?? postfixadmin/postfixadmin
PostfixAdmin - web based virtual user administration interface for Postfix mail servers - postfixadmin/postfixadmin

設定を反映するために Dovecot を再起動します。

systemctl restart dovecot

Postfix の設定

Postfix に設定を追加し、Dovecot と連携させるように設定を変更します。

main.cf の smtpd_recipient_restrictions に check_policy_service を追加することで、メール送信前に Dovecot に容量を確認するようになります。

# RCPT TO コマンド時の制限設定
smtpd_recipient_restrictions =
        # アクセスしてきているクライアントのIPアドレスが$mynetworksにマッチする場合許可
        permit_mynetworks
        # SASL 認証に成功した場合のメール送信を許可
        permit_sasl_authenticated
        # このサーバで配送終了とならないドメイン宛メール送信要求を拒否(不正中継対応)
        reject_unauth_destination
        # Dovecot に容量制限を確認する
        check_policy_service inet:127.0.0.1:12340
        # このサーバで配送終了となるドメイン宛メール送信を許可
        permit_auth_destination

check_policy_service は必ず reject_unauth_destination の「後に」指定してください。そうしないとシステムがオープンリレーになってしまいます。

Postfix SMTP アクセスポリシー委譲 (postfix-jp.info)

設定したら Postfix を再起動しておきます。

systemctl restart postfix

PostfixAdmin の設定

最後に PostfixAdmin の設定ファイルを編集し、Quota を使用するように変更します。

$CONF['quota'] = 'YES';

メール振り分けの設定

Sieve の設定

ローカルメール配信エージェントである LMTP(Local Mail Transfer Protocol)と、LDA(Local Delivery Agent)に Sieve のプラグインを適用していきます。

/etc/dovecot/local.conf で lmtp と lda のプラグインに sieve を追記します。

protocol lmtp {
  mail_plugins = $mail_plugins sieve
}
protocol lda {
  mail_plugins = $mail_plugins sieve
}

Dovecot を再起動して設定を反映します。

Procmail の設定

普段使いのメール振り分けは Sieve で事足りるのですが、より細かい条件で振り分けが必要な場合は Procmail に頼る必要もあると思います。

最近もメールアドレスを跨いだ振り分けルールを設定して、バックアップメールを集約する要件があったので Procmail を併用する方法も覚書として記述しておきます。

まずは Procmail をインストールします。

dnf install procmail
(out) 依存関係が解決しました。
(out) =============================================================================================================================================================
(out)  パッケージ                     アーキテクチャー             バージョン                         リポジトリー                                           サイズ
(out) =============================================================================================================================================================
(out) インストール:
(out)  procmail                       x86_64                       3.22-56.el9                        rhel-9-for-x86_64-appstream-rpms                       188 k
(out) 
(out) トランザクションの概要
(out) =============================================================================================================================================================
(out) インストール  1 パッケージ
(out) 
(out) ダウンロードサイズの合計: 188 k
(out) インストール後のサイズ: 367 k
(out) これでよろしいですか? [y/N]: y

main.cf で transport_maps を読み込むように変更します。

virtual_transport = virtual
transport_maps = hash:/etc/postfix/transport
procmail_destination_recipient_limit = 1

transport ファイルに Procmail を使いたいメールアドレス(またはドメイン)を列挙し、procmail: を指定します。

Sieve で振り分けるメールアドレス(またはドメイン)には dovecot: を指定します。

記述が上から順番に評価され、ヒットした条件でメールが配送されるので、個別のメールアドレスは上部、それ以外のドメイン全体の条件は下部に記述すると良いでしょう。

john@example.com      procmail:
smith@example.net     procmail:
     ・
     ・
     ・
example.com           dovecot:
example.net           dovecot:
     ・
     ・
     ・

設定ファイルを postmap コマンドで変換します。

postmap /etc/postfix/transport

master.cf の最終行に Procmail の設定を追加します。

# Procmail
procmail    unix  -      n       n       -       -       pipe
 flags=R user=vmail argv=/usr/bin/procmail -t -m USER=${user} DOMAIN=${nexthop} /etc/procmailrc

/etc/procmailrc を作成して、メールユーザーごとの .procmailrc を読み込むように設定します。

SHELL=/bin/bash
PATH=/usr/bin
DEFAULT=/home/vmail/$DOMAIN/$USER
LOCKFILE=/home/vmail/$DOMAIN/$USER/procmail.lock

# User .procmailrc
:0
* ? test -e "$DEFAULT/.procmailrc"
| /usr/bin/procmail -t -m USER=$USER DOMAIN=$DOMAIN $DEFAULT/.procmailrc

Procmail を設定するユーザーのディレクトリに .procmailrc を作成して、振り分けルールを記述します。

SHELL=/bin/bash
PATH=/usr/bin
MAILDIR=/home/vmail/$DOMAIN/$USER
DEFAULT=$MAILDIR/
LOCKFILE=$MAILDIR/procmail.lock
LOGFILE=$MAILDIR/procmail.log
    ・
    ・
    ・

Postfix を再起動します。

systemctl restart postfix

ドメインとメールアドレスの作成

先ほど設定した PostfixAdmin にログインし、メールアドレスを作成します。

  1. PostfixAdmin(https://ドメイン名/postfixadmin/)にログインする
  2. ドメイン一覧から新しいドメインを作成します
  3. 作成したドメインの画面を開き、メールアドレスを追加します。

Web メール(SnappyMail)の設定

実際に MUA(電子メールクライアント)から接続して、メールの送受信ができるか確認しておきましょう。

Outlook や Thunderbird が使える環境の方はそちらに設定を入れても良いですが、今回は Web メールで行います。

Rainloop を導入しようと思っていましたが、2022 年で更新が途絶えてしまっているため、後継の SnappyMail を代わりに使ってみます。

SnappyMail, your webmail client - SnappyMail
mkdir snappymail
cd snappymail/
wget https://snappymail.eu/repository/latest.tar.gz
tar -zxvf latest.tar.gz
rm -f latest.tar.gz
mv _include.php include.php
cd
mv snappymail/ /usr/share/
find /usr/share/snappymail/ -type d -exec chmod 755 {} \;
find /usr/share/snappymail/ -type f -exec chmod 644 {} \;
chown nobody. -R /usr/share/snappymail/

OpenLiteSpeed の設定

OLS の管理画面にログインし、バーチャルホスト ⇒(バーチャルホスト名)⇒ コンテキストと辿り、SnappyMail の設定を追加します。

もう一つコンテキストを追加し、/snappymail/data ディレクトリへのアクセスをブロックします。

SnappyMail の初期設定

SnappyMail の管理画面(https://ドメイン名/snappymail/?admin)にアクセスします。

  • ユーザー名:admin
  • パスワード:/usr/share/snappymail/data/_data_/_default_/admin_password.txt を参照
  • TOTP コード:(空欄)

最初に管理者パスワードの変更と、ドメインの設定を行います。その際 Sieve スクリプトを使用する設定で「テスト」が通るか確認しておきましょう。

また、PHP optional extensions の項目でいくつか不足しているものがあります。OpenLiteSpeed 用の PHP8.2 で簡単に導入できるものだけ入れておくことにします。

dnf install lsphp82-apcu lsphp82-sodium lsphp82-intl lsphp82-tidy
dnf --enablerepo=remi install ImageMagick7
dnf install lsphp82-imagick

インストールができたら OpenLiteSpeed を再起動しておきます。

メールの送受信テスト

SnappyMail の管理画面ではなく、一般のログイン画面(https://ドメイン名/snappymail/)を表示します。

先ほど作成したメールアドレスとパスワードでログインし、メールの送受信ができるかどうかテストしておきましょう。

Sieve のルールを追加

SnappyMail にユーザーとしてログインした画面で、「設定」⇒「フィルター」と辿ると以下の画面になります。

分かりづらいですが Simple の項目にある rainloop.user から Sieve のルールを編集できます。

クリックすると「スクリプトを編集:rainloop.user」の画面になりますので、「フィルターを追加」から振り分けルールを追加します。

ルールを追加したら必ず「保存」をして反映しましょう。

後編に続く

長くなってしまったので、一旦ここまで。

後編では DKIM や SPF の設定などを入れつつ RSpamd による迷惑メール対策やウイルスチェックを設定していきます。

Red Hat Enterprise Linux 9 にメールサーバーを構築(後編)
前編では Postfix +Dovecot + PostfixAdmin の設定をしてきました。今回はそこに Rspamd による 迷惑メール対策、ClamAntiVirus によるウイルススキャンを連動させていこうと思います。スパムメール...
ConoHa VPS

コメント

  1. 自分もRHEL9でサーバを構築しようとしているので、参考にさせてもらっています。
    一つ気になった点があるので連絡します。
    main.cfに
    smtpd_sasl_auth_enable = yes
    と書くと、25番ポートでの認証が有効になるようです。
    25番ポートはパスワードクラック行為がひどいので、無効にされるのが良いと思います。

    • smtpd_sasl_auth_enable の意味を間違って認識していました。
      仰る通り 25 番ポートでの認証が有効になってしまっていたので、無効にしたほうが良いですね。
      記事の方も訂正させていただきます。

      ご指摘ありがとうございました!

タイトルとURLをコピーしました