Postfix, PostfixAdmin, Dovecot の導入 (MariaDB連携, SMTP-Auth, Sieve)

あわせて読みたい
「Google社・米国Yahoo社が2024年2月よりメール受信の厳格化」に対応するためのまとめ 【SPF、DKIM、DMA... 迷惑メールや不正行為の対応するための手段として、SPF、DKIM、DMARC等の技術が使われてきました。今までは、比較的容易に対応可能なSPFだけ対応していれば問題なく利用...

Postfixは、オープンソースの高速かつセキュアなSMTPサーバーです。主にメールの送信機能(MTA:Mail Transfer Agent)を担当します。

Dovecotは、オープンソースのIMAP/POP3電子メールサーバーであり、受信メールの取得機能(MDA:Mail Delivery Agent)と保存機能(LDA:Local Delivery Agent)を担当します。軽量でありながら高いパフォーマンスが特徴で、大規模なメールシステムでも安定して動作します。

PostfixAdminは、オープンソースのWebベースのインターフェースで、Postfixメールサーバーシステムを管理するためのツールです。PostfixAdminを使用することで、簡単な操作でメールアドレスやドメイン、エイリアス(別名)などの管理が可能になります。また、パスワード変更機能や送信制限(Quota)の設定も行えます。

Dovecot Sieveは、Dovecotメールサーバーに統合されているメールフィルタリングエンジンです。これを使用すると、電子メールの受信や配信前にルールに基づいた自動処理を行うことができます。Sieve(シーブ)という名前は、このルール言語の名前でもあります。Sieveの主な目的は、メールボックスへの配置、返信、フォワード、メールの破棄など、メッセージ処理の自動化です。

目次

Postfixの主な特徴

  • パフォーマンス: 高速かつ安定したメール送信が可能です。
  • セキュリティ: よく考慮されたデフォルト設定や拡張機能により、セキュアな運用ができます。
  • 柔軟性: 多くの設定オプションと拡張機能により、様々な要件に対応が可能です。
  • 互換性: Sendmailと互換性があり、既存のSendmail環境からの移行も容易です。

Dovecotの主な特徴

  • パフォーマンス: 高速かつ省リソースで動作し、大量のメールやアカウントも処理可能です。
  • セキュリティ: デフォルトでTLS/SSL接続がサポートされており、安全な通信が行えます。
  • 検索機能: 内蔵の全文検索機能により、メールの検索が高速かつ正確に行えます。
  • 拡張性: 多くのプラグインが用意されており、自由に機能を追加・変更できます。

PostfixとDovecotを組み合わせることで、効率的かつセキュアなメールサーバーシステムを構築することができます。また、RoundcubeなどのWebメールクライアントと連携させることで、より便利なメール環境を提供できます。

Dovecot Sieve の特徴

  • シンプルで理解しやすいルール記述可能
  • メールボックスに変更を加えずにクライアント側で利用可能
  • 柔軟なルール設定により様々な条件に応じた処理が可能

基本的なSieveスクリプト構文

Sieveスクリプトはテキストファイルで、次の構造を持っています。

require "fileinto";

if header :contains "subject" "example" {
    fileinto "INBOX.example";
} else {
    fileinto "INBOX.other";
}

この例では、件名(Subject)にexampleが含まれるメールはINBOX.exampleフォルダに移動し、そうでない場合はINBOX.otherフォルダに移動するというルールが設定されています。

Dovecot Sieveの設定方法

  1. システムにDovecotがインストールされていることを確認し、必要であればSieveモジュールもインストールしてください。
  2. Dovecotの設定ファイル(一般的に/etc/dovecot/dovecot.conf)で以下のような設定ブロックを追加・編集します。
plugin {
  sieve = ~/.dovecot.sieve
  sieve_global_path = /etc/dovecot/sieve/default.sieve
}

ここでは、シーブ スクリプトの場所(各ユーザーごとのファイルやグローバルなデフォルトファイル)を指定しています。

  1. 再びシステム全体のエディターで作成した_sieve_スクリプトを利用に合わせて編集し、それぞれのディレクトリに配置してください。
  2. 設定変更が完了したら、Dovecotサービスを再起動して新しい_sieve_ルールを有効にします。

Sieveのレシピは、RoundCube(Webメール)やThunderBirdのようなSieve対応のメーラーで編集できます。

PostfixAdmin の特徴

  • ドメイン管理: Postfixで複数のドメインを運用している場合、ドメインごとのメールアカウントの追加や削除が容易に行えます。
  • メールボックス管理: メールボックスの作成、編集、削除を行えます。パスワード変更やメールキャッチオールの設定も可能です。
  • エイリアス管理: 別名(エイリアス)の作成、編集、削除を行うことができます。これにより、1つのメールアドレスに複数のエイリアスを設定できます。
  • 自動応答機能: 休暇中や不在時などに自動的に返信メッセージを送信する機能を設定できます。
  • 送信制限(Quota)設定: メールボックスの送信制限を設定することができます。これにより、送信量が一定値を超えた場合に送信をブロックできます。

これらの機能は、Webブラウザからアクセス可能なグラフィカルなインターフェースで操作できるため、Postfixメールサーバーの管理が非常に便利になります。

前提条件

Apache, MariaDB(MySQL)がすでに導入済みであることを前提とします。

あわせて読みたい
Apache, PHP 8.3 (PHP-FPM) の導入 更新:PHP8.2からPHP8.3へ変更しました。 PHP8.2の場合は 8.3を8.2に置き換えるだけです。CentOSでApache, PHP 8.3 (PHP-FPM) とMariaDBを使用してセキュアなWEBサーバ...
あわせて読みたい
MariaDB(MySQL) の導入 MariaDBは、MySQLをベースに開発されたオープンソースのデータベース管理システムです。MySQLからのリレーショナルデータベース管理システムMariaDBは、性能の向上や新...

Postfix, PostfixAdmin, Dovecot, SMTP-Auth パッケージをインストール

EPELリポジトリとRemiリポジトリを追加し、最新バージョンのPostfix, PostfixAdmin, Dovecotをインストールできるようにします。

sudo yum -y install epel-release

必要なモジュールをインストールしておきます。

sudo yum -y install wget unzip php-mbstring
sudo yum -y install postfix-pcre

SMTP-Auth の導入

SMTP-Auth のパッケージをインストールします。

sudo yum -y install cyrus-sasl cyrus-sasl-plain cyrus-sasl-md5

sudo systemctl enable saslauthd
sudo systemctl start saslauthd

MariaDB の設定

mysql -u root -p

MariaDBにログインし、データベースとユーザーを作成します。

CREATE DATABASE postfix;
GRANT ALL PRIVILEGES ON postfix.* TO 'postfix'@'localhost' IDENTIFIED BY 'ここにパスワード';
FLUSH PRIVILEGES;

Postfix の設定

Postfix のモジュールをインストールします。

sudo yum -y install postfix postfix-mysql

/etc/postfix/main.cf

このファイルには、Postfixの動作を制御するための各種パラメータが含まれています。一般的な設定項目は以下の通りです。

  • myhostname: メールサーバーのホスト名。例:mail.example.com
  • mydomain: メールサーバーが担当するドメイン。例:example.com
  • myorigin: 送信メールのデフォルトドメイン。通常、$mydomainと同じ値を使用します。
  • inet_interfaces: Postfixがリッスンするネットワークインターフェース。すべてのインターフェースでリッスンする場合は、all を指定します。
  • mydestination: ローカル配信を行うべきドメインやホスト名のリスト。複数のドメインを指定する場合は、カンマで区切ります。
  • mynetworks: リレー(中継)を許可するネットワークアドレスのリスト。CIDR記法を使用して指定します。例:192.168.0.0/24
  • relay_domains: 外部のドメインへメールのリレー(中継)を許可するドメインのリスト。空に設定すると、リレーを許可しない(ローカル配信のみ)ようになります。

/etc/postfix/main.cf を編集します。

sudo vi /etc/postfix/main.cf

以下の設定を追加または変更してください。
myhostname に設定するホスト名は Linux のホスト名に設定されているか確認してください。

myhostname = your_hostname.your_domain
mydomain = your_domain
inet_interfaces = all
inet_protocols = ipv4
##mydestination = $myhostname, localhost.$mydomain, localhost
mydestination =
mynetworks = 127.0.0.0/8
home_mailbox = Maildir/

####mailbox_command = /usr/libexec/dovecot/deliver
## 追加
allow_mail_to_commands = alias,forward,include

# Let's Encrypt証明書などを指定する
##smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example.com/fullchain.pem
##smtpd_tls_key_file = /etc/letsencrypt/live/mail.example.com/privkey.pem

smtpd_tls_cert_file = /etc/pki/tls/certs/mail.example.com.crt
smtpd_tls_key_file = /etc/pki/tls/private/mail.example.com.key

# 追加
#
### SMTP-Auth
#
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_local_domain = $mydomain
smtpd_client_restrictions = reject_rbl_client bl.spamcop.net,
        reject_rbl_client cbl.abuseat.org,
        reject_rbl_client truncate.gbudb.net,
        check_client_access hash:/etc/postfix/reject_client,
        permit
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes

#
### Virtual Domains
#
tls_server_sni_maps=hash:/etc/postfix/tls_server_sni_maps
##local_transport = virtual
##virtual_transport = virtual
virtual_transport = lmtp:unix:private/dovecot-lmtp
virtual_mailbox_base = /home/mailuser
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
##virtual_alias_domains = $virtual_alias_maps
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_minimum_uid = 10000
virtual_uid_maps = static:10000
virtual_gid_maps = static:10000
# Mailbox limit(クォーターの設定はなし)
##virtual_mailbox_limit = 0

#
### SSL/TLS Settings
#
smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache
smtpd_tls_session_cache_timeout = 3600s
smtpd_tls_received_header = yes
smtpd_tls_loglevel = 0

#
# OpenDKIM:8891 & OpenARC:8892 & OpenDMARC:8893 
#
milter_default_action = accept
milter_protocol = 6
smtpd_milters = inet:localhost:8891,inet:localhost:8892,inet:localhost:8893
non_smtpd_milters = inet:localhost:8891,inet:localhost:8892,inet:localhost:8893

#
### SRS (Sender Rewriting Scheme)
# SRSを無効にする場合は、sender_canonical_mapsをコメントアウト
sender_canonical_maps = hash:/etc/postfix/canonical,tcp:localhost:10001
recipient_canonical_maps = tcp:localhost:10002

#
### その他
#
#disable_vrfy_command = yes
#sender_canonical_maps = hash:/etc/postfix/canonical

DKIM, DMARC, ARC はそれぞれ異なる目的のために使用されるメール認証技術です。これらを Milters として Postfix で実装する場合、通常の推奨される順序は以下の通りです。

  1. DKIM (DomainKeys Identified Mail) – メールの署名および検証を行う。
  2. ARC (Authenticated Received Chain) – メールの受信者が前段までの中継経路の認証結果を追跡・確認できるようにする。
  3. DMARC (Domain-based Message Authentication, Reporting and Conformance) – DKIM や SPF の認証結果を基に、ドメイン所有者のポリシーに従ってメール処理を制御する。

したがって、Postfix の smtpd_milters 設定は次のようになります。

smtpd_milters = inet:localhost:<DKIM_PORT>,inet:localhost:<ARC_PORT>,inet:localhost:<DMARC_PORT>

<DKIM_PORT><ARC_PORT><DMARC_PORT> はそれぞれの Milter に適用されるポート番号に置き換えてください。各 Milter が互いに影響を与えず独立して動作することが期待されますが、上記の順序に従うことで、最適な結果が得られます。

/etc/postfix/master.cf

Postfixメールサーバーのデーモン(プロセス)やサービスの設定が記述されたファイルです。ここでは、稼働させるデーモンやそれらの設定を構成します。

sudo vi /etc/postfix/master.cf
submission inet n       -       n       -       -       smtpd
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject

smtps     inet  n       -       n       -       -       smtpd
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject

/etc/postfix/mysql_virtual_domains_maps.cf

Postfixメールサーバーが仮想ドメインとメールボックスを管理するためにMySQLデータベースとの連携を設定するためのファイルです。
このファイルに記述される設定は、PostfixがMySQLデータベースから仮想ドメイン情報を取得する方法を指定します。具体的な設定項目は以下の通りです。

  • user: MySQLデータベースへの接続に使用するユーザー名。
  • password: ユーザーのパスワード。
  • hosts: 接続先のMySQLサーバーのアドレス。例:localhostまたは別のサーバーのIPアドレス。
  • dbname: 使用するMySQLデータベースの名称。
  • query: 実行するSQLクエリ。通常、メールアドレスに対応するドメインの情報を取得するためのものです。

queryの代わりにselect_fieldwhere_fieldadditional_conditionsを使用する場合は、以下のように設定ファイルを書き換えます。

sudo vi /etc/postfix/mysql_virtual_domains_maps.cf 
user = postfix
password = ここにパスワード
dbname = postfix
hosts = localhost
table = domain
# query = SELECT domain FROM domain WHERE domain='%s'
select_field = domain
where_field = domain
additional_conditions = and active = '1'

/etc/postfix/mysql_virtual_alias_maps.cf

Postfixの仮想エイリアスマップを構成するための設定ファイルです。このファイルでは、MySQLデータベースと接続する方法、およびエイリアスの情報を取得するためのクエリが定義されています。

この設定ファイルで重要な部分は以下の通りです

  • user: MariaDB(MySQL)データベースへの接続に使用するユーザー名。
  • password: ユーザーのパスワード。
  • hosts: データベースサーバーのアドレス。通常はローカルサーバー(localhost)ですが、リモートサーバーの場合はそのIPアドレスやホスト名を指定します。
  • dbname: Postfixが使用するMariaDB(MySQL)データベースの名前。
  • query: エイリアス情報を取得するためのSQLクエリ。この例では、virtual_aliasesテーブルから、sourceカラムが入力されたメールアドレス(%s)に該当する行のdestinationカラムを取得します。

queryの代わりにselect_fieldwhere_fieldadditional_conditionsを使用する場合は、以下のように設定ファイルを書き換えます。

/etc/postfix/mysql_virtual_alias_maps.cf を編集します。

sudo vi /etc/postfix/mysql_virtual_alias_maps.cf
user = postfix
password = ここにパスワード
dbname = postfix
hosts = localhost
table = alias
select_field = goto
where_field = address

/etc/postfix/mysql_virtual_mailbox_maps.cf

Postfixの仮想メールボックスマップを構成するための設定ファイルです。このファイルでは、MySQLデータベースと接続する方法および仮想メールボックス情報を取得するためのクエリが定義されています。

この設定ファイルで重要な部分は以下の通りです。

  • user: MySQLデータベースへの接続に使用するユーザー名。
  • password: ユーザーのパスワード。
  • hosts: データベースサーバーのアドレス。通常はローカルサーバー(127.0.0.1)ですが、リモートサーバーの場合はそのIPアドレスやホスト名を指定します。
  • dbname: Postfixが使用するMySQLデータベースの名前。
  • query: 仮想メールボックス情報を取得するためのSQLクエリ。この例では、virtual_usersテーブルから、emailカラムが入力されたメールアドレス(%s)に該当する行のmaildirカラムを取得します。

/etc/postfix/mysql_virtual_mailbox_maps.cf を編集します。

sudo vi /etc/postfix/mysql_virtual_mailbox_maps.cf
user = postfix
password = ここにパスワード
hosts = localhost
dbname = postfix
table = mailbox
select_field = maildir
where_field = username

Postfixは、この設定に従ってMySQLデータベースに接続し、仮想メールボックスに関連する情報を検索・取得します。その結果をもとに、メールの配信先ディレクトリ(メールボックス)を特定し、正確なメール配信を行います。


パスワードが平文で書かれているので、ファイルのパーミッションを変更しておきます。

sudo chgrp postfix /etc/postfix/mysql_virtual_domains_maps.cf
sudo chgrp postfix /etc/postfix/mysql_virtual_alias_maps.cf
sudo chgrp postfix /etc/postfix/mysql_virtual_mailbox_maps.cf

sudo chmod 0640 /etc/postfix/mysql_virtual_domains_maps.cf
sudo chmod 0640 /etc/postfix/mysql_virtual_alias_maps.cf
sudo chmod 0640 /etc/postfix/mysql_virtual_mailbox_maps.cf

tls_server_sni_maps.db

tls_server_sni_maps は、Postfix メールサーバーでTLS(Transport Layer Security)を使用する際に、SNI(Server Name Indication)を利用して動的に接続先サーバの証明書を選択するための設定です。

SNIはTLSハンドシェイクの際にクライアントが要求するサーバ名を伝えることで、複数のホスト名が同じIPアドレスで運用されている場合でも正しい証明書を使って通信を暗号化する技術です。

/etc/postfix/tls_server_sni_maps を作成し、ドメイン毎に使用する証明書と秘密鍵のパスを設定します。

sudo vi /etc/postfix/tls_server_sni_maps
example.com /etc/ssl/certs/example.com.crt /etc/ssl/private/example.com.key
example.net /etc/ssl/certs/example.net.crt /etc/ssl/private/example.net.key

設定ファイルからHash形式のデータベースを生成します。
-Fオプションを付けてBase64で保存します。

sudo postmap -F /etc/postfix/tls_server_sni_maps
sudo postmap /etc/postfix/canonical
sudo postmap /etc/postfix/reject_client
sudo postmap /etc/postfix/virtual

設定が完了したら、Postfixを起動します。
postfix check でPostfixの設定の文法上の誤りがないか確認できます。

sudo postfix check

sudo systemctl enable postfix
sudo systemctl start postfix

sudo systemctl restart postfix

PostfixAdmin の設定

必要なパッケージのインストール

追加で必要なパッケージがある場合は次のようにインストールしてください。

sudo yum install wget unzip php-mbstring

PostfixAdminのダウンロード

最新バージョンのPostfixAdminをダウンロードし、適切なディレクトリに展開します。
展開した中に INSTALL.TXT をいうファイルで設定手順があります。
何か、インストール時に問題がありましたら参考にされると良いかと思います。

cd /var/www
wget https://sourceforge.net/projects/postfixadmin/files/postfixadmin-3.3.8/PostfixAdmin%203.3.8.tar.gz
tar zxvf 'PostfixAdmin 3.3.8.tar.gz'
rm 'PostfixAdmin 3.3.8.tar.gz'

sudo mv postfixadmin-postfixadmin-7d04685 postfixadmin

config.local.php (config.inc.php) ファイルの設定

デフォルトの設定ファイルconfig.inc.phpがあり、それをconfig.local.phpで設定を上書きするようになっています。変更内容は、config.local.php まとめましょう。

Postfixadmin のセットアップ画面にログインするためのハッシュを設定しておきます。
セットアップのパスワードのhash はセットアップ画面で作成することもできます。
※パスワードは5文字以上で指定しないと警告が表示され使用できません。

cd /var/www/postfixadmin/
php -r "require_once('functions.inc.php'); echo password_hash('セットアップのパスワード', PASSWORD_DEFAULT) . PHP_EOL;"

#このようなhashが出力されます。
$2y$10$ftuBtmmgiYBN.RqakFt9W.zrNECBw5dO0WiAQ/Tm5.qhgbWgDVAsa
cd /var/www/postfixadmin/

sudo vi config.local.php

php のスクリプトなので、 <?php を忘れないようにつけます。

<?php

$CONF['configured'] = true;
$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfix';
$CONF['database_password'] = 'ここにパスワード(MariaDB postfixユーザー))';
$CONF['database_name'] = 'postfix';

$CONF['alias_control'] = 'NO';
$CONF['setup_password'] = 'セットアップのパスワードのhash';

$CONF['encrypt'] = 'dovecot:CRAM-MD5';
$CONF['authlib_default_flavor'] = '';

$CONF['min_password_length'] = '4';

$CONF['maildir_name_hook'] = 'maildir_name_hook_custom';

function maildir_name_hook_custom($domain, $user) {
  preg_match("/^(.+)@[^@]+$/", $user, $matches);
  return $domain . '/' . $matches[1] . '/Maildir/';
}

$CONF['alias_control']の値をNOに変更し、転送メールエイリアスの自動作成を無効にします。
セットアップのパスワードのhash
$2y$10$ftuBtmmgiYBN.RqakFt9W.zrNECBw5dO0WiAQ/Tm5.qhgbWgDVAsa このような文字列でパスワードではないので注意してください。

Apache の設定ファイル(postfixadmin.conf)を作成

Apacheの設定ファイルにPostfixAdmin用のディレクティブを追加します。
エイリアス等の設定を行います。

sudo vi /etc/httpd/conf.d/postfixadmin.conf

以下の内容を追加してください。

Alias /postfixadmin /var/www/postfixadmin/public

<Directory "/var/www/postfixadmin/public">
    Require all granted
</Directory>

設定変更後、Apacheを再起動します。

sudo systemctl restart httpd

PostfixAdmin セットアップ画面

最後に、以下のURLにアクセスしてPostfixAdminをセットアップします。
先に設定したセットアップ画面用のパスワードでログインします。
※先にDovecotがインストールされていないとエラーがでます。

https://your_domain/postfixadmin/setup.php
ERROR: the templates_c directory doesn't exist or isn't writeable for the webserver

このようなエラーがでますので、 INSTALL.TXTに従い templates_cフォルダを作成します。
Apacheで書き込めるように、Apacheのオーナーにするか、 chmod 0777 で書き込み権限を付けてください。

cd /var/www/postfixadmin/

mkdir -p templates_c
chown -R apache templates_c

以上で、PostfixAdminの導入が完了です。これでPostfixAdminを使って、Postfixの設定や簡単なメールアドレス管理が行えるようになります。

Dovecot の設定

Dovecotのモジュールをインストールします。

sudo yum -y install dovecot dovecot-mysql
sudo yum -y install dovecot-pigeonhole

mailuser アカウントを作成

mailuserというユーザーを作成し、uidを10000、gidを10000、ホームディレクトリを/home/mailuser、シェルを/sbin/nologinに設定します。
このユーザーのホームディレクトリに、VurtualDomain毎のメールスプールが作成されます。

sudo groupadd -g 10000 mailuser
sudo useradd -u 10000 -g 10000 -d /home/mailuser -s /sbin/nologin mailuser

/etc/dovecot/rc.local 全変更内容まとめ

conf.d 内の 設定ファイルを個々に書き換えるより rc.local に変更をまとめたほうが管理しやすいと思います。
設定内容は、個々の環境に合わせて変更してください。

auth_debug_passwords = no
auth_verbose = no
auth_debug = no

listen = *

###from 10-auth.conf
#ここの環境にあわせて
disable_plaintext_auth = no
auth_mechanisms = CRAM-MD5 login plain
#auth_mechanisms = plain login

###from 10-mail.conf
#mail_location = maildir:/home/mailuser/%d/%n/Maildir
mail_location = maildir:~/Maildir

mail_uid = mailuser
mail_gid = mailuser
mail_privileged_group = mailuser
first_valid_uid = 10000
first_valid_gid = 10000
#mail_plugins=$mail_plugins quota imap_quota

###from 10-ssl.conf
ssl = yes
ssl_cert = </usr/local/ssl/example.net.fullchain
ssl_key = </usr/local/ssl/example.net.key
#ssl_ca = </usr/local/ssl/example.net.ca

#複数ドメイン対応する場合は列挙する
local_name example.com {
  ssl_cert = </usr/local/ssl/example.com.fullchain
  ssl_key = </usr/local/ssl/example.com.key
}

ssl_dh = </etc/dovecot/dh.pem
ssl_min_protocol = TLSv1.2
ssl_cipher_list = !SHA1:!SHA256:!SHA384:!SSLv3:!DSS:AESGCM+ECDHE:AESGCM+EDH
ssl_prefer_server_ciphers = yes

###from 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 lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    mode = 0600
    group = postfix
    user = postfix
  }
}
service auth {
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
  }
#   unix_listener auth-userdb {
#     mode = 0600
#     user = mailuser
#     group = mailuser
#   }
  user = dovecot
}

service auth-worker {
  user = mailuser
}
#service managesieve-login {
#  inet_listener sieve {
#    port = 4190
#  }
#}

###from auth-sql.conf.ext
protocol imap {
 imap_client_workarounds = delay-newmail tb-extra-mailbox-sep
#  mail_plugins = $mail_plugins imap_quota
}
protocol pop3 {
  pop3_client_workarounds = outlook-no-nuls oe-ns-eoh
}
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
  }
}

###from 15-lda.conf
#protocol lda {
#  # Space separated list of plugins to load (default is global mail_plugins).
#  #mail_plugins = $mail_plugins
#  mail_plugins = $mail_plugins sieve
#}

###from 20-managesieve.conf
#protocol sieve {
#  protocols = $protocols sieve
#}

###from 20-lmtp.conf
protocol lmtp {
  mail_plugins = $mail_plugins sieve
}

###from 90-sieve.conf
#plugin {
#  sieve = /home/mailuser/%d/%n/.dovecot.sieve
#  sieve_dir = /home/mailuser/%d/%n/sieve
#  sieve_user_log = /home/mailuser/%d/%n/.dovecot.sieve.log
#}

/etc/dovecot/dovecot.conf

Dovecotの設定 /etc/dovecot/dovecot.conf を開きます。

sudo vi /etc/dovecot/dovecot.conf

以下の行を追加してください。

protocols = imap lmtp pop3 sieve
listen = *

/etc/dovecot/conf.d/10-mail.conf

/etc/dovecot/conf.d/10-mail.conf を開きます。

sudo vi /etc/dovecot/conf.d/10-mail.conf

以下の行を変更または追加してください。

mail_location = maildir:/home/mailuser/%d/%n/Maildir
#mail_location = maildir:~/Maildir

mail_uid = mailuser
mail_gid = mailuser
mail_privileged_group = mailuser
first_valid_uid = 10000
first_valid_gid = 10000
#mail_plugins=$mail_plugins quota imap_quota

/etc/dovecot/conf.d/10-auth.conf

/etc/dovecot/conf.d/10-auth.conf を開いて、以下の行を変更します。

sudo vi /etc/dovecot/conf.d/10-auth.conf
##どちらでもお好みで
##disable_plaintext_auth = yes
disable_plaintext_auth = no

auth_mechanisms = CRAM-MD5 login plain

#コメントアウト
#!include auth-system.conf.ext

#コメントアウト解除
!include auth-sql.conf.ext

/etc/dovecot/conf.d/10-ssl.conf

/etc/dovecot/conf.d/10-ssl.conf を開いて、以下のように変更します。

sudo vi /etc/dovecot/conf.d/10-ssl.conf

サーバー証明書は、VirtualDomain 毎に設定できます。
証明書関係の設定は、環境にあわせて適宜変更してください。

#証明書を必須としない場合は
#ssl = required

ssl = yes
ssl_cert = </etc/letsencrypt/live/example.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/example.com/privkey.pem
#ssl_ca = </etc/letsencrypt/live/example.com/chain.pem 

local_name mail.example.net {
  ssl_cert = </etc/letsencrypt/live/example.net/fullchain.pem
  ssl_key = </etc/letsencrypt/live/example.net/privkey.pem
}
local_name mail.xxxxxx.net {
  ssl_cert = </etc/letsencrypt/live/xxxxxx.net/fullchain.pem
  ssl_key = </etc/letsencrypt/live/xxxxxx.net/privkey.pem
}

#/etc/dovecot/dh.pemはこの後の手順により作成します。
ssl_dh = </etc/dovecot/dh.pem
ssl_min_protocol = TLSv1.2
ssl_cipher_list = !SHA1:!SHA256:!SHA384:!SSLv3:!DSS:AESGCM+ECDHE:AESGCM+EDH
ssl_prefer_server_ciphers = yes
dh.pemファイルの作成

Dovecotで使用するdh.pemファイルは、Diffie-Hellman(DH)鍵交換のパラメータが含まれています。これは暗号化された通信を行う際に、安全な共有鍵を生成するために使用されます。dh.pemファイルを作成してDovecotに設定する方法は次のとおりです。

OpenSSLツールを利用して、適切な長さ(2048ビット以上が推奨されます)のDHパラメータを生成します。以下のコマンドを実行してください。

sudo openssl dhparam -out /etc/dovecot/dh.pem 2048

このコマンドは、2048ビットのDHパラメータを生成し、/etc/dovecot/dh.pemに保存します。4096ビットのように長いキーを生成するとセキュリティが向上しますが、計算時間が増えるため、ここでは2048ビットのキーを生成しています。

生成したdh.pemファイルのパーミッションを、ルート所有者のみが読み取れるように設定します(dovecotが参照できるように)。これにより、他のユーザーがファイルにアクセスすることができなくなります。

##sudo chmod 600 /etc/dovecot/dh.pem
sudo chmod 644 /etc/dovecot/dh.pem
sudo chown root:root /etc/dovecot/dh.pem

/etc/dovecot/conf.d/auth-sql.conf.ext

/etc/dovecot/conf.d/auth-sql.conf.ext を開いて、以下のように末尾に追加します。

sudo vi /etc/dovecot/conf.d/auth-sql.conf.ext
protocol imap {
 imap_client_workarounds = delay-newmail tb-extra-mailbox-sep
#  mail_plugins = $mail_plugins imap_quota
}
protocol pop3 {
  pop3_client_workarounds = outlook-no-nuls oe-ns-eoh
}
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
  }
}

/etc/dovecot/dovecot.conf 

sudo vi /etc/dovecot/dovecot.conf 
service stats {
  unix_listener stats-reader {
    group = apache
    mode = 0660
  }
  unix_listener stats-writer {
    group = apache
    mode = 0660
  }
}

phpをapacheグループで実行しているので、stats-reader,stats-writer ソケットのアクセス権をそのグループに与えます。

/etc/dovecot/dovecot-sql.conf.ext

MariaDBと連携して認証するための SQLの設定を作成します。

sudo vi /etc/dovecot/dovecot-sql.conf.ext
driver = mysql
#パスワードを平文であえて保存したい場合はCRAM-MD5をPLAINにする
default_pass_scheme = CRAM-MD5
connect = host=/var/lib/mysql/mysql.sock dbname=postfix user=postfix password=ここにパスワード
password_query = SELECT username as user, password FROM mailbox WHERE username = '%u' AND active = '1'
user_query = SELECT concat('/home/mailuser/', maildir) as home, 10000 as uid, 10000 as gid FROM mailbox WHERE username = '%u' AND active = '1'
iterate_query = SELECT userid AS username, domain FROM users

/etc/dovecot/conf.d/15-lda.conf

/etc/dovecot/conf.d/15-lda.conf を開いて、以下のようにコメントアウトします。

sudo vi /etc/dovecot/conf.d/15-lda.conf
#protocol lda {
#  # Space separated list of plugins to load (default is global mail_plugins).
#  #mail_plugins = $mail_plugins
#  mail_plugins = $mail_plugins sieve
#}

/etc/dovecot/conf.d/20-managesieve.conf

/etc/dovecot/conf.d/20-managesieve.conf を開いて、以下のようにコメントアウトします。

sudo vi /etc/dovecot/conf.d/20-managesieve.conf
#protocol sieve {
#  protocols = $protocols sieve
#}

/etc/dovecot/conf.d/20-lmtp.conf

/etc/dovecot/conf.d/20-lmtp.conf を開いて、以下のように変更します。

sudo vi /etc/dovecot/conf.d/20-lmtp.conf
protocol lmtp {
  mail_plugins = $mail_plugins sieve
}

/etc/dovecot/conf.d/90-sieve.conf

/etc/dovecot/conf.d/90-sieve.conf を開いて、以下のようにコメントアウトします。

sudo vi /etc/dovecot/conf.d/90-sieve.conf
#plugin {
#  sieve = /home/mailuser/%d/%n/.dovecot.sieve
#  sieve_dir = /home/mailuser/%d/%n/sieve
#  sieve_user_log = /home/mailuser/%d/%n/.dovecot.sieve.log
#}

/etc/dovecot/conf.d/10-master.conf

/etc/dovecot/conf.d/10-master.conf を開いて、以下のように変更します。

sudo vi /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 lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    mode = 0600
    group = postfix
    user = postfix
  }
}
service auth {
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
  }
#   unix_listener auth-userdb {
#     mode = 0600
#     user = mailuser
#     group = mailuser
#   }
  user = dovecot
}
service auth-worker {
  user = mailuser
}

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

sudo systemctl restart dovecot
sudo systemctl enable dovecot

/etc/dovecot/conf.d/10-logging.conf

/etc/dovecot/conf.d/10-logging.conf を変更してDebug用のログを出力することもできます。

sudo vi /etc/dovecot/conf.d/10-logging.conf
#auth_debug_passwords = no
#auth_verbose = no
#auth_debug = no

auth_debug_passwords = yes
auth_verbose = yes
auth_debug = yes
log_path = /var/log/dovecot.log

 SSL/TLS証明書の取得

Certbotを使ってLet’s Encryptの無料SSL/TLS証明書を取得します。

あわせて読みたい
Let’s Encryptの導入 (SAN証明書, ワイルドカード証明書) Let's Encrypt とは、無料でSSL証明書を発行するための認証局 (CA: Certificate Authority) で、ウェブサイトのセキュリティを簡単かつ手頃な価格で向上させること...

取得した証明書と秘密鍵のパスを、Postfixの設定ファイル /etc/postfix/main.cf に記載されている smtpd_tls_cert_file および smtpd_tls_key_file の値に合わせます。

ファイアウォールの設定

メールサーバー用のポートを開放します。

sudo systemctl start firewalld
sudo systemctl enable firewalld

sudo firewall-cmd --add-service=pop3s --permanent
sudo firewall-cmd --add-service=imaps --permanent
sudo firewall-cmd --add-service=smtp --permanent
sudo firewall-cmd --add-service=smtps --permanent
sudo firewall-cmd --permanent --add-port=587/tcp

sudo firewall-cmd --reload

これらの手順で、PostfixとDovecotを使用してセキュアなメールサーバーが構築できます。

最低限やっておきたいセキュリティー設定

Gmailへのメール送信や、メール転送で拒否されないように、SPF (Sender Policy Framework) と SRS (Sender Rewriting Scheme)の設定はやっておくことをお勧めします。

SPFレコードはDNS上に登録されたTXTレコードで、ドメインから送信が許可されているメールサーバーのIPアドレスを指定します。これにより、他のメールサーバーは受信したメールが本当に許可されたサーバーから送られているかどうかを確認できます。

SRSはフォワーディングされたメールの差出人アドレスを書き換えることで、SPFチェックに問題が発生しないようにする仕組みです。PostfixでSRSを実現するには、postsrsd をインストールして設定します。

あわせて読みたい
SPF (Sender Policy Framework) + SRS (Sender Rewriting Scheme)の導入 https://int-design.jp/content/spf-dkim-dmarc-arc-gmail/ Sender Policy Framework (SPF) は、電子メールの送信元を検証するためのシンプルな認証プロトコルです。SPF...

導入すると便利なもの

あわせて読みたい
WebMail RoundCube の導入 (+Imagick) Roundcube(ラウンドキューブ)は、オープンソースのWebベース電子メールクライアントです。IMAPプロトコルをサポートし、ブラウザ経由で電子メールの送受信や管理を行...
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次