ここでは、Postfix環境のメールサーバーにおいて送信時のSTARTTLSを有効にする手順について解説します。また、メール送信は認証されたユーザーのみ行うようにするため、SASL AUTH認証の設定を合わせて行います。認証処理はDovecot側で行うようにします。

自己証明書の作成

STARTTLSに対応する前に、サーバーで使用する証明書を作成していきます。
まずは秘密鍵とCSRを作成します。

Bash
openssl req -new -newkey rsa:2048 -nodes -keyout postfix.key -out postfix.csr -subj "/C=JP/ST=Tokyo/L=Tokyo/O=MyOrg/CN=mail.domain.internal"

CSRが作成できたら、次に証明書を作成します。

Bash
openssl x509 -req -days 365 -in postfix.csr -signkey postfix.key -out postfix.crt

証明書を発行したら、秘密鍵と証明書を/etc/pki/tls以下の所定の場所に配置します。

Bash
cp postfix.key /etc/pki/tls/private
cp postfix.crt /etc/pki/tls/certs

main.cfの設定

続いて、/etc/postfix/main.cfに対して以下のように設定を追加します。

Bash
# SMTPサーバが使用するサーバー証明書を指定する
smtpd_tls_cert_file = /etc/pki/tls/certs/postfix.crt

# サーバー証明書に対する秘密鍵
smtpd_tls_key_file = /etc/pki/tls/private/postfix.key

# SMTP接続時のTLS必須レベル
# none:TLS無効/ may:TLS可能なら使用 / encrypt:TLS必須
smtpd_tls_security_level = encrypt

# SMTP AUTHを有効化してクライアントがAUTH PLAIN とAUTH LOGINを使用できるようにする
smtpd_sasl_auth_enable = yes

# 認証バックエンドをdovecotに指定し、dovecotのauthプロセスに問い合わせてユーザー認証を行う。
smtpd_sasl_type = dovecot

# Dovecotの認証ソケットを指定。/var/spool/postfix/private/auth
smtpd_sasl_path = private/auth

# 許可する認証方式を匿名禁止にし、ユーザー名とパスワードを要求する。
smtpd_sasl_security_options = noanonymous

# 認証ドメインのデフォルト値。userとして認証するとuser@$myhostnameとして認証。
smtpd_sasl_local_domain = $myhostname

# メールを送れる対象の指定。先頭から順に評価される。
smtpd_recipient_restrictions = permit_sasl_authenticated, reject

/etc/postfix/master.cfを編集し、submissionポートの設定箇所のコメントアウトを外します。

Bash
submission inet n       -       n       -       -       smtpd
#  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_tls_auth_only=yes

smtpd_sasl_auth_enableでSASL AUTHを有効にし、smtpd_tls_auth_onlyの設定ではクライアントがメール送信する際に必ず認証を行うようにしています。

もし社内ネットワークで認証できないサービスがある場合は、mynetworkに対象の機器のIPアドレスを指定して以下のように設定を行う。

Bash
smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, reject

dovecotの設定

Postfix側でSASL AUTH認証処理をDovecotで行うように設定したので、併せてDovecot側でも設定を行います。/etc/dovecot/conf.d/10-master.confを編集し、serviece authの項目を以下のように設定します。

Bash
service auth {
(抜粋)
  # Postfix smtp-auth
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
  }
}

サービスの起動

設定項目が正しいかどうか確認し、問題なければサービスを再起動します。

Bash
postfix check
systemctl restart postfix
systemctl restart dovecot

ファイアウォール設定

Bash
firewall-cmd --add-port=587/tcp --permanent
firewall-cmd --reload

送信サーバーの設定

メールクライアントで、送信サーバーの設定を行い、接続の保護やユーザー名を指定してOKを選択する。

信頼済みの証明書ではないのでエラーが出ますが、今回は例外として処理しました。

以上でSTARTTLSとSASL AUTHの設定は完了です。

ご覧いただきありがとうございました。