Postfix + Dovecot + OpenDKIM の設定メモ

作成日:2024.07.20

自宅サーバーでメールサーバーを運用するための設定メモを残す。


更新履歴
(2024.07.20) 作成。


目次

1. はじめに

Rocky Linux 9 上に独自のメールサーバーを立てるための設定メモを残す。

以下を前提とする。

設定するサービスは以下の3つとなる。

最終的に自宅サーバーでは以下のサービスを公開する。

種類 ポート
SMTP、SMTPS tcp/25、tcp/587
IMAPS tcp/993

メールサーバーは迷惑メール対策に対策として SPF/DKIM/DMARC の設定も必要となる。

種類 目的 必要な作業
SPF メールを受信したサーバーが、送信元サーバーの IP アドレスを確認可能にする。
  • DNS の TXT レコードの登録(4.2)
DKIM メールを受信したサーバーが、送信元サーバーが送ったメールの署名を確認可能にする。
  • OpenDKIM の設定(3.3)
  • DNS の TXT レコードの登録(4.2)
DMARC メールを受信したサーバーが、SPF/DKIM による認証が失敗したメールの扱いを定義可能にする。
  • DNS の TXT レコードの登録(4.2)

独自ドメインに対するサーバー証明書は Let's Encrypt で取得し、以下のパスに格納しているものとする。 Let's Encrypyt による証明書の習得は Let's Encryptの設定メモ を参照のこと。

2. 事前の Linux 設定

Rocky Linux 9 へパッケージをインストールする。

sudo dnf install epel-release
sudo dnf config-manager --set-enabled crb
sudo dnf install postfix dovecot opendkim opendkim-tools

3. メールサービスの設定

3.1 Postfix の設定

メールサーバーである postfix の設定を行う。

まず sendmail など他のメールサーバーソフトが入っている場合、postfix をメールサーバーとして使うように指定する。

sudo alternatives --config mta

postfix の設定ファイルを変更・修正する。

/etc/postfix/main.cf:
myhostname = ns.nminoru.jp
mydomain = nminoru.jp
myorigin = $mydomain

# 以下のように修正する
inet_interfaces = all

mydestination = $mydomain, localhost, $myhostname, localhost.$mydomain, mail.$mydomain

mynetworks_style = subnet

mynetworks = 127.0.0.0/8 10/8 

canonical_maps = hash:/etc/postfix/canonical
masquerade_domains = $mydomain
masquerade_exceptions = root,mailer-daemon

home_mailbox = Maildir/

smtpd_banner = $myhostname ESMTP unknown

smtpd_tls_cert_file = /etc/letsencrypt/live/nminoru.jp/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/nminoru.jp/privkey.pem

smtpd_helo_required = yes
smtpd_helo_restrictions = permit_mynetworks, reject_non_fqdn_helo_hostname, reject_invalid_helo_hostname, permit
smtpd_client_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unknown_client_hostname, check_client_access hash:/etc/postfix/access, permit
smtpd_sender_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unknown_sender_domain, check_sender_access hash:/etc/postfix/access, permit

# SASL 認証を有効化
smtpd_sasl_auth_enable = yes

 Dovecot SASL ライブラリを指定
smtpd_sasl_type = dovecot

# Dovecot SASL ライブラリの認証ソケットファイル /var/spool/postfix/ からの相対パスで記述
smtpd_sasl_path = private/auth

# 古いバージョンの AUTH コマンド (RFC 2554) を実装した SMTP クライアントとの相互運用性を有効にする
broken_sasl_auth_clients = yes

########## TLS/SSL関連 ##########
# TLSを有効化
smtpd_use_tls = yes

# TLSログレベルの設定
# 0:出力しない 1:TLSハンドシェイクと証明書情報 2: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

# SSLv2、SSLv3 の無効化
smtp_tls_protocols = !SSLv2,!SSLv3,!TLSv1,!TLSv1.1
smtp_tls_mandatory_protocols = !SSLv2,!SSLv3,!TLSv1,!TLSv1.1
smtpd_tls_protocols = !SSLv2,!SSLv3,!TLSv1,!TLSv1.1
smtpd_tls_mandatory_protocols = !SSLv2,!SSLv3,!TLSv1,!TLSv1.1

# DKIM利用
smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = inet:localhost:8891
milter_default_action = accept
/etc/postfix/master.cf:
submission inet n       -       n       -       -       smtpd
  -o syslog_name=postfix/submission
#  -o smtpd_tls_security_level=encrypt
  -o smtpd_tls_security_level=may
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth
#  -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_recipient_restrictions=permit_sasl_authenticated,reject

3.2 Dovecot の設定

POP/IMAP サーバーである dovecot を設定する。

/etc/dovecot/dovecot.conf:
protocols = imap pop3 lmtp
listen = *
/etc/dovecot/conf.d/10-auth.conf:
#以下の行を追加する 
disable_plaintext_auth = no

#以下の行をコメントアウト
#!include auth-system.conf.ext

#以下の行を有効化
!include auth-passwdfile.conf.ext
/etc/dovecot/conf.d/10-mail.conf:
mail_location = maildir:~/Maildir
/etc/dovecot/conf.d/10-ssl.conf:
#以下の行のように修正する
ssl_cert = </etc/letsencrypt/live/nminoru.jp/fullchain.pem
ssl_key = </etc/letsencrypt/live/nminoru.jp/privkey.pem
/etc/dovecot/conf.d/10-master.conf:
#以下の行のように修正する
service auth {
  # Postfix smtp-auth
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
  }
}

dovecot へアクセスする際には、パスワードが必要となる。 これは /etc/dovecot/users に記述する。 nminoru というユーザーが、8558q4QNQ2 というパスワードでアクセスを許可される。

POP/IMAP へのログインはユーザー名とメールアドレスの両方が使えるように2行を用意する。

/etc/dovecot/users:
nminoru:{PLAIN}8558q4QNQ2:1000:1000::/home/nminoru
nminoru@nminoru.jp:{PLAIN}8558q4QNQ2:1000:1000::/home/nminoru

3.3 OpenDKIM の設定

OpenDKIM を使うには、公開秘密鍵のキーペアを作成する必要がある。 まずキーペアの保存用フォルダを作成する。

sudo mkdir -p /etc/opendkim/keys/nminoru.jp/

キーペアは opendkim-tools パッケージに含まれる opendkim-genkey コマンドを使う。 opendkim-genkey コマンドは opendkim-genkey -D (ファイルの保存パス) -d (ドメイン名) -s (セレクト名) のように指定する。 セレクト名は例えば日付(20231228)を文字化して指定する。

sudo opendkim-genkey -D /etc/opendkim/keys/nminoru.jp/ -d nminoru.jp -s 20231228

上記のコマンドを入力すると、以下の2ファイルができる。

sudo ls -laF /etc/opendkim/keys/nminoru.jp/
total 8
drwxr-xr-x. 2 opendkim opendkim  50 Dec 28  2023 ./
drwxr-x---. 3 opendkim opendkim  24 Dec 28  2023 ../
-rw-------. 1 opendkim opendkim 887 Dec 28  2023 20231228.private
-rw-------. 1 opendkim opendkim 316 Dec 28  2023 20231228.txt

キーペアのファイルの所有者を変更する。

sudo chown -R opendkim:opendkim /etc/opendkim/keys/nminoru.jp/
/etc/opendkim.conf:
# メールの送信("s")と受信("v")の両方で確認する
Mode sv

# KeyFile パラメーターを無効化する(コメントアウト)
# KeyFile     /etc/opendkim/keys/default.private

# KeyTable パラメーターを有効化する
KeyTable      /etc/opendkim/KeyTable

# SigningTable パラメーターを有効化する
SigningTable  refile:/etc/opendkim/SigningTable

# ExternalIgnoreList パラメーターを有効化する
# ExternalIgnoreList
ExternalIgnoreList    refile:/etc/opendkim/TrustedHosts

# InternalHosts パラメーターを有効化する
InternalHosts refile:/etc/opendkim/TrustedHosts
/etc/opendkim/KeyTable:
20231228._domainkey.nminoru.jp nminoru.jp:20231228:/etc/opendkim/keys/nminoru.jp/20231228.private
/etc/opendkim/SigningTable:
*@nminoru.jp 20231228._domainkey.nminoru.jp
/etc/opendkim/TrustedHosts:
127.0.0.1
::1
10.0.0.0/8

4. サービス設定後の処理

4.1 Firewall の設定

起動したサービスを自宅ネットワークからのアクセスできるように Firewall にポートを公開する設定を実施する。

sudo firewall-cmd --add-service=smtp  --zone=public --permanent
sudo firewall-cmd --add-service=imaps --zone=public --permanent
sudo firewall-cmd --add-port=587/tcp  --zone=public --permanent
sudo firewall-cmd --reload

4.2 DNS の設定

DNS に SPF/DKIM/DMARC を設定する。

SPF の設定

SPF は DNS に TXT レコードを追加する。

nminoru.jp   IN   TXT   "v=spf1 ip4:219.117.195.0/24 -all"

DKIM の設定

DKIM は opendkim をインストールして設定した上で、DNS に TXT レコードを追加する。 DKIM はセレクター種別によって複数設定することができるが、3.3 OpenDKIM の設定 で指定した 20231228 というセレクターを指定する。 20231228._domainkey.nminoru.jp の TXT レコードを作成することになる。 /etc/opendkim/keys/nminoru.jp/20231228.txt に登録すべき TXT レコードの内容がそのまま入っているので転記すればよい。

また DKIM 署名が有効でないメールの扱いを設定するために ADSP レコードを登録する。 ここは all、unknown、discardable を選択できる。 ここでは unknown を指定する。

20231228._domainkey.nminoru.jp   IN   TXT   "v=DKIM1; k=rsa; p=(公開鍵)"
_adsp._domainkey.nminoru.jp   IN   TXT   dkim=unknown

DMARC の設定

DMARC は DNS に TXT レコードを設定することで、SPF と DKIM が失敗した場合の取り扱いを指定する。

_dmarc.nminoru.jp   IN  TXT   "v=DMARC1; p=quarantine; ruf=mailto:root@nminoru.jp; adkim=r; aspf=r"

SPF/DKIM/DMARC の設定の確認

自分のドメインから GMail にメールを送信し、そのヘッダーを確認する。 GMail が受信したメールには Authentication-Results ヘッダーを確認する。 SPF/DKIM/DMARC の設定に成功していれば、以下のように pass と判定される。

Authentication-Results: mx.google.com;
       dkim=pass header.i=@nminoru.jp header.s=20231228 header.b=N8bgECdK;
       spf=pass (google.com: domain of nminoru@nminoru.jp designates 219.117.195.5 as permitted sender) smtp.mailfrom=nminoru@nminoru.jp;
       dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=nminoru.jp

4.3 Systemctl の設定

systemctl でメールサービス(3.)を有効化する。

sudo systemctl enable postfix
sudo systemctl enable dovecot
sudo systemctl enable opendkim

5. メールサービスの日常的な設定

メールサーバーを構築後に、受信を許可・拒否するドメインを設定したり、エイリアスを設定したりする。 そのやり方を説明する。

5.1 ローカルホストメールの正規化

ローカルネットワーク(自宅ネットワーク)内のホストからメールを送信しようとした場合、@(ホスト名).(ドメイン) のようなメールアドレスが付くことがある。 例えば host1.nminoru.jp からメールを送信すると @host1.nminoru.jp のようなメールドメインとなる。 これを @host1.nminoru.jp → @nminoru.jp のようにまるめることができる。

これは /etc/postfix/canonical ファイルにルールを記述する。

/etc/postfix/canonical:
@host1.nminoru.jp          @nminoru.jp
@host1.localhost           @nminoru.jp

/etc/postfix/canonical ファイルを更新した後は以下を実行する。

sudo postmap /etc/postfix/canonical

5.2 受信を許可・拒否するドメインの設定

特定のドメインからのメールを一律で受信したり、逆に拒否する設定ができる。

これは /etc/postfix/access ファイルにルールを記述する。

/etc/postfix/access:
daimaru-matsuzakaya.jp OK
s790813.srvape.com     REJECT

/etc/postfix/access ファイルを更新した後は以下を実行する。

sudo postmap /etc/postfix/access

5.3 エイリアスの設定

nminoru.jp ドメインにエイリアスを追加することができる。 例えば netflix@nminoru.jp や niconico@nminoru.jp をエイリアスとして追加し、実際は nminoru@nminoru.jp へ転送して受け取るようにする。

これは /etc/aliases ファイルに記述する。

/etc/aliases
netflix:        nminoru
niconico:       nminoru

/etc/aliases ファイルを更新した後は以下を実行する。

sudo newaliases

コメント

コメントを書き込む

TOP    掲示板    戻る
Written by NAKAMURA Minoru, Email: nminoru atmark nminoru dot jp, Twitter:@nminoru_jp