CentOS7 Postfix + SMTP-Auth/Submission Port

大昔に書いた[Postfixの設定](https://qiita.com/yoshidna/items/d797f615ed523b8231be)のUpdate。CentOS7でメール送りたいが、さすがに認証はさせておこうという事でpostfix + SMTP-AUTHを使う。認証に使うアカパスはCentOSのOSユーザを利用する。

## 必要パッケージのインストール

いつものやつ

```bash
yum install -y postfix cyrus-sasl cyrus-sasl-plain
```

## postfix設定

/etc/postfix/main.cf

```bash
# myhostnameにホスト名を指定
myhostname = mail.hogehoge.com  

# mydomainにドメイン名を指定
mydomain = hogehoge.com

# myoriginのコメント削除
myorigin = $mydomain

# inet_protocolをipv4に限定
inet_protocols = ipv4

# mydestination設定変更
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

# mynetworksを自環境に合わせ変更
mynetworks = 127.0.0.0/8,192.168.0.0/24,10.0.0.0/8

# relay_domainsのコメント削除
relay_domains = $mydestination

# header_checksのコメント削除
header_checks = regexp:/etc/postfix/header_checks

# smtpd_banne設定
smtpd_banner = $myhostname ESMTP

# 最下行に以下追記
# メッセージサイズ
message_size_limit = 5242880

# VRFYコマンド無効化
disable_vrfy_command = yes

# HELOコマンドを要求する(スパム対策)
smtpd_helo_required = yes

# MAIL FROMやRCPT TOコマンドに不正な文法を認めない
strict_rfc821_envelopes = yes

# user%domain" の形から "user@domain" への書換えを有効化
allow_percent_hack = yes

# site!user" から "user@site" への書換えを有効化
swap_bangpath = yes

# 信頼していないクライアントから $relay_domains にマッチする配送先へ、 送信者が指定したルーティングを持つメールであっても転送しない
allow_untrusted_routing = no

# 信頼しているネットワークからの接続のみ許可
smtpd_client_restrictions =
   permit_mynetworks,
   reject_unknown_client,
   permit

# SMTP DATA コマンドの場面で適用するオプションの制限
smtpd_data_restrictions =
   reject_unauth_pipelining,
   reject_multi_recipient_bounce

# SMTP HELO コマンドの場面で適用するオプションの制限
smtpd_helo_restrictions =
   permit_mynetworks,
   reject_invalid_hostname,
   reject_non_fqdn_hostname,
   reject_unknown_hostname,
   permit

# MAIL FROM コマンドの場面で適用するオプションの制限
smtpd_sender_restrictions =
   permit_mynetworks,
   reject_unknown_sender_domain,
   reject_non_fqdn_sender,
   permit

# ETRN 要求の場面で適用するオプションの制限
smtpd_etrn_restrictions =
   permit_mynetworks,
   reject_invalid_hostname,
   permit

# SMTP-Auth
# SASL認証有効化
smtpd_sasl_auth_enable = yes
# mynetworks以外で匿名での接続を拒否
smtpd_sasl_security_options = noanonymous
# 規格外の動作に対応
broken_sasl_auth_clients = yes
# RCPT TO コマンドの場面で適用するアクセス制限。SMTP_Authを利用したクラアントを許可
smtpd_recipient_restrictions = permit_mynetworks,
    permit_sasl_authenticated,
    reject_unauth_destination
```

## サブミッションポート（TCP/587）の有効化

サブミッションポートを有効化し、利用の際にはSMTP-Auth必須とする

/etc/postfix/master.cf

修正前

```bash
# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# ==========================================================================
smtp      inet  n       -       n       -       -       smtpd
#smtp      inet  n       -       n       -       1       postscreen
#smtpd     pass  -       -       n       -       -       smtpd
#dnsblog   unix  -       -       n       -       0       dnsblog
#tlsproxy  unix  -       -       n       -       0       tlsproxy
# submission inet n       -       n       -       -       smtpd
#  -o syslog_name=postfix/submission
#  -o smtpd_tls_security_level=encrypt
#  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_reject_unlisted_recipient=no
#  -o smtpd_client_restrictions=$mua_client_restrictions
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
#  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING
```

修正後

```bash
# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# ==========================================================================
smtp      inet  n       -       n       -       -       smtpd
#smtp      inet  n       -       n       -       1       postscreen
#smtpd     pass  -       -       n       -       -       smtpd
#dnsblog   unix  -       -       n       -       0       dnsblog
#tlsproxy  unix  -       -       n       -       0       tlsproxy
submission inet n       -       n       -       -       smtpd
#  -o syslog_name=postfix/submission
#  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_reject_unlisted_recipient=no
#  -o smtpd_client_restrictions=$mua_client_restrictions
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING
```

＊SASL認証使わずにサブミッションポートだけ有効にしたい場合は`-o smtpd_recipient_restrictions=permit_sasl_authenticated,reject`の部分はコメントアウトのままにする

## postfix 起動と自動起動設定

```bash
systemctl enable postfix
systemctl start postfix
```

Port587が起動していることを確認

```bash
ss -natup |grep master
tcp    LISTEN     0      100       *:25                    *:*                   users:(("master",pid=12822,fd=13))
tcp    LISTEN     0      100       *:587                   *:*                   users:(("master",pid=12822,fd=17))
```

## SASL設定変更

OSユーザのアカウント情報を利用するように設定

/etc/sysconfig/saslauthd
`MECH=pam`をコメントアウトして、`MECH=shadow`を追記

```bash
# Directory in which to place saslauthd's listening socket, pid file, and so
# on.  This directory must already exist.
SOCKETDIR=/run/saslauthd

# Mechanism to use when checking passwords.  Run "saslauthd -v" to get a list
# of which mechanism your installation was compiled with the ablity to use.
#MECH=pam
MECH=shadow

# Additional flags to pass to saslauthd on the command line.  See saslauthd(8)
# for the list of accepted flags.
FLAGS=
```
## SASL 起動と自動起動設定

```bash
systemctl enable saslauthd
systemctl start saslauthd
```

## ユーザを追加と動作確認

OSログインはさせないようにユーザ追加

```bash
useradd -s /sbin/nologin hogehoge
passwd hogehoge
```

作ったユーザでテスト実施。OKがでればOK

```bash
testsaslauthd -u hogehoge -p yourpassword
0: OK "Success."
```

postfixでSMTP-Authが正常起動しているか確認
EHLOを入力した後、`250 DSN`まで一気に流れるので、`AUTH LOGIN`を入力。エラーが出なければOK

```bash
telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mail.hogehoge.com ESMTP
EHLO hogehoge.com
250-mail.hogehoge.com
250-PIPELINING
250-SIZE 10240000
250-ETRN
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
AUTH LOGIN
334 VXNlcm5hbWU6
```


## 参考サイト

[CentOS7 PostfixのSMTP認証](https://www.unix-power.net/networking/post-698)
[Postfix 設定パラメータ](http://www.postfix-jp.info/trans-2.1/jhtml/postconf.5.html)
[Postfixのセキュリティ設定について](https://qiita.com/rocinante-ein/items/9c31cb0e36fb2d01d343)