AWS EC2でサーバを構築 6 - PostfixとDovecot (SSL対応とSPAM対策)

## 記事一覧

- [AWS EC2でサーバを構築 1 \- Amazon Linux 2 準備編](https://qiita.com/ryu-blacknd/items/23b86d9ad768d58ff161)
- [AWS EC2でサーバを構築 2 \- 各種インストール編](https://qiita.com/ryu-blacknd/items/36ccfcf96da7b0c981cf)
- [AWS EC2でサーバを構築 3 \- Apache \+ Let's Ecnrypt \+ PHP\-FPM編 \(脆弱性診断「A\+」を狙う\)](https://qiita.com/ryu-blacknd/items/77eebe43a18a69e7c1e5)
- [AWS EC2でサーバを構築 4 \- Nginx \+ Let's Ecnrypt \+ PHP\-FPM編 \(脆弱性診断「A\+」を狙う\)](https://qiita.com/ryu-blacknd/items/4049f04e445eb1d60e4d)
- [AWS EC2でサーバを構築 5 \- MySQL \+ phpMyAdmin](https://qiita.com/ryu-blacknd/items/03030d11eeef65e3cf67)
- [AWS EC2でサーバを構築 6 \- **PostfixとDovecot \(SSL対応とSPAM対策\)**](https://qiita.com/ryu-blacknd/items/8e0c28065af3f9b8a06d)
- [AWS EC2でサーバを構築 7 \- セキュリティ対策](https://qiita.com/ryu-blacknd/items/20e5540195501e16e90e)

## 概要

PostfixとDovecotでメールサーバを構築します。SSL化とSMTP認証、SPAM対策を取り入れます。

## Postfix

メインドメインがexample1.comで、こちらでSSL証明書を取得します。

メールクライアントの送受信サーバ設定では、example2.comのメールアカウントであってもmail.example1.comを指定します。

SMTP認証にはDovecotを使います。SPAM対策のためRBLを参照するよう設定します。

**/etc/postfix/main.cf**

```ini
myhostname = mail.example1.com
mydomain = example1.com
myorigin = $mydomain

inet_interfaces = all
inet_protocols = ipv4

mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

home_mailbox = Maildir/

smtpd_banner = $myhostname ESMTP unknown

#
#
allow_mail_to_commands = alias,forward,include

# virtual_alias
#
virtual_alias_maps = hash:/etc/postfix/virtual
virtual_alias_domains = example2.com

# spam block - 2020.04.07
#
disable_vrfy_command = yes
smtpd_delay_reject = yes
smtpd_helo_required = yes

smtpd_helo_restrictions =
    permit_mynetworks,
    reject_non_fqdn_hostname,
    reject_invalid_hostname,
    permit

smtpd_error_sleep_time = 1s
smtpd_soft_error_limit = 5
smtpd_hard_error_limit = 10

smtpd_client_message_rate_limit = 6
smtpd_client_recipient_rate_limit = 6

# smtp-auth
#
smtpd_sasl_auth_enable = yes 
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_recipient_restrictions =
    permit_sasl_authenticated
    reject_invalid_hostname,
    reject_non_fqdn_hostname,
    reject_non_fqdn_sender,
    reject_non_fqdn_recipient,
    reject_unknown_sender_domain,
    reject_unknown_recipient_domain,
    permit_mynetworks,
    reject_rbl_client all.rbl.jp,
    reject_rbl_client bl.spamcop.net,
    reject_rbl_client zen.spamhaus.org,
    permit
broken_sasl_auth_clients = yes

# tls/ssl
#
smtpd_use_tls = yes
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example1.com/fullchain.pem
smtpd_tls_key_file  = /etc/letsencrypt/live/mail.example1.com/privkey.pem
smtp_tls_security_level = may
smtpd_tls_loglevel = 1
smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache
smtpd_tls_session_cache_timeout = 3600s
```

###  TLS有効化

SMTPSを使うための設定を行います。必要な部分をコメントインします。

**/etc/postfix/master.cf**

```bash
smtps     inet  n       -       n       -       -       smtpd
#  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_reject_unlisted_recipient=no
```

### SSL証明書取得

メールサーバmail.example1.com用にLet's Ecnryptの証明書を取得します。Nginxと同様の手順です。

80/tcpで待ち受ける必要があるため、Nginxの設定で443/tcpにリダイレクトする設定があればコメントアウトしておきます。

```bash
certbot certonly --webroot -w /var/www/html/www.example1.com/public_html/ -d mail.example1.com -m root@example1.com
```

### エイリアス設定

root宛のメールを別ユーザーへ転送します。

**/etc/alises**

```bash
root:           example1
```

上記設定を反映させるためには以下作業が必要です。

```bash
newaliases
```

### バーチャルドメイン設定

> メインドメインであるexample1.comはバーチャルドメインにできません。

**/etc/postfix/virtual** (作成)

```bash
example2.com            anything
info@example2.com       example2
```

上記ファイルを更新したら`postmap`が必要です。

```bash
postmap virtual
```


## Dovecot

使用プロトコルとポートを指定します。実際使うのはIMAPSとPOP3Sですが、ここでは`imap pop3`と書きます。

**/etc/dovecot/dovecot.conf**

```bash
#protocols = imap pop3 lmtp
protocols = imap pop3

#listen = *, ::
listen = *
```

###  認証関連

標準的なメーラーの初期設定、自動認識に対応させます。

**/etc/dovecot/conf.d/10-auth.conf**

```bash
#disable_plaintext_auth = yes
disable_plaintext_auth = no

# auth_mechanisms = plain
auth_mechanisms = plain login
```

### メールボックス

mbox形式からMaildir形式に変更します。

**/etc/dovecot/conf.d/10-mail.conf**

```bash
#mail_location = 
mail_location = maildir:~/Maildir
```
### プロトコルとポート

IMAPとPOP3は使わず、SSL経由のIMAPSとPOP3Sを使うよう設定します。

PostfixもSMTPSを使うので、これでメール関連はすべてSSL通信に対応できます。

**/etc/dovecot/conf.d/10-master.conf**

```bash
service imap-login {
  inet_listener imap {
    #port = 143
    port = 0
  }
  inet_listener imaps {
    #port = 993
    port = 993
    #ssl = yes
    ssl = yes
  }

service pop3-login {
  inet_listener pop3 {
    #port = 110
    port = 0
  }
  inet_listener pop3s {
    #port = 995
    port = 995
    #ssl = yes
    ssl = yes
  }

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

## SSL設定

Let's Ecnryptで取得したメールサーバ用の証明書を指定します。

**/etc/dovecot/conf.d/10-ssl.conf**

```bash
#ssl_cert = </etc/pki/dovecot/certs/dovecot.pem
#ssl_key = </etc/pki/dovecot/private/dovecot.pem
ssl_cert = </etc/letsencrypt/live/mail.example1.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.example1.com/privkey.pem
```

PostfixとDovecotを起動します。

```bash
systemctl start postfix dovecot
```