手当たり次第に書くんだ

飽きっぽいのは本能

CentOS 8 Postfix 内部メールサーバー構築

目次に戻る

概要

Postfixを使用して内部向けのメールサーバーを構築します。SMTPS、SMTP認証、メールエイリアスのLDAP連携に対応しています。

前提条件

OS

CentOS Stream 8を使用します。

SELinux

有効です。無効にする場合はこちらを参照して下さい。

Firewalld

無効です。有効化する場合はこちらを参照して必要な許可設定をして下さい。

その他

本稿のPosftixはSASL認証の利用を想定しており、利用者はローカルユーザーかLDAPユーザーを想定しています。LDAPユーザーを使用する場合はこちらを参照して下さい。

標準ポート番号

TCP:25 (SMTP), TCP:465 (SMTPS)

構成

本稿で想定しているメールシステムの全体像は下記の通りです。

用語

メールシステムに関連する用語を簡単にまとめています。

MTA
MTA(Mail Transfer Agent)はメールの配送プログラム(SMTPサーバー)です。SMTPプロトコルを使用してメールを配送します。他のMTAからメールを受け取り、MDAや他のMTAにメールを配送します。配送先はエンベロープアドレスからDNSを検索して配送先を決定します。ローカル宛の場合はMDAに配送する。CentOS8ではPostfixが標準です。
MUA
MUA(Mail User Agent)はThunderbirdやOutlook等のメーラーです。メールの送信時はSMTPプロトコルを使用してMTAに接続して送信します。メールの受信時はPOP/IMAPプロトコルを使用してMRAに接続して受信します。
MDA
MDA(Mail Delivery Agent)はMTAが受け取ったメールをユーザー毎のメールボックスに配送するプログラムです。実際はProcmail等のLDA(Local Delivery Agent)です。MTAが受け取ったメールをMUAが読み取れるようにローカルに配送します。システム間のメール配送には関与しません。メールボックスにはMailbox形式とMaildir形式があります。
MRA
MRA(Mail Retrieval Agent)は個々のメールボックスに蓄えられているメールをMUAに渡すプログラム(POP/IMAPサーバー)です。CentOS8ではDovecotが標準です。

所感

メールサーバーは他のサーバーとの関連が多く(認証やDNS)、構成パターンも多い為、比較的難易度は高めです。メール配送の流れを理解しないと設定値の検討も難しいでしょう。

設定

インストール

Postfixをインストールします。postfix-ldapはLDAP連携用、cyrus-saslはSASL認証で使用するソフトウェアです。

[root@centos ~]# dnf install postfix postfix-ldap cyrus-sasl

/etc/postfix/main.cf

main.cfのデフォルト値

コメント行等を削除したmain.cfは下記の通りです。

compatibility_level = 2
queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
mail_owner = postfix
inet_interfaces = localhost
inet_protocols = all
mydestination = $myhostname, localhost.$mydomain, localhost
unknown_local_recipient_reject_code = 550
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
debug_peer_level = 2
debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd $daemon_directory/$process_name $process_id & sleep 5
sendmail_path = /usr/sbin/sendmail.postfix
newaliases_path = /usr/bin/newaliases.postfix
mailq_path = /usr/bin/mailq.postfix
setgid_group = postdrop
html_directory = no
manpage_directory = /usr/share/man
sample_directory = /usr/share/doc/postfix/samples
readme_directory = /usr/share/doc/postfix/README_FILES
smtpd_tls_cert_file = /etc/pki/tls/certs/postfix.pem
smtpd_tls_key_file = /etc/pki/tls/private/postfix.key
smtpd_tls_security_level = may
smtp_tls_CApath = /etc/pki/tls/certs
smtp_tls_CAfile = /etc/pki/tls/certs/ca-bundle.crt
smtp_tls_security_level = may
meta_directory = /etc/postfix
shlib_directory = /usr/lib64/postfix

main.cfの設定

main.cfを編集します。

[root@centos ~]# vi /etc/postfix/main.cf
compatibility_level = 2
queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
mail_owner = postfix
myhostname = smtp.si1230.com
inet_interfaces = all
inet_protocols = all
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
unknown_local_recipient_reject_code = 550
mynetworks = 127.0.0.0/8
relayhost = mail.si1230.com
alias_maps = hash:/etc/aliases, ldap:/etc/postfix/ldap-aliases.cf
alias_database = hash:/etc/aliases
mailbox_command = /usr/libexec/dovecot/deliver
debug_peer_level = 2
debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd $daemon_directory/$process_name $process_id & sleep 5
sendmail_path = /usr/sbin/sendmail.postfix
newaliases_path = /usr/bin/newaliases.postfix
mailq_path = /usr/bin/mailq.postfix
setgid_group = postdrop
html_directory = no
manpage_directory = /usr/share/man
sample_directory = /usr/share/doc/postfix/samples
readme_directory = /usr/share/doc/postfix/README_FILES
smtpd_tls_cert_file = /etc/pki/tls/certs/server.crt
smtpd_tls_key_file = /etc/pki/tls/private/server.key
smtpd_tls_security_level = may
smtp_tls_CApath = /etc/pki/tls/certs
smtp_tls_CAfile = /etc/pki/tls/certs/ca-bundle.crt
smtp_tls_security_level = may
meta_directory = /etc/postfix
shlib_directory = /usr/lib64/postfix
smtpd_sasl_auth_enable = yes
追加した設定項目

main.cfに追加した設定は下記の通りです。

項目名 説明
myhostname 外部から自身を識別するFQDNを指定します。
mynetworks 指定したIPアドレス(ネットワークアドレス)からのメールの中継が許可されます。本稿ではSASL認証で中継を許可する為、mynetworksで送信元の許可は不要であり、127.0.0.0/8のみを設定しています(mynetworksは外部からのメール中継を許可しない)。postconf -dの出力結果は自身が所属するサブネット(127.0.0.0/8を含む)であり、これはmynetworks_styleの設定値から自動的に割り当てられています。
relayhost 非ローカルメールの配送先を指定します。指定しない場合はMXレコードを検索して配送先を決定します。本稿では外部へのメールは外部メールサーバーに配送します。
mailbox_command ローカル配送エージェントが使うオプションの外部コマンドです。本稿ではSieveを使用する為、DovecotのLDAを指定しています。
smtpd_sasl_auth_enable SASL認証を有効/無効を設定します。本稿ではSASL認証を有効にします。
変更した設定値

デフォルトのmain.cfから変更した設定は下記の通りです。SSL証明書の作成はこちらを参照して下さい。

項目名 説明
inet_interfaces PostfixがListenするインターフェイスのIPアドレスを指定します。allは全てのインターフェイスです。
mydestination ローカル配送対象のドメインのリストです。指定したドメイン宛のメールを受信できます。デフォルト値に$mydomainを追加しています。これはメール中継ではない為、mynetworks等のメール中継制限は関係しません。
alias_maps ローカル配送で使われるエイリアスのデータベースです。本稿ではデフォルト値にLDAPを追加しています。
smtpd_tls_cert_file サーバー証明書のファイルを指定します。
smtpd_tls_key_file サーバー証明書の秘密鍵のファイルを指定します。
その他

以下の設定を記載しているケースが多く見られますが、本稿では、意図している設定値とpostconf -d(設定ファイル無しのデフォルト値)の設定値が同じである為、設定ファイル上では記載していません。

mydomain

デフォルトではmyhostnameから最初の要素を差し引いた値が使用されます。smtp.si1230.comであればmydomainの値はsi1230.comとなります。

myorigin

myoriginのpostconf -dの出力結果は$myhostnameです。この設定値は大抵の場合$myhostnameであり、特別な変更要件が無ければ明示的に設定ファイルに記載する必要はないでしょう。

smtpd_recipient_restrictions

アクセス制御にはsmtpd_recipient_restrictionsを使うものと思っていましたが、現在ではsmtpd_relay_restrictionsで制御されているようです。

smtpd_relay_restrictionsはメール中継用の設定であり、postconf -dの出力結果ににpermit_mynetworks, permit_sasl_authenticated, defer_unauth_destinationが含まれています。変更の必要があれば明示的にmain.cfに設定する必要がありますが、大抵の場合は変更の必要がありません。

smtpd_recipient_restrictionsのpostconf -dの出力結果は空です。smtpd_recipient_restrictionsの利用目的はメール中継以外のSPAM対策等を想定されているようですが、本稿では省略します。

message_size_limit

message_size_limitのpostconf -dの出力結果は10240000(約10MB)です。デフォルトでも無制限ではないので本稿では設定していません。必要に応じて変更して下さい。

/etc/postfix/master.cf

master.cfのデフォルト値

コメント行等を削除したmaster.cfは下記の通りです。

smtp inet n - n - - smtpd
pickup unix n - n 60 1 pickup
cleanup unix n - n - 0 cleanup
qmgr unix n - n 300 1 qmgr
tlsmgr unix - - n 1000? 1 tlsmgr
rewrite unix - - n - - trivial-rewrite
bounce unix - - n - 0 bounce
defer unix - - n - 0 bounce
trace unix - - n - 0 bounce
verify unix - - n - 1 verify
flush unix n - n 1000? 0 flush
proxymap unix - - n - - proxymap
proxywrite unix - - n - 1 proxymap
smtp unix - - n - - smtp
relay unix - - n - - smtp -o syslog_name=postfix/$service_name
showq unix n - n - - showq
error unix - - n - - error
retry unix - - n - - error
discard unix - - n - - discard
local unix - n n - - local
virtual unix - n n - - virtual
lmtp unix - - n - - lmtp
anvil unix - - n - 1 anvil
scache unix - - n - 1 scache
postlog unix-dgram n - n - 1 postlogd

master.cfの設定

master.cfを編集します。

[root@centos ~]# vi /etc/postfix/master.cf
smtp inet n - n - - smtpd
smtps inet n - n - - smtpd -o smtpd_tls_wrappermode=yes
pickup unix n - n 60 1 pickup
cleanup unix n - n - 0 cleanup
qmgr unix n - n 300 1 qmgr
tlsmgr unix - - n 1000? 1 tlsmgr
rewrite unix - - n - - trivial-rewrite
bounce unix - - n - 0 bounce
defer unix - - n - 0 bounce
trace unix - - n - 0 bounce
verify unix - - n - 1 verify
flush unix n - n 1000? 0 flush
proxymap unix - - n - - proxymap
proxywrite unix - - n - 1 proxymap
smtp unix - - n - - smtp
relay unix - - n - - smtp -o syslog_name=postfix/$service_name
showq unix n - n - - showq
error unix - - n - - error
retry unix - - n - - error
discard unix - - n - - discard
local unix - n n - - local
virtual unix - n n - - virtual
lmtp unix - - n - - lmtp
anvil unix - - n - 1 anvil
scache unix - - n - 1 scache
postlog unix-dgram n - n - 1 postlogd

追加した設定項目

smtpsを有効にしてラッパーモード(TCP:465)でPostfixを起動します。smtpd_tls_wrappermode=yesを設定しない場合はStartTLSで起動するようです。こちらに非標準とあるのが少々気になります。

/etc/sysconfig/saslauthd

saslauthdのデフォルト値

コメント行等を削除し、最小化したsaslauthdは下記の通りです。

SOCKETDIR=/run/saslauthd
MECH=pam
FLAGS=

本稿のメールサーバーはSSSDを使用したLDAP認証が可能な状態を前提としています。saslauthdのデフォルト値はPAM(MECH=pam)である為、このファイルの変更は必要ありません。

/etc/postfix/ldap-aliases.cf

LDAPのメールエイリアスを参照する設定ファイルです。LDAP側の内容になりますが、mailAlternateAddress属性がユーザーに相当します。mailAlternateAddress宛てのメールはmailRoutingAddressで指定されたメールアドレスに転送されます。mailRoutingAddressは複数設定できますので使い方によってはメーリングリストのように使えますね。

LDAPの設定はこちらを参照して下さい。

server_host = ldaps://ldap.si1230.com
search_base = ou=mailalias,dc=si1230,dc=com
bind = yes
bind_dn = cn=readonly,dc=si1230,dc=com
bind_pw = password
version = 3
query_filter = mailAlternateAddress=%s
result_attribute = mailRoutingAddress

version = 3は無くでも動きますが、下記のログが出力されるので入れておきましょう。

warning: dict_ldap_open: URL scheme ldaps requires protocol version 3

サービス起動設定

Postfixとsaslauthdを起動します。

[root@centos ~]# systemctl enable --now postfix.service saslauthd.service
[root@centos ~]# systemctl status postfix.service saslauthd.service

Dovecot(MRA)の構築は下記のリンクから移動して下さい。

内部メールサーバー構築 No.2 Dovecot

目次に戻る

CentOS 8 Postfix 内部メールサーバー構築

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トップへ戻る