CentOS8でメールサーバ構築 – Postfixでメール送信設定

前回まででメールの受信が出来るようになりました。

今回はメール送信を行う為の設定を行います。

これが終わると、メールサーバとしての最低限の機能が揃うことになります。

(この後も迷惑メールフィルターやメール振り分け用の機能など追加する機能はありますけどね)

この記事で行うこと

  1. Postfixのmain.cfの設定
    1. メールサーバ接続時にサーバ情報を見せないようにする
    2. TLS証明書の設定
  2. Postfixのmaster.cfの設定
  3. Dovecotの設定
  4. その他の設定
    1. ファイアウォールの設定
    2. DNSの設定(SPF)
  5. 送信確認

1. Postfixのmain.cfの設定

以前話したとおり、メールを送信するのはMTAの仕事となります。

なので、今回はほとんどがMTAであるPostfixの設定となります。

まずは main.cf の設定から見ていきます。フルパスは /etc/postfix/main.cf です。

1-1. メールサーバ接続時にサーバ情報を見せないようにする

セキュリティ上、他人に見せる情報は必要最小限とするのが望ましいです。

Postfixの初期設定ではメールサーバ接続時にバージョンこそ見せないもののPostfixで稼働しているということを教えてしまいます。

一応念のためにPostfixであるという情報も見せないようにします。

  # SHOW SOFTWARE VERSION OR NOT
  #
  # The smtpd_banner parameter specifies the text that follows the 220
  # code in the SMTP server's greeting banner. Some people like to see
  # the mail version advertised. By default, Postfix shows no version.
  #
  # You MUST specify $myhostname at the start of the text. That is an
  # RFC requirement. Postfix itself does not care.
  #
- smtpd_banner = $myhostname ESMTP
 $mail_name
+ smtpd_banner = $myhostname ESMTP
  #smtpd_banner = $myhostname ESMTP $mail_name ($mail_version)

1-2. TLS証明書の設定

後述しますが、メール送信時はTLS暗号化された通信で通信します。

初期設定ではPostfixが自分で作った証明書を使いますが、この場合多くのメールクライアントは信頼できないサーバとして警告を出します。

また、中間者攻撃に弱くなるなどのデメリットもあるのでちゃんとした証明書を指定してあげます。

  # The full pathname of a file with the Postfix SMTP server RSA certificate
  # in PEM format. Intermediate certificates should be included in general,
  # the server certificate first, then the issuing CA(s) (bottom-up order).
  #
- smtpd_tls_cert_file = /etc/pki/tls/certs/postfix.pem
+
 smtpd_tls_cert_file = [証明書のパス]
  
  # The full pathname of a file with the Postfix SMTP server RSA private key
  # in PEM format. The private key must be accessible without a pass-phrase,
  # i.e. it must not be encrypted.
  #
- smtpd_tls_key_file = /etc/pki/tls/private/postfix.key
+ smtpd_tls_key_file = [証明書の秘密鍵のパス]

Dovecotの設定の時と違い < は不要ですが、パス自体はDovecotで設定したものと同じになるはずです。

2. Postfixのmaster.cfの設定

メールの送信ではSMTPの25番ポートでなく、他のポートを使う事になります。

25番ポートは不特定多数のメールサーバ同士でメールをやりとりするため、勝手に暗号化したり、認証を要求する事は出来ません。

そんな事をするとメールが届かなくなってしまいます。

なので別途で送信メール受付用のポートを作成して、そちらで暗号化や認証の要求を行って安全に身元が確認できて初めてメールを他のサーバに転送するというやり方を行います。

これがサブミッションポート(Submission=投稿)と呼ばれ、普通は587番ポートを使います。

master.cf にサブミッションポート固有の設定を作成し、サブミッションポートの時のみTLS接続で認証を行わせるようにします。

編集するファイルは /etc/postfix/master.cf となります。

- #submission inet n       -       n       -       -       smtpd
+ submission inet n       -       n       -       -       smtpd
- #  -o syslog_name=postfix/submission
+   -o syslog_name=postfix/submission
- #  -o smtpd_tls_security_level=encrypt
+   -o smtpd_tls_security_level=encrypt
- #  -o smtpd_sasl_auth_enable=yes
+   -o smtpd_sasl_auth_enable=yes
- #  -o smtpd_tls_auth_only=yes
+  -o smtpd_sasl_type=dovecot
+  -o smtpd_sasl_path=private/auth
+  -o smtpd_sasl_local_domain=$myhostname
- #  -o smtpd_reject_unlisted_recipient=no
- #  -o smtpd_client_restrictions=$mua_client_restrictions
+   -o smtpd_client_restrictions=permit_sasl_authenticated,reject
- #  -o smtpd_helo_restrictions=$mua_helo_restrictions
- #  -o smtpd_sender_restrictions=$mua_sender_restrictions
+   -o smtpd_sender_login_maps=hash:/etc/aliases
+   -o smtpd_sender_restrictions=reject_sender_login_mismatch
- #  -o smtpd_recipient_restrictions=
  -o smtpd_recipient_restrictions=reject_non_fqdn_recipient,reject_unknown_recipient_domain,permit_sasl_authenticated,reject
- #  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
- #  -o milter_macro_daemon_name=ORIGINATING

かなり長いので順に1つずつ解説していきます。

- #submission inet n       -       n       -       -       smtpd
+ submission inet n       -       n       -       -       smtpd

サブミッションのコメントを解除することでサブミッションを有効化します。

submissioninetnnsmtpd
サービス名ですネットワークからアクセス出来ることを意味しますメールシステムにアクセス出来ることを意味しますルート権限を使わない事を示します(デフォルト)ルートディレクトリを/var/spool/postfix/ に変更しないことを示します自動起動しないことを示します(デフォルト)同時に100件まで起動出来ることを示します(デフォルト)実行するコマンドを示します。なお、この後の -o はこのコマンドの引数です

上記表内で説明したとおり、以降の -osmtpd コマンドの引数となります。

この引数は main.cf のオプションを上書きして実行するというものになります。

このために個別の設定が出来るようになっています。

また、サービス名である submission の部分をポート番号に変更することで、メールを受け付けるためのポートを変更することが出来ます。

ただし、これを行う場合は4-1で行うファイアウォールの設定とは別の設定を行う必要があります。

必要なファイアウォールの設定はこの記事を参照してください。
- #  -o syslog_name=postfix/submission
+   -o syslog_name=postfix/submission

ログファイルにてログ発生サービスの名称を postfix/subimission にするというものです。

メール送信時の出来事か受信時の出来事か区別しやすくなるので有効化します。

- #  -o smtpd_tls_security_level=encrypt
+   -o smtpd_tls_security_level=encrypt

TLS接続を必須とするものです。(ちなみに、 encryptmay だとクライアント側に委ねる、 none だと暗号化しない、となります)

認証情報のやりとりを平文で行うので、TLS接続になってないとユーザ名とパスワードが流出し放題になってしまいます。

しっかりと設定しましょう。

- #  -o smtpd_sasl_auth_enable=yes
+   -o smtpd_sasl_auth_enable=yes

SASL認証を有効化するものです。

SASL認証というのは認証をどこか別の所に丸投げするための機構と考えてください。

今回は後述しますがDovecotに丸投げをしてメールボックスへの接続時と同様に認証して貰います。

- #  -o smtpd_tls_auth_only=yes

TLS接続の時のみ認証を実行するというオプションですが、そもそもTLS接続以外認めていないので冗長な設定になってしまいます。

なので、この設定は不要です

+  -o smtpd_sasl_type=dovecot
+  -o smtpd_sasl_path=private/auth
+  -o smtpd_sasl_local_domain=$myhostname

Dovecotに認証を丸投げしますよという部分です。

また、この後でDovecot側の設定でDovecotへ認証を任せる為のUNIXドメインソケット(窓口)を /var/spool/postfix/private/auth に設けるので、その場所を設定しています。

また、認証を任せるドメインの範囲を前回設定したホスト名に限定しています。

自分のドメインでもないメールを送信することはないので当然ですね。

- #  -o smtpd_reject_unlisted_recipient=no

知らないユーザ(自分が管轄しているはずだけど存在していないユーザ)へのメールを許可する設定です。

許可してしまうと、同じサーバのユーザにメールを送るときにメールアドレスを打ち間違えたりした時にメールが滞留したりするので許可する必要はないでしょう。

許可しなくても困ることはほぼないでしょうし。

- #  -o smtpd_client_restrictions=$mua_client_restrictions
+   -o smtpd_client_restrictions=permit_sasl_authenticated,reject

接続してきたクライアントをふるいに掛ける為の設定です。

今回はSASL認証でログインに成功したときのみ許可し、それ以外は全て却下します。

なお、元の設定の $mua_client_restrictions は存在しない変数です。

- #  -o smtpd_helo_restrictions=$mua_helo_restrictions

接続後最初のタイミングでふるいに掛ける為の設定です。

ただ、このタイミングで特にふるいに掛けるような条件が存在しないのでそのまま設定を削除します。

元の設定の $mua_helo_restrictions は存在しない変数です。

- #  -o smtpd_sender_restrictions=$mua_sender_restrictions
+   -o smtpd_sender_login_maps=hash:/etc/aliases
+   -o smtpd_sender_restrictions=reject_sender_login_mismatch

メール送信者を見てメールをふるいに掛ける為の設定です。

ログインしているユーザとメールの送信元のユーザを比べて問題ないかを確認させます。

送信元のユーザがログインしているユーザのエイリアスとして登録されていない場合は送信を却下します。

- #  -o smtpd_recipient_restrictions=
  -o smtpd_recipient_restrictions=reject_non_fqdn_recipient,reject_unknown_recipient_domain,permit_sasl_authenticated,reject

メール受信者を見て、メールをふるいに掛ける為の設定です。

メールの宛先がFQDNでない(ドメイン名が不完全な場合)、ドメイン名から宛先を解決出来ない場合に却下します。

その上でSASL認証を通っていた場合のみメールを送信させ、その他は却下します。

SASL認証を通っていなければそもそもここまで来る前に拒否されるはずですが、一応念のためですね。

- #  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
- #  -o milter_macro_daemon_name=ORIGINATING

それぞれ、メールリレー(中継)を行う場合、メールフィルターを使う場合の設定です。

今回はメールリレーはさせず、メールフィルターも使わないので不要となります。

これらの設定を反映すると、以下のようになるはずです。

submission inet n       -       n       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth
  -o smtpd_sasl_local_domain=$myhostname
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o smtpd_sender_login_maps=hash:/etc/aliases
  -o smtpd_sender_restrictions=reject_sender_login_mismatch
  -o smtpd_recipient_restrictions=reject_non_fqdn_recipient,reject_unknown_recipient_domain,permit_sasl_authenticated,reject

3. Dovecotの設定

先ほど話したとおり、PostfixがDovecotに認証を丸投げするための窓口を作ります。

設定内容は以前行ったLMTPの設定とほぼ同じです。

/etc/dovecot/conf.d/10-master.conf を編集します。

  # Postfix smtp-auth
- #unix_listener /var/spool/postfix/private/auth {
+ unix_listener /var/spool/postfix/private/auth {
- #  mode = 0666
+   user = postfix
+   group = postfix
+   mode = 0600
- #}
+ }

4. その他の設定

後は、ファイアウォールの設定とDNSの追加設定を行います。

4-1. ファイアウォールの設定

先ほど記述したとおり、メール送信の受付はサブミッションポート(587番)で受付を行います。

なので、このポートを開放するように設定します。

ファイアウォールについてはこちらを参照してください。
[root@localhost ~]# firewall-cmd --add-service=smtp-submission --permanent
[root@localhost ~]# firewall-cmd --reload

4-2. ネームサーバの設定(SPFレコード)

メールを送る際に必須というものではないのですが、こちらの設定を行わない場合、高い確率で迷惑メールとされてしまいます。

これは、DNSに「このサーバから送られるメールはうちが出してるメールで間違いないですよ」という情報を記載するものになります。

実はメールっていい加減なもので送信元のメールアドレスは勝手に名乗ることが出来てしまいます。

しかもメールを受け取る側ではメールアドレスを検証する方法がありませんでしたのでなりすまし放題です。

この状況を打破するために、DNSに自分のドメインのメールがどのサーバから送信するかの情報を記載するという方法が取られるようになりました。

公のDNS情報を書き換えられるのはドメインの所有者のみのはずなので、これで正統なドメイン所有者が指定したサーバ以外から来たメールはなりすましだと分かるわけです。

このようにメールの送信元を規定するためのDNSレコードをSPFレコードと言います。

DNSレコードの変更方法は使用しているネームサーバによって違う(大体はドメイン事業者のネームサーバだと思いますが、そのドメイン事業者によっても違うので)ため、必要なレコードだけを記載します。

各ホスト名のTXTレコードで内容は以下のように記載してください。

v=spf1 mx -all
  • v=spf1 : SPFレコードのバージョン1という意味です。バージョン2もありますがごく一部の用途を除いてはバージョン1で十分です。
  • mx : MXレコードに記載されているサーバ(つまり、そのメールアドレスでメールを受信できるサーバ)からのメールは問題ないですよという意味です。
  • -all : ここまでで言及されていない全てのサーバ(今回だとMXレコードに記載されているサーバ以外)は怪しいメールですよという意味になります。 - 記号が前に付いている場合はそのメールは怪しいという意味合いで、 all は文字通り全てのメールとなります。

5. 送信確認

先に送信先のメールサーバの設定を行ってからメールを送信します。

左下の歯車⇒右側の「アカウントの管理」の順にクリック
アカウント名をクリック
「メールボックの同期設定を変更」をクリック
「メールボックスの詳細設定」をクリック
送信メールサーバのポート番号を変更する
「メールの新規作成」をクリックして、まずは自分自身にメールを送信してみる

自分自身宛てに送ったメールは問題なく届くはずです。もし届かないようであれば設定を見直してみてください。

次に、他のメールアドレス宛てのメールを試してみてください。

今度は問題なく送信されるものの、いくら待っても送った相手にメールが届かないと思います。

これはOP25Bというインターネットプロバイダのフィルタリングのためになります。

まとめ

今回はメール送信が出来る所まで設定をしました。

とはいえ、ほとんどの方はこの設定だけでは外部にメールを送れず、使い物になりません。

次回はこのOP25Bとその対処方法について説明したいと思います。

コメントを残す

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