セキュアなメールサーバーを構築して送受信できるようになるまで（後編）

前編としてUbuntu×Postfix×Dovecotを用いて送受信可能なメールサーバの構築を行い、
後編としてLet's Encryptを用いて証明書を取得しセキュアなメールサーバにするまでが目標です。

今回は「後編：Let's Encryptを用いて証明書を取得しセキュアなメールサーバにする」
→前編は[こちら](https://qiita.com/SI-K_Maeda/items/f814add3208cc5327373)

## SSLを設定してセキュアなメールサーバにする

Let's Encryptを用いてサーバ証明書を発行し、SSL/TLSに対応することで送受信を暗号化する

### 正引き確認

hostコマンドでDNS設定を確認

```bash
# 正引き確認
host mail.(ドメイン)
```

IPアドレスが返ってくるかを確認

### ファイアフォールの接続許可を追加

HTTP用の80番ポートとHTTPS用の443番ポートを追加

```bash
# ポートの追加
sudo ufw allow 80
sudo ufw allow 443
# 設定のリロード
sudo ufw reload
# ステータス確認
sudo ufw status

Status: active
To                         Action      From
--                         ------      ----
80                         ALLOW       Anywhere
443                        ALLOW       Anywhere
80 (v6)                    ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)
```

80番と443番ポートが追加されていることを確認

### Let's Encryptでサーバ証明書を取得する

- certbotのインストール

```bash
# certbotインストール
sudo apt install certbot

# インストールされているか確認
apt list --installed | grep certbot 
```

- 証明書の作成

```bash
# 証明書作成前にApatchを停止
sudo service apache2 stop

# 証明書作成
sudo certbot certonly --standalone -d mail.mail.(ドメイン名)

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator standalone, Installer None
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): (任意のメールアドレスを入力)

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel: A # 利用規約の承諾

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: N # メーリングリストの登録可否
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for mail.kaitobono.work
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/mail.(ドメイン名)/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/mail.(ドメイン名)/privkey.pem
   Your cert will expire on 2022-03-19. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

# 証明書作成後Apatchを起動
sudo service apache2 start
```

- 証明書更新のため定期実行設定

```bash
# cron設定編集
crontab -e

# 以下のcron設定を追記
00 3 * * * certbot renew -q --deploy-hook "systemctl restart postfix dovecot"
00 5 * * * certbot renew -q --deploy-hook "systemctl restart postfix dovecot"

# cron設定の確認
crontab -l
```

### PostfixのSSL/TLS設定

- main.cfの編集

```bash
# main.cfのバックアップ作成
sudo cp -p /etc/postfix/main.cf /etc/postfix/main.cf.org1

# main.cfをviで開く
sudo vi /etc/postfix/main.cf

# 最後尾に以下を追加
### SSL/TLS Settings
smtp_tls_security_level = may
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.(ドメイン名)/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.(ドメイン名)/privkey.pem
smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache
smtpd_tls_session_cache_timeout = 3600s
smtpd_tls_received_header = yes
smtpd_tls_loglevel = 1
```

- master.cfの編集

```bash
# master.cfのバックアップ作成
sudo cp -p /etc/postfix/master.cf /etc/postfix/master.cf.org2

# master.cfをviで開く
sudo vi /etc/postfix/master.cf

# コメントを外して変更
smtps     inet  n       -       n       -       -       smtpd
# コメントを外す
-o smtpd_tls_wrappermode=yes
# コメントを外す
-o smtpd_sasl_auth_enable=yes
# コメントを外して変更
-o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
```

- 変更内容の確認・チェック

```bash
# 設定の確認
postconf -n
# 設定のチェック
sudo postfix check
```

- 設定内容の反映

```bash
# Postfixの再起動
sudo systemctl restart postfix
# ステータス確認
systemctl status postfix
```

- 465番ポートの状態確認

```bash
# ポートの確認
netstat -nat

ctive Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:465             0.0.0.0:*               LISTEN
```

## DovecotのSSL/TLS設定

- 10-ssl.confの編集

```bash
# 10-ssl.confのバックアップ作成
sudo cp -p /etc/dovecot/conf.d/10-ssl.conf /etc/dovecot/conf.d/10-ssl.conf.org2

# viで10-ssl.confを開く
sudo vi /etc/dovecot/conf.d/10-ssl.conf

# 変更
ssl = required
# コメント外して変更
ssl_cert = </etc/letsencrypt/live/mail.(ドメイン名)/fullchain.pem
# コメント外して変更
ssl_key = </etc/letsencrypt/live/mail.(ドメイン名)/privkey.pem
```

- 10-master.confの編集

```bash
# 10-master.confのバックアップ作成
sudo cp -p /etc/dovecot/conf.d/10-master.conf /etc/dovecot/conf.d/10-master.conf.org2

# viで10-master.confを開く
sudo vi /etc/dovecot/conf.d/10-master.conf

# 編集
service imap-login {
  inet_listener imap {
    port = 0 # コメント外して変更
  }
  inet_listener imaps {
    port = 993 # コメント外す
    ssl = yes # コメント外す
  }
# 編集
service pop3-login {
  inet_listener pop3 {
    port = 0 # コメント外して変更
  }
  inet_listener pop3s {
    port = 995 # コメント外す
    ssl = yes # コメント外す
  }
}
```

- 変更内容の確認

```bash
# 設定の確認
doveconf -n
```

- 設定内容の反映

```bash
# Dovecotの再起動
sudo systemctl restart dovecot
# ステータス確認
systemctl status dovecot
```

- 465番ポートの状態確認

```bash
# ポートの確認
netstat -nat

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:993             0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:995             0.0.0.0:*               LISTEN
```

### クライアントアプリを使ってテスト

- POP3S × SMTPSでテスト
    - thunderbirdにメールアカウントを設定
    
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670588/c26f6eed-6d1c-8f6e-c214-8772a18b48bd.png)

    
    - クライアントでテスト送信
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670588/bf43e3e0-9023-084c-1bbc-7ffdf8551b98.png)

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670588/9f2e118c-0984-cbaa-a3a0-fa8e107c8948.png)


    
    - SMTP-AUTHを使ってメールを外部にリレー配送
    
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670588/1f6822e5-d79a-250f-9945-abb465ef28ab.png)

    
- IMAPS × SMTPSでテスト
    
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670588/ba41b0bd-dde2-3561-5949-636912347782.png)

    
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670588/42756a32-4d09-2f6e-e40f-9d5cb2b7d017.png)

    
    IMAPSの場合でも正常に接続できていることを確認
    

以上でセキュアなメールサーバ構築が完了しました。

Gmail等に送信した場合迷惑メール判定をされてしまうなど課題点は残りますが、

暗号化することでセキュアなメールサーバの構築までを行うことができました。