Azre + Ubuntu 環境での dovecot に SSL/TLS で POP3 アクセスする

「Azure で Dovecot をインストール、telnet でメールを読む」
https://qiita.com/nanbuwks/items/c3f180fc44fa08f91820
「Azure/Ubuntu にインストールした postfix / dovecot を Maildir 対応にする」
https://qiita.com/nanbuwks/items/10e6dd1224ce0c3f76af

では dovecot を pop3 サーバとして動かしましたが、セキュリティ設定は行わずにプレーンテキストでのパスワード認証でテストを行いました。

今回は、通信路を暗号化し、SSL/TLS で接続の保護を行います。

実は、デフォルトで dovecot は SSL/TLS での pop3 通信を受け入れています。なので今回は Azure のポートフィルターを設定して SSL/TLS 通信を通すようにし、クライアントPC で telnet の代わりに openssl コマンドでメールを取得してみます。



# 環境

- クラウドサーバ Ubuntu 22.04 LTS
「Azure で最初のクラウドサーバを無料枠で作成する」
https://qiita.com/nanbuwks/items/120858191caf3b0a3f1c
で作成したものです
- MTA として Postfix 
- クライアントPC Ubuntu 22.04 LTS
openssl さえ使えれば良いので、WindowsやMacでも同様に操作できるハズ。


# ACL を操作して TCP 995番ポートでの受信が行えるようにする

Azure 画面より、受信ポートに995を加えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/3f3ace63-5f7d-8fbb-b3cc-84adeb9be651.png)


# 待受の確認

サーバ上ではすでにTCP 995番ポートが待受になっています。
```
azureuser@test-azure-gen:~$ ss -atn
State  Recv-Q  Send-Q   Local Address:Port      Peer Address:Port  Process 
LISTEN 0       100            0.0.0.0:587            0.0.0.0:*             
LISTEN 0       100            0.0.0.0:110            0.0.0.0:*             
LISTEN 0       4096     127.0.0.53%lo:53             0.0.0.0:*             
LISTEN 0       128            0.0.0.0:22             0.0.0.0:*             
LISTEN 0       100            0.0.0.0:25             0.0.0.0:*             
LISTEN 0       100            0.0.0.0:995            0.0.0.0:*             
ESTAB  0       52            10.0.0.4:22     182.170.165.119:48722         
LISTEN 0       100               [::]:587               [::]:*             
LISTEN 0       100               [::]:110               [::]:*             
LISTEN 0       511                  *:80                   *:*             
LISTEN 0       128               [::]:22                [::]:*             
LISTEN 0       100               [::]:25                [::]:*             
LISTEN 0       100               [::]:995               [::]:*             
```




# 動作確認

:::note info

以下、example.com でアクセスするために、
「Azure/Ubuntu/Apache2 で PHP と VirtulaHost を設定する」
https://qiita.com/nanbuwks/items/d3a1a148e597f5c5df1c
で行った、 /etc/hosts の編集した設定をそのまま活かしています。

:::

あらかじめ、ユーザ example にメールを送っておきます。

```
azureuser@test-azure-gen:~$ echo "Hello POP3S" | sendmail example
```

クライアント PC から、以下のように接続すると、ずらーっといろいろ表示がなされて

```
$ openssl s_client -connect example.com:995
CONNECTED(00000003)
depth=0 CN = test-azure-gen
verify error:num=18:self-signed certificate
verify return:1
depth=0 CN = test-azure-gen
verify return:1
---
Certificate chain
 0 s:CN = test-azure-gen
   i:CN = test-azure-gen
   a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA256
   v:NotBefore: Apr  7 14:36:25 2023 GMT; NotAfter: Apr  4 14:36:25 2033 GMT
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIDPTCCAiWgAwIBAgIURuHwo2cQr+PIPjkA6kGDjXc48oswDQYJKoZIhvcNAQEL
BQAwGTEXMBUGA1UEAwwOdGVzdC1henVyZS1nZW4wHhcNMjMwNDA3MTQzNjI1WhcN
MzMwNDA0MTQzNjI1WjAZMRcwFQYDVQQDDA50ZXN0LWF6dXJlLWdlbjCCASIwDQYJ
KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMvB879LGR3wLB9RM0oXIehiTDnTgzi9
.
.
.
    Start Time: 1681035852
    Timeout   : 7200 (sec)
    Verify return code: 18 (self-signed certificate)
    Extended master secret: no
    Max Early Data: 0
---
read R BLOCK
+OK Dovecot (Ubuntu) ready.
```
接続できました。

telnet と同じように、ユーザ名とパスワードを入力します。
```
USER example
+OK
PASS hogehogefugafuga
+OK Logged in.
```

ログインできました。
ここで、パスワード `hogehogefugafuga` はプレーンテキストとして見えています。
しかしながら通信路を通っている間の通信内容は暗号化されているので、中間者攻撃を受けてもパスワードは傍聴者に漏洩しません。

では、メールを読んでみましょう。
```
LIST
+OK 1 messages:
1 432
.
RETR 1
RENEGOTIATING
403797B5FD7E0000:error:0A00010A:SSL routines:can_renegotiate:wrong ssl version:../ssl/ssl_lib.c:2289:
nanbuwks@nanbuwks-B550M-S2H:~/Downloads/OMCUSS$ openssl s_client -connect -quiet example.com:995 
s_client: cannot provide both -connect option and target parameter
s_client: Use -help for summary.
```
ありゃ。エラーが出ました。

「[Postfix] [OpenSSL] [解決] RENEGOTIATING SSL routines:SSL_renegotiate:wrong ssl version:ssl/ssl_lib.c」
https://noknow.info/it/postfix/solved_ssl_routines_renegotiate

によると、文頭に R のある文字列を送信すると、TLS のコマンドとして解釈されてしまうことのようです。
`-quiet` オプションをつけると良いということで、以下のようにしてみます。

```
$ openssl s_client -connect  example.com:995 -quiet
depth=0 CN = test-azure-gen
verify error:num=18:self-signed certificate
verify return:1
depth=0 CN = test-azure-gen
verify return:1
+OK Dovecot (Ubuntu) ready.
USER example
+OK
PASS hogehoge fugafuga
-ERR [AUTH] Authentication failed.
USER example
+OK
PASS hogehogefugafuga
+OK Logged in.
LIST
+OK 1 messages:
1 432
.
RETR 1
+OK 432 octets
Return-Path: <azureuser@test-azure-gen.localdomain>
X-Original-To: example
Delivered-To: example@test-azure-gen.localdomain
Received: by test-azure-gen.localdomain (Postfix, from userid 1000)
	id 0BCD63FDBE; Sun,  9 Apr 2023 10:23:33 +0000 (UTC)
Message-Id: <20230409102333.0BCD63FDBE@test-azure-gen.localdomain>
Date: Sun,  9 Apr 2023 10:23:33 +0000 (UTC)
From: Ubuntu <azureuser@test-azure-gen.localdomain>

Hello POP3S
.
QUIT
+OK Logging out.
```

うまくいきました。