Contents
概要
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)の構築は下記のリンクから移動して下さい。