「コンテナ - メールサーバ」の版間の差分

提供: MochiuWiki : SUSE, EC, PCB

ページの作成:「== 概要 == Postfixは高性能なメールサーバソフトウェア (MTA : Mail Transfer Agent) であり、Dovecotは電子メールの受信と管理を担うソフトウェア (MDA : Mail Delivery Agent) である。<br> <br> Docker / Podmanコンテナとして実行することにより、開発環境や本番環境で簡単にメールサーバを構築することができる。<br> PostfixはSMTPによるメール送信を処理、DovecotはIMAP/POP3に…」
 
143行目: 143行目:
== Postfix設定ファイル ==
== Postfix設定ファイル ==
==== main.cf ====
==== main.cf ====
main.cfファイルは、サーバのホスト名、受信するドメイン、認証方式、TLS暗号化、セキュリティポリシー、バーチャルメールボックスの設定等のメールサーバの基本的な動作を定義する。<br>
<br>
postfix/main.cfファイルを作成する。<br>
postfix/main.cfファイルを作成する。<br>
<br>
<br>
  <syntaxhighlight lang="ini">
  <syntaxhighlight lang="ini">
  # 基本設定
  # 基本設定
  myhostname = mail.example.com
  myhostname = mail.example.com             # メールサーバのホスト名(FQDN)
  mydomain = example.com
  mydomain = example.com                     # 所属するドメイン名
  myorigin = $mydomain
  myorigin = $mydomain                       # 送信メールの送信元ドメイン
  mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
  mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain # 最終配送先として受け取るドメイン
  relayhost =
  relayhost =                               # 外部SMTPリレーサーバ(空白の場合は直接配送)
  mynetworks = 127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16
  mynetworks = 127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 # 信頼するネットワーク範囲
  inet_interfaces = all
  inet_interfaces = all                     # 待ち受けるネットワークインターフェース (all : 全て)
  inet_protocols = ipv4
  inet_protocols = ipv4                     # 使用するプロトコル (ipv4 / ipv6 / all)
   
   
  # メールボックス設定
  # メールボックス設定
  home_mailbox = Maildir/
  home_mailbox = Maildir/                   # メールボックス形式 (Maildir形式)
  mailbox_command =
  mailbox_command =                         # メール配送時の外部コマンド (空白 : 標準配送)
   
   
  # SASL認証設定(Dovecot経由)
  # SASL認証設定 (Dovecot経由)
  smtpd_sasl_type = dovecot
  smtpd_sasl_type = dovecot                 # SASL認証のバックエンドタイプ
  smtpd_sasl_path = private/auth
  smtpd_sasl_path = private/auth             # Dovecot認証ソケットのパス
  smtpd_sasl_auth_enable = yes
  smtpd_sasl_auth_enable = yes               # SMTP認証機能の有効化
  smtpd_sasl_security_options = noanonymous
  smtpd_sasl_security_options = noanonymous # 匿名認証の無効化
  smtpd_sasl_local_domain = $mydomain
  smtpd_sasl_local_domain = $mydomain       # SASL認証で使用するローカルドメイン
  broken_sasl_auth_clients = yes
  broken_sasl_auth_clients = yes             # 古いクライアントとの互換性維持
   
   
  # TLS設定
  # TLS設定
  smtpd_use_tls = yes
  smtpd_use_tls = yes                       # TLS暗号化機能の有効化
  smtpd_tls_cert_file = /etc/ssl/certs/mail/mail.crt
  smtpd_tls_cert_file = /etc/ssl/certs/mail/mail.crt       # サーバ証明書ファイルのパス
  smtpd_tls_key_file = /etc/ssl/certs/mail/mail.key
  smtpd_tls_key_file = /etc/ssl/certs/mail/mail.key         # 秘密鍵ファイルのパス
  smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
  smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache # サーバ側TLSセッションキャッシュ
  smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
  smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache   # クライアント側TLSセッションキャッシュ
  smtpd_tls_security_level = may
  smtpd_tls_security_level = may             # TLSセキュリティレベル (may : 任意、encrypt : 必須)
  smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
  smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1   # 使用禁止プロトコル (! : 禁止)
  smtpd_tls_ciphers = high
  smtpd_tls_ciphers = high                   # 暗号化方式の強度 (high : 高強度のみ)
  smtpd_tls_mandatory_ciphers = high
  smtpd_tls_mandatory_ciphers = high         # TLS必須時の暗号化方式強度
   
   
  # セキュリティ設定
  # セキュリティ設定
# 受信者アドレスに対する制限ルール(上から順に評価)
  smtpd_recipient_restrictions =
  smtpd_recipient_restrictions =
     permit_mynetworks,
     permit_mynetworks,                     # 信頼ネットワークからの接続を許可
     permit_sasl_authenticated,
     permit_sasl_authenticated,             # SASL認証済みクライアントを許可
     reject_unauth_destination,
     reject_unauth_destination,             # 未認証の外部ドメイン宛を拒否 (オープンリレー防止)
     reject_invalid_hostname,
     reject_invalid_hostname,               # 無効なホスト名を拒否
     reject_non_fqdn_sender,
     reject_non_fqdn_sender,               # 送信者がFQDNでない場合を拒否
     reject_non_fqdn_recipient,
     reject_non_fqdn_recipient,             # 受信者がFQDNでない場合を拒否
     reject_unknown_sender_domain,
     reject_unknown_sender_domain,         # 送信者ドメインのDNS解決失敗を拒否
     reject_unknown_recipient_domain
     reject_unknown_recipient_domain       # 受信者ドメインのDNS解決失敗を拒否
   
   
  # バーチャルメールボックス設定
  # バーチャルメールボックス設定
  virtual_mailbox_domains = example.com
  virtual_mailbox_domains = example.com     # バーチャルドメインとして扱うドメイン
  virtual_mailbox_base = /var/mail/vmail
  virtual_mailbox_base = /var/mail/vmail     # バーチャルメールボックスのベースディレクトリ
  virtual_mailbox_maps = hash:/etc/postfix/vmailbox
  virtual_mailbox_maps = hash:/etc/postfix/vmailbox # メールアドレスとメールボックスの対応ファイル
  virtual_minimum_uid = 1000
  virtual_minimum_uid = 1000                 # 使用する最小UID値
  virtual_uid_maps = static:5000
  virtual_uid_maps = static:5000             # バーチャルメールボックスで使用する固定UID
  virtual_gid_maps = static:5000
  virtual_gid_maps = static:5000             # バーチャルメールボックスで使用する固定GID
  virtual_alias_maps = hash:/etc/postfix/virtual
  virtual_alias_maps = hash:/etc/postfix/virtual # メールエイリアス (転送設定) ファイル
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
==== master.cf ====
==== master.cf ====
master.cfファイルは、Postfixのサービスプロセスを制御する設定ファイルである。<br>
<br>
各サービスの起動方法、プロセス数、実行ユーザ、コマンドラインオプション等を定義する。<br>
また、SMTP、SMTP Submission、LMTPなどの各種サービスの動作を個別に設定することができる。<br>
<br>
特に、SMTP Submission (ポート587) の設定では、認証必須やTLS暗号化必須等のオプションを追加することにより、セキュアなメール送信環境を構築することができる。<br>
<br>
postfix/master.cfファイルに、SMTP Submissionポート (587番) の設定を追加する。<br>
postfix/master.cfファイルに、SMTP Submissionポート (587番) の設定を追加する。<br>
<br>
<br>
# SMTP Submission (ポート587) の設定
# サービス定義 : submission / inet / smtpdプロセスを起動
  submission inet n      -      y      -      -      smtpd
  submission inet n      -      y      -      -      smtpd
   -o syslog_name=postfix/submission
   -o syslog_name=postfix/submission           # syslogでの識別名
   -o smtpd_tls_security_level=encrypt
   -o smtpd_tls_security_level=encrypt         # TLS暗号化を必須化
   -o smtpd_sasl_auth_enable=yes
   -o smtpd_sasl_auth_enable=yes               # SASL認証を有効化
   -o smtpd_reject_unlisted_recipient=no
   -o smtpd_reject_unlisted_recipient=no       # 受信者リスト外への配送を許可
   -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
   -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject # 認証済みのみ許可
   -o milter_macro_daemon_name=ORIGINATING
   -o milter_macro_daemon_name=ORIGINATING     # メールフィルタに内部送信を通知
<br>
<br>
==== バーチャルメールボックスの設定 ====
==== バーチャルメールボックスの設定 ====
vmailboxファイルは、メールアドレスとそれに対応するメールボックスのディレクトリパスを関連付ける。<br>
<br>
各行には、左側にメールアドレス、右側にそのメールボックスの相対パスを記述する。<br>
このファイルを編集した後は、postmapコマンドでハッシュデータベースに変換する必要がある。<br>
<br>
Postfixは、このハッシュデータベースを参照して、受信したメールを適切なメールボックスに配送する。<br>
<br>
postfix/vmailboxファイルを作成して、仮想メールボックスを定義する。<br>
postfix/vmailboxファイルを作成して、仮想メールボックスを定義する。<br>
<br>
<br>
  <syntaxhighlight lang="text">
  <syntaxhighlight lang="text">
  user1@example.com    example.com/user1/
# 形式 : メールアドレス    メールボックスの相対パス
  user2@example.com    example.com/user2/
# パスはvirtual_mailbox_base (/var/mail/vmail) からの相対パス
  info@example.com    example.com/info/
  user1@example.com    example.com/user1/     # user1のメールボックス
  user2@example.com    example.com/user2/     # user2のメールボックス
  info@example.com    example.com/info/     # infoのメールボックス
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>

2026年1月7日 (水) 02:06時点における版

概要

Postfixは高性能なメールサーバソフトウェア (MTA : Mail Transfer Agent) であり、Dovecotは電子メールの受信と管理を担うソフトウェア (MDA : Mail Delivery Agent) である。

Docker / Podmanコンテナとして実行することにより、開発環境や本番環境で簡単にメールサーバを構築することができる。
PostfixはSMTPによるメール送信を処理、DovecotはIMAP/POP3によるメール受信とメールボックス管理を行う。

メールサーバコンテナの主な機能
機能 プロトコル デフォルトポート 説明
SMTP受信 SMTP 25 外部からのメール受信
SMTP送信認証 SMTP / STARTTLS 587 認証付きメール送信 (Submission)
IMAP受信 IMAPS 993 メールクライアントからのIMAP接続
POP3受信 POP3S 995 メールクライアントからのPOP3接続
SASL認証 - - DovecotによるSMTP認証機能



ディレクトリ構成

メールサーバの設定ファイルを管理するためのディレクトリ構成を以下に示す。

mailserver/
├── docker-compose.yml
├── postfix/
│   ├── main.cf
│   ├── master.cf
│   ├── vmailbox
│   └── virtual
├── dovecot/
│   ├── dovecot.conf
│   ├── users
│   └── conf.d/
│       ├── 10-auth.conf
│       ├── 10-mail.conf
│       ├── 10-master.conf
│       └── 10-ssl.conf
├── certs/
│   ├── mail.crt
│   └── mail.key
└── vmail/
    └── (メールボックスデータ)



Containerfile

Containerfileを作成する。

 FROM ubuntu:22.04
 
 ENV DEBIAN_FRONTEND=noninteractive
 
 RUN apt update &&    \
     apt install -y   \
        postfix       \
        dovecot-imapd \
        dovecot-pop3d \
        dovecot-lmtpd \
        supervisor    \
        rsyslog &&    \
     apt clean &&     \
     rm -rf /var/lib/apt/lists/*
 
 COPY postfix/ /etc/postfix/
 COPY dovecot/ /etc/dovecot/
 COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
 
 RUN mkdir -p /var/mail/vmail && \
     groupadd -g 5000 vmail && \
     useradd -u 5000 -g vmail -s /usr/sbin/nologin -d /var/mail/vmail vmail && \
     chown -R vmail:vmail /var/mail/vmail
 
 EXPOSE 25 587 993 995
 
 CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]


コンテナイメージをビルドする。

podman build -t mailserver:custom -f Containerfile .


ビルドしたイメージからコンテナを実行する。

podman run -d                         \
       --name mailserver              \
       --hostname mail.example.com    \
       -p 0.0.0.0:25:25               \
       -p 0.0.0.0:587:587             \
       -p 0.0.0.0:993:993             \
       -v ./vmail:/var/mail/vmail     \
       -v ./certs:/etc/ssl/certs/mail \
  mailserver:custom



Compose

Composeファイルを作成する。

 version: '3.8'
 
 services:
   mailserver:
     image: ubuntu:22.04
     container_name: mailserver
     hostname: mail.example.com
     ports:
       - "0.0.0.0:25:25"      # SMTP
       - "0.0.0.0:587:587"    # SMTP Submission
       - "0.0.0.0:993:993"    # IMAPS
       - "0.0.0.0:995:995"    # POP3S
     volumes:
       - ./postfix/main.cf:/etc/postfix/main.cf
       - ./postfix/master.cf:/etc/postfix/master.cf
       - ./dovecot/dovecot.conf:/etc/dovecot/dovecot.conf
       - ./dovecot/conf.d:/etc/dovecot/conf.d
       - ./certs:/etc/ssl/certs/mail
       - ./vmail:/var/mail/vmail
       - mailserver-spool:/var/spool/postfix
       - mailserver-logs:/var/log
     environment:
       - DOMAIN=example.com
       - HOSTNAME=mail.example.com
     restart: unless-stopped
     command: |
       /bin/bash -c "apt update && \
       apt install -y postfix dovecot-imapd dovecot-pop3d supervisor && \
       /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf"
 
 volumes:
   mailserver-spool:
   mailserver-logs:


Composeファイルを実行して、コンテナを作成および実行する。

podman-compose up -d
# または
podman-compose -f <Composeファイル名> up -d



Postfix設定ファイル

main.cf

main.cfファイルは、サーバのホスト名、受信するドメイン、認証方式、TLS暗号化、セキュリティポリシー、バーチャルメールボックスの設定等のメールサーバの基本的な動作を定義する。

postfix/main.cfファイルを作成する。

 # 基本設定
 myhostname = mail.example.com              # メールサーバのホスト名(FQDN)
 mydomain = example.com                     # 所属するドメイン名
 myorigin = $mydomain                       # 送信メールの送信元ドメイン
 mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain  # 最終配送先として受け取るドメイン
 relayhost =                                # 外部SMTPリレーサーバ(空白の場合は直接配送)
 mynetworks = 127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16  # 信頼するネットワーク範囲
 inet_interfaces = all                      # 待ち受けるネットワークインターフェース (all : 全て)
 inet_protocols = ipv4                      # 使用するプロトコル (ipv4 / ipv6 / all)
 
 # メールボックス設定
 home_mailbox = Maildir/                    # メールボックス形式 (Maildir形式)
 mailbox_command =                          # メール配送時の外部コマンド (空白 : 標準配送)
 
 # SASL認証設定 (Dovecot経由)
 smtpd_sasl_type = dovecot                  # SASL認証のバックエンドタイプ
 smtpd_sasl_path = private/auth             # Dovecot認証ソケットのパス
 smtpd_sasl_auth_enable = yes               # SMTP認証機能の有効化
 smtpd_sasl_security_options = noanonymous  # 匿名認証の無効化
 smtpd_sasl_local_domain = $mydomain        # SASL認証で使用するローカルドメイン
 broken_sasl_auth_clients = yes             # 古いクライアントとの互換性維持
 
 # TLS設定
 smtpd_use_tls = yes                        # TLS暗号化機能の有効化
 smtpd_tls_cert_file = /etc/ssl/certs/mail/mail.crt        # サーバ証明書ファイルのパス
 smtpd_tls_key_file = /etc/ssl/certs/mail/mail.key         # 秘密鍵ファイルのパス
 smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache  # サーバ側TLSセッションキャッシュ
 smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache    # クライアント側TLSセッションキャッシュ
 smtpd_tls_security_level = may             # TLSセキュリティレベル (may : 任意、encrypt : 必須)
 smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1    # 使用禁止プロトコル (! : 禁止)
 smtpd_tls_ciphers = high                   # 暗号化方式の強度 (high : 高強度のみ)
 smtpd_tls_mandatory_ciphers = high         # TLS必須時の暗号化方式強度
 
 # セキュリティ設定
 # 受信者アドレスに対する制限ルール(上から順に評価)
 smtpd_recipient_restrictions =
     permit_mynetworks,                     # 信頼ネットワークからの接続を許可
     permit_sasl_authenticated,             # SASL認証済みクライアントを許可
     reject_unauth_destination,             # 未認証の外部ドメイン宛を拒否 (オープンリレー防止)
     reject_invalid_hostname,               # 無効なホスト名を拒否
     reject_non_fqdn_sender,                # 送信者がFQDNでない場合を拒否
     reject_non_fqdn_recipient,             # 受信者がFQDNでない場合を拒否
     reject_unknown_sender_domain,          # 送信者ドメインのDNS解決失敗を拒否
     reject_unknown_recipient_domain        # 受信者ドメインのDNS解決失敗を拒否
 
 # バーチャルメールボックス設定
 virtual_mailbox_domains = example.com      # バーチャルドメインとして扱うドメイン
 virtual_mailbox_base = /var/mail/vmail     # バーチャルメールボックスのベースディレクトリ
 virtual_mailbox_maps = hash:/etc/postfix/vmailbox  # メールアドレスとメールボックスの対応ファイル
 virtual_minimum_uid = 1000                 # 使用する最小UID値
 virtual_uid_maps = static:5000             # バーチャルメールボックスで使用する固定UID
 virtual_gid_maps = static:5000             # バーチャルメールボックスで使用する固定GID
 virtual_alias_maps = hash:/etc/postfix/virtual  # メールエイリアス (転送設定) ファイル


master.cf

master.cfファイルは、Postfixのサービスプロセスを制御する設定ファイルである。

各サービスの起動方法、プロセス数、実行ユーザ、コマンドラインオプション等を定義する。
また、SMTP、SMTP Submission、LMTPなどの各種サービスの動作を個別に設定することができる。

特に、SMTP Submission (ポート587) の設定では、認証必須やTLS暗号化必須等のオプションを追加することにより、セキュアなメール送信環境を構築することができる。

postfix/master.cfファイルに、SMTP Submissionポート (587番) の設定を追加する。

# SMTP Submission (ポート587) の設定
# サービス定義 : submission / inet / smtpdプロセスを起動
submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission           # syslogでの識別名
  -o smtpd_tls_security_level=encrypt         # TLS暗号化を必須化
  -o smtpd_sasl_auth_enable=yes               # SASL認証を有効化
  -o smtpd_reject_unlisted_recipient=no       # 受信者リスト外への配送を許可
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject  # 認証済みのみ許可
  -o milter_macro_daemon_name=ORIGINATING     # メールフィルタに内部送信を通知


バーチャルメールボックスの設定

vmailboxファイルは、メールアドレスとそれに対応するメールボックスのディレクトリパスを関連付ける。

各行には、左側にメールアドレス、右側にそのメールボックスの相対パスを記述する。
このファイルを編集した後は、postmapコマンドでハッシュデータベースに変換する必要がある。

Postfixは、このハッシュデータベースを参照して、受信したメールを適切なメールボックスに配送する。

postfix/vmailboxファイルを作成して、仮想メールボックスを定義する。

 # 形式 : メールアドレス    メールボックスの相対パス
 # パスはvirtual_mailbox_base (/var/mail/vmail) からの相対パス
 user1@example.com    example.com/user1/     # user1のメールボックス
 user2@example.com    example.com/user2/     # user2のメールボックス
 info@example.com     example.com/info/      # infoのメールボックス


ハッシュデータベースを生成する。

postmap /etc/postfix/vmailbox
postmap /etc/postfix/virtual



Dovecot設定ファイル

dovecot.conf

dovecot/dovecot.confファイルを作成する。

 protocols = imap pop3 lmtp
 listen = *, ::
 base_dir = /var/run/dovecot/
 instance_name = dovecot
 
 !include conf.d/*.conf
 !include_try local.conf


認証設定 (10-auth.conf)

dovecot/conf.d/10-auth.confファイルを作成する。

disable_plaintext_auth = yes
auth_mechanisms = plain login

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

userdb {
  driver = static
  args = uid=vmail gid=vmail home=/var/mail/vmail/%u
}


メールボックス設定 (10-mail.conf)

dovecot/conf.d/10-mail.confファイルを作成する。

mail_location = maildir:/var/mail/vmail/%u
namespace inbox {
  inbox = yes
}
mail_privileged_group = mail
first_valid_uid = 5000
last_valid_uid = 5000
first_valid_gid = 5000
last_valid_gid = 5000


サービス設定 (10-master.conf)

dovecot/conf.d/10-master.confファイルを作成して、Postfix用のSASL認証ソケットを設定する。

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

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
  }
}


SSL/TLS設定 (10-ssl.conf)

dovecot/conf.d/10-ssl.confファイルを作成する。

 ssl = required
 ssl_cert = </etc/ssl/certs/mail/mail.crt
 ssl_key = </etc/ssl/certs/mail/mail.key
 ssl_min_protocol = TLSv1.2
 ssl_cipher_list = HIGH:!aNULL:!MD5
 ssl_prefer_server_ciphers = yes
 ssl_dh = </etc/dovecot/dh.pem



SSL / TLS証明書

自己署名証明書の作成

テスト環境用に自己署名証明書を作成する例を以下に示す。

mkdir -p ./certs


openssl req -x509 -nodes -days 365 -newkey rsa:4096 \
  -keyout ./certs/mail.key \
  -out ./certs/mail.crt \
  -subj "/C=JP/ST=Tokyo/L=Tokyo/O=MyCompany/CN=mail.example.com"


chmod 600 ./certs/mail.key
chmod 644 ./certs/mail.crt


Diffie-Hellmanパラメータの生成

Dovecotで使用するDHパラメータを生成する。

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


Let's Encrypt証明書の使用

本番環境では、Let's Encryptを使用した正規の証明書を取得することを推奨する。

certbot certonly --standalone -d mail.example.com


# 証明書をコピー
cp /etc/letsencrypt/live/mail.example.com/fullchain.pem ./certs/mail.crt
cp /etc/letsencrypt/live/mail.example.com/privkey.pem ./certs/mail.key



ユーザ管理

ユーザーの追加

Dovecotのusersファイルにユーザーを追加する。パスワードハッシュはdoveadmコマンドで生成する。

# コンテナ内でパスワードハッシュを生成
podman exec -it mailserver doveadm pw -s SHA512-CRYPT

# Enter new password: (パスワードを入力)
# Retype new password: (パスワードを再入力)
# {SHA512-CRYPT}$6$...


dovecot/usersファイルに生成したハッシュを追加する。

 user1@example.com:{SHA512-CRYPT}$6$...
 user2@example.com:{SHA512-CRYPT}$6$...
 info@example.com:{SHA512-CRYPT}$6$...


メールボックスディレクトリの作成

ユーザごとのメールボックスディレクトリを作成する。

mkdir -p ./vmail/example.com/user1
mkdir -p ./vmail/example.com/user2
mkdir -p ./vmail/example.com/info

chown -R 5000:5000 ./vmail


ユーザの削除

usersファイルから該当行を削除して、メールボックスディレクトリを削除する。

# usersファイルから削除
sed -i '/user1@example.com/d' dovecot/users

# メールボックスディレクトリを削除
rm -rf ./vmail/example.com/user1



メールの送受信

SMTP接続テスト

telnetコマンドを使用してSMTP接続をテストする。

telnet mail.example.com 25


以下に示すコマンドを順に入力する。

EHLO test.local
MAIL FROM:<sender@example.com>
RCPT TO:<user1@example.com>
DATA
Subject: Test Mail

This is a test message.
.
QUIT


SMTP Submission接続テスト (認証付き)

opensslコマンドを使用してSMTP Submissionポートへの接続をテストする。

openssl s_client -connect mail.example.com:587 -starttls smtp


接続後、以下に示すコマンドを入力する。

EHLO test.local
AUTH LOGIN
# Base64エンコードされたユーザ名とパスワードを入力


Base64エンコードは以下に示すコマンドで生成する。

echo -n 'user1@example.com' | base64
echo -n 'password' | base64


IMAP接続テスト

opensslコマンドを使用してIMAPS接続をテストする。

openssl s_client -connect mail.example.com:993


接続後、以下に示すコマンドを入力する。

a001 LOGIN user1@example.com password
a002 LIST "" "*"
a003 SELECT INBOX
a004 LOGOUT


POP3接続テスト

opensslコマンドを使用してPOP3S接続をテストする。

openssl s_client -connect mail.example.com:995

# 接続後、以下のコマンドを入力
USER user1@example.com
PASS password
LIST
RETR 1
QUIT


メールクライアントでの接続テスト

ThunderbirdやOutlook等どのメールクライアントで接続する場合の設定を以下に示す。

メールクライアント設定パラメータ
項目 受信サーバ (IMAP) 送信サーバ (SMTP)
サーバ名 mail.example.com mail.example.com
ポート番号 993 587
セキュリティ SSL / TLS STARTTLS
認証方式 通常のパスワード認証 通常のパスワード認証
ユーザー名 user1@example.com user1@example.com



ログの管理

Postfixログの確認

Postfixのログをリアルタイムで確認する。

podman exec mailserver tail -f /var/log/mail.log
# または
podman exec mailserver tail -f /var/log/syslog | grep postfix


特定のメールアドレスに関連するログを検索する。

podman exec mailserver grep "user1@example.com" /var/log/mail.log


Dovecotログの確認

Dovecotのログをリアルタイムで確認する。

podman exec mailserver tail -f /var/log/mail.log | grep dovecot


認証失敗のログを確認する。

podman exec mailserver grep "auth failed" /var/log/mail.log


コンテナログの確認

podman logsコマンドでコンテナ全体のログを確認する。

podman logs -f mailserver

# 最新100行のみ表示
podman logs --tail 100 mailserver

# タイムスタンプ付きで表示
podman logs -t mailserver


ログのローテーション設定

ログファイルが肥大化しないように、logrotateを設定する。

  • /etc/logrotate.d/mailserver ファイルの例
     /path/to/logs/mail.log {
        daily
        rotate 30
        compress
        delaycompress
        notifempty
        create 0640 syslog adm
        sharedscripts
        postrotate
           podman exec mailserver postfix reload
           podman exec mailserver doveadm reload
        endscript
     }
    



メールキューの管理

キュー内のメール一覧表示

キューに滞留しているメールを確認する。

podman exec mailserver postqueue -p


特定のメールをキューから削除

キューIDを指定してメールを削除する。

podman exec mailserver postsuper -d <キューID>


全てのメールをキューから削除する。

podman exec mailserver postsuper -d ALL


キューの再送信

キューに滞留しているメールを強制的に再送信する。

podman exec mailserver postqueue -f


保留中のメールの確認

保留 (hold) 状態のメールを確認する。

podman exec mailserver postqueue -p | grep -A 2 "^[A-F0-9]*\*"



セキュリティ設定

SPFレコードの設定

DNSにSPFレコードを追加して、送信元の正当性を検証する。

example.com.  IN  TXT  "v=spf1 ip4:203.0.113.10 ~all"


DKIMの設定

OpenDKIMを使用してメールに電子署名を付与する。

これは、OpenDKIMをコンテナに追加する。

# OpenDKIMのインストール
apt install -y opendkim opendkim-tools

# 鍵の生成
mkdir -p /etc/opendkim/keys/example.com
opendkim-genkey -D /etc/opendkim/keys/example.com/ -d example.com -s mail

# DNSにTXTレコードを追加
cat /etc/opendkim/keys/example.com/mail.txt


DMARCレコードの設定

DNSにDMARCレコードを追加して、SPFとDKIMの検証結果を管理する。

_dmarc.example.com.  IN  TXT  "v=DMARC1; p=quarantine; rua=mailto:dmarc@example.com"


接続制限の設定

Postfixで接続数とレート制限を設定する。

これは、main.cfに以下に示す設定を追加する。

 # 接続数制限
 smtpd_client_connection_count_limit = 10
 smtpd_client_connection_rate_limit = 30
 
 # メッセージサイズ制限
 message_size_limit = 10240000
 mailbox_size_limit = 102400000
 
 # レシピエント制限
 smtpd_recipient_limit = 100


アクセス制御リストの設定

特定のIPアドレスやドメインからのアクセスを制御する。

postfix/accessファイルを作成する。

# 許可するIPアドレス
192.168.1.0/24     OK
10.0.0.0/8         OK

# 拒否するドメイン
spam-domain.com    REJECT
bad-sender.net     REJECT


ハッシュデータベースを生成して、main.cfに設定を追加する。

postmap /etc/postfix/access


main.cfに追加する設定を以下に示す。

smtpd_client_restrictions =
    check_client_access hash:/etc/postfix/access,
    permit_mynetworks,
    reject_unknown_client_hostname



スパムフィルタの設定

SpamAssassinを使用して、スパムメールをフィルタリングする。

SpamAssassinのインストール

コンテナ内にSpamAssassinをインストールする。

apt install -y spamassassin spamc


SpamAssassinの設定

/etc/default/spamassassinファイルを編集して、SpamAssassinを有効化する。

ENABLED=1
SPAMD_HOME="/var/lib/spamassassin/"
OPTIONS="--create-prefs --max-children 5 --username spamd --helper-home-dir ${SPAMD_HOME} -s ${SPAMD_HOME}spamd.log"


Postfixとの連携

master.cfにSpamAssassinの設定を追加する。

smtp      inet  n       -       y       -       -       smtpd
  -o content_filter=spamassassin

spamassassin unix -     n       n       -       -       pipe
  user=spamd argv=/usr/bin/spamc -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient}



バックアップと復元

メールボックスのバックアップ

vmailディレクトリをtarで圧縮してバックアップする。

tar Jcf mailbox-backup-$(date +%Y%m%d).tar.xz -C ./vmail .


設定ファイルのバックアップ

設定ファイルをまとめてバックアップする。

tar Jcf config-backup-$(date +%Y%m%d).tar.xz postfix/ dovecot/ certs/


メールボックスの復元

バックアップからメールボックスを復元する。

tar xf mailbox-backup-20250107.tar.xz -C ./vmail
chown -R 5000:5000 ./vmail


定期バックアップスクリプト

Cronで定期的にバックアップを実行することもできる。

 #!/usr/bin/env sh
 
 BACKUP_DIR="/backup/mailserver"
 DATE=$(date +%Y%m%d_%H%M%S)
 
 mkdir -p ${BACKUP_DIR}
 
 # メールボックスのバックアップ
 tar Jcf ${BACKUP_DIR}/vmail-${DATE}.tar.xz -C /path/to/vmail .
 
 # 設定ファイルのバックアップ
 tar Jcf ${BACKUP_DIR}/config-${DATE}.tar.xz postfix/ dovecot/ certs/
 
 # 古いバックアップの削除 (30日以上前)
 find ${BACKUP_DIR} -name "*.tar.gz" -mtime +30 -delete



パフォーマンスチューニング

Postfixの同時接続数設定

main.cfファイルを編集して、同時接続数を調整する。

 # デフォルトのプロセス数
 default_process_limit = 100
 
 # SMTPデーモンのプロセス数
 smtpd_client_connection_count_limit = 50
 
 # 配信プロセスの数
 maximal_queue_lifetime = 5d
 bounce_queue_lifetime = 5d


Dovecotのプロセス数設定

10-master.confファイルを編集して、プロセス数を調整する。

service imap-login {
  process_min_avail = 4
  process_limit = 100
}

service pop3-login {
  process_min_avail = 2
  process_limit = 50
}

service auth {
  process_limit = 100
}


メールボックスキャッシュの設定

Dovecotのキャッシュ設定を最適化する。

これは、10-mail.confファイルに設定を追加する。

 mail_cache_min_mail_count = 10
 mailbox_list_index = yes
 mail_location = maildir:/var/mail/vmail/%u:LAYOUT=fs


ディスクI/O最適化

メールボックスのディスクI/Oを最適化する。

 # Postfixのキュー配置最適化
 queue_directory = /var/spool/postfix
 
 # Dovecotのインデックスファイル配置
 mail_location = maildir:/var/mail/vmail/%u:INDEX=/var/indexes/%u



トラブルシューティング

コンテナが起動しない

設定ファイルの構文エラーを確認する。

# Postfixの設定確認
podman exec mailserver postfix check

# Dovecotの設定確認
podman exec mailserver doveconf -n

# コンテナログの確認
podman logs mailserver


メール送信ができない

SMTP接続とSASL認証を確認する。

# SMTP接続テスト
telnet mail.example.com 25

# SASL認証機構の確認
podman exec mailserver postconf -n | grep sasl

# Dovecot認証ソケットの確認
podman exec mailserver ls -la /var/spool/postfix/private/auth


メール受信ができない

メールボックスのパーミッションとDovecotの設定を確認する。

# メールボックスのパーミッション確認
ls -la ./vmail

# Dovecotのユーザー設定確認
podman exec mailserver doveadm user user1@example.com

# Dovecotログの確認
podman exec mailserver grep dovecot /var/log/mail.log


認証エラー

ユーザ設定とパスワードハッシュを確認する。

# usersファイルの確認
cat dovecot/users

# パスワードハッシュの再生成
podman exec -it mailserver doveadm pw -s SHA512-CRYPT

# 認証テスト
podman exec mailserver doveadm auth test user1@example.com


TLS/SSL接続エラー

証明書とTLS設定を確認する。

# 証明書の有効性確認
openssl x509 -in ./certs/mail.crt -text -noout

# TLS接続テスト
openssl s_client -connect mail.example.com:587 -starttls smtp

# Postfixの証明書設定確認
podman exec mailserver postconf | grep tls


メールキューの滞留

キューに滞留しているメールの原因を調査する。

# キューの状態確認
podman exec mailserver postqueue -p

# 特定のメールの詳細確認
podman exec mailserver postcat -q <キューID>

# ログでエラーを確認
podman exec mailserver grep "status=deferred" /var/log/mail.log


ポート番号の競合

他のサービスとポート番号が競合している場合、別のポートを使用する。

# 使用中のポート確認
netstat -tuln | grep -E ':(25|587|993|995)'

# 別ポートで起動
podman run -d --name mailserver -p 0.0.0.0:2525:25 -p 0.0.0.0:2587:587 mailserver:custom



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

同一ネットワーク上の外部PCからアクセスする場合は、ファイヤーウォールのポート開放を行う。

Linux

# Firewalldを使用している場合
sudo firewall-cmd --permanent --add-service=smtp
sudo firewall-cmd --permanent --add-service=smtp-submission
sudo firewall-cmd --permanent --add-service=imaps
sudo firewall-cmd --permanent --add-service=pop3s
sudo firewall-cmd --reload

# またはポート番号で指定
sudo firewall-cmd --permanent --add-port=25/tcp
sudo firewall-cmd --permanent --add-port=587/tcp
sudo firewall-cmd --permanent --add-port=993/tcp
sudo firewall-cmd --permanent --add-port=995/tcp
sudo firewall-cmd --reload

# UFWを使用している場合
sudo ufw allow 25/tcp
sudo ufw allow 587/tcp
sudo ufw allow 993/tcp
sudo ufw allow 995/tcp


Windows 11

PowerShellを管理者権限で起動して、以下に示すコマンドを実行する。

SMTPポートの受信ルールを追加する。

New-NetFirewallRule -DisplayName "Mail SMTP" -Direction Inbound -Protocol TCP -LocalPort 25 -Action Allow


SMTP Submissionポートの受信ルールを追加する。

New-NetFirewallRule -DisplayName "Mail SMTP Submission" -Direction Inbound -Protocol TCP -LocalPort 587 -Action Allow


IMAPSポートの受信ルールを追加する。

New-NetFirewallRule -DisplayName "Mail IMAPS" -Direction Inbound -Protocol TCP -LocalPort 993 -Action Allow


POP3Sポートの受信ルールを追加する。

New-NetFirewallRule -DisplayName "Mail POP3S" -Direction Inbound -Protocol TCP -LocalPort 995 -Action Allow


正常にポート開放が行われているかどうかを確認する場合、別PCからPowerShellを起動して、以下に示すコマンドを実行する。

Test-NetConnection -ComputerName <Windows PCのIPアドレス> -Port 25
Test-NetConnection -ComputerName <Windows PCのIPアドレス> -Port 587
Test-NetConnection -ComputerName <Windows PCのIPアドレス> -Port 993
Test-NetConnection -ComputerName <Windows PCのIPアドレス> -Port 995


ファイアウォールルールを削除する場合は、以下に示すコマンドを実行する。

Remove-NetFirewallRule -DisplayName "Mail SMTP" -ErrorAction SilentlyContinue
Remove-NetFirewallRule -DisplayName "Mail SMTP Submission" -ErrorAction SilentlyContinue
Remove-NetFirewallRule -DisplayName "Mail IMAPS" -ErrorAction SilentlyContinue
Remove-NetFirewallRule -DisplayName "Mail POP3S" -ErrorAction SilentlyContinue


Windows 10

PowerShellを管理者権限で起動して、以下に示すコマンドを実行する。

SMTPポートの受信ルールを追加する。

New-NetFirewallRule -DisplayName "Mail SMTP" -Direction Inbound -Protocol TCP -LocalPort 25 -Action Allow


SMTP Submissionポートの受信ルールを追加する。

New-NetFirewallRule -DisplayName "Mail SMTP Submission" -Direction Inbound -Protocol TCP -LocalPort 587 -Action Allow


IMAPSポートの受信ルールを追加する。

New-NetFirewallRule -DisplayName "Mail IMAPS" -Direction Inbound -Protocol TCP -LocalPort 993 -Action Allow


POP3Sポートの受信ルールを追加する。

New-NetFirewallRule -DisplayName "Mail POP3S" -Direction Inbound -Protocol TCP -LocalPort 995 -Action Allow


正常にポート開放が行われているかどうかを確認する場合、別のPCからPowerShellを起動して、以下に示すコマンドを実行する。

Test-NetConnection -ComputerName <Windows PCのIPアドレス> -Port 25
Test-NetConnection -ComputerName <Windows PCのIPアドレス> -Port 587
Test-NetConnection -ComputerName <Windows PCのIPアドレス> -Port 993
Test-NetConnection -ComputerName <Windows PCのIPアドレス> -Port 995


ファイアウォールルールを削除する場合は、以下に示すコマンドを実行する。

Remove-NetFirewallRule -DisplayName "Mail SMTP" -ErrorAction SilentlyContinue
Remove-NetFirewallRule -DisplayName "Mail SMTP Submission" -ErrorAction SilentlyContinue
Remove-NetFirewallRule -DisplayName "Mail IMAPS" -ErrorAction SilentlyContinue
Remove-NetFirewallRule -DisplayName "Mail POP3S" -ErrorAction SilentlyContinue