自宅サーバー構築譚：LXDコンテナにDovecotをインストール / IMAP

# 能書き

[自宅サーバー構築譚：基本構想](https://qiita.com/katz_engineer/items/cb592be44daa28a51d9b)に基づく自宅サーバー構築、[Ubuntu22.04LTSインストールその2](https://qiita.com/katz_engineer/items/033471b69143bf76650e)の続きです。

[前回はDovecotをインストールしてLMTPを設定した](https://qiita.com/katz_engineer/items/9e8716c8bdf2bb1a54a8)訳ですが。今回はIMAPSを使えるようにします。

# 目標

[前回掲載したメールサーバー構築予定](https://qiita.com/katz_engineer/items/9e8716c8bdf2bb1a54a8#%E7%9B%AE%E6%A8%99)を再掲します。

1. DovecotのLMTP
2. **DovecotのIMAP ←イマココ**
3. Postfix

POP3は使いません。どうせ私専用のメールサーバーですので、私自身が使わない以上、選択肢として用意しておく必要もありません。

そして IMAP over SSL/TLS、通称 IMAPS にします。ただのIMAPは使えないように潰しておきます。

セキュリティを考慮して、デフォルトの証明書とは異なる物を使用します。

なお、以下の操作は[前回のLMTP設定](https://qiita.com/katz_engineer/items/9e8716c8bdf2bb1a54a8)の続きとします。

# 参考文献

- [Mail サーバー : Dovecot インストール - Server World](https://www.server-world.info/query?os=Ubuntu_22.04&p=mail&f=2)
- [Ubuntu 22.04 でメールサーバーを作ったのでメモ - tmtms のメモ](https://blog.tmtms.net/entry/202205-ubuntu-mail)
- [dovecotでのサーバ証明書のインストール方法 - SSL・EV SSL サーバー証明書 サポート - SSLSERVER](https://rms.ne.jp/sslserver/install/install_dovecot-html/)
- [SSLの各種証明書について（csr, pem, der, cerなど） - Qiita](https://qiita.com/ling350181/items/2ac60698779088b14dea)
- [自宅サーバー構築譚：オレオレ認証局 - Qiita](https://qiita.com/katz_engineer/items/ada7b08e7c0254e39126)
- [telnetを使ってメールサーバーと通信する (SMTP/POP/IMAP) - Qiita](https://qiita.com/suzutsuki0220/items/64e519e124e6fef323f9)
- [SSLのHTTPリクエストをtelnetのように解析したい。 - littlewing](https://littlewing.hatenablog.com/entry/2016/09/23/191020)

# コンテナの準備

## スナップショット

コンテナdovecot1（IPアドレス192.168.0.4）について、まずは現時点でのスナップショットを撮ります。

```console:ホスト側
CONTAINER=dovecot1
IPADDRESS=192.168.0.4
```

スナップショット名は`before_Dovecot_IMAP`とします。

```console:ホスト側
SSNAME=before_Dovecot_IMAP
```

コンテナを停止してスナップショットを撮ります。稼働中でも撮れるようですが、変に面倒臭い何かが起こってもイヤなので。

```console:ホスト側
lxc stop $CONTAINER
lxc snapshot $CONTAINER $SSNAME
```

スナップショットの一覧表示には`lxc info`コマンドを利用するようです。余計な情報も纏めて表示されてしまうのですが、どうしようもないようですな。何とかなりませんかねぇ。

```console:ホスト側
lxc info $CONTAINER
```

スナップショットに巻き戻す時には、下記コマンドを実行します。

```console:ホスト側
lxc restore $CONTAINER $SSNAME
```

スナップショットの操作が終わったら、起動させましょう。

```console:ホスト側
lxc start $CONTAINER
```

## Ubuntuユーザーのパスワード

今回はIMAPの動作確認をする際に、ユーザーのパスワードが必要になります。

IMAPではLinuxユーザーとは異なるパスワードを設定させるのがセキュリティ的に正しい気もしますけど。そんな事しても、実運用時に面倒臭くて、結局同一のパスワードになるのが落ちです。

と言う訳で、使うのは私だけという点も考慮して、IMAPでもLinuxユーザーを流用する事にします。

そして[前回のLMTP設定](https://qiita.com/katz_engineer/items/9e8716c8bdf2bb1a54a8)時と同様、LXDコンテナのデフォルトユーザーである`ubuntu`を動作確認に利用する事にします。

`ubuntu`ユーザーにパスワード`password`を設定するコマンドは下記になります。

```console:ホスト側
lxc exec $CONTAINER passwd ubuntu <<___
password
password
___
```

パスワードを設定すると`/etc/shadow`が変化します。Subversionで登録しましょう。

```console:ホスト側
lxc exec $CONTAINER -- svn ci /etc -m"set the user 'ubuntu' password"
```

# Dovecot IMAP のインストールと設定

## インストールと初期設定の確認

コンテナに入ります。

ところで。コンテナ内に入る時には、シェル`/bin/bash`を実行ではなくて、`lxc shell`というコマンドがあるようですな。

```console:ホスト側
lxc shell $CONTAINER
```

`dovecot-imapd`をインストール。`-y`オプションは不要でした。

```console:コンテナ内
apt install dovecot-imapd
```

インストールが終わったら、`/etc`の変化を確認します。今回は何も変化していない模様です。

```console:コンテナ内
svn di /etc
```

コンテナから抜けます。

```console:コンテナ内
exit
```

## LXDネットワークの設定

ネットワークのポートフォワードを設定します。imapsは993番ポートらしい。ただのimap（143番）は、今回は開きません。

なお172.16.1.3は私のホストマシンのIPアドレスです。

```console:ホスト側
IMAPS_PORT=993
```

```console:ホスト側
lxc network forward port add lxdbr0 172.16.1.3 tcp $IMAPS_PORT $IPADDRESS $IMAPS_PORT
```

## ちょっと動作確認

`dovecot-imap`はデフォルトでサーバーのオレオレ証明書を仕込んでくれるようです。この、インストール直後の段階でも、IMAPSプロトコルで会話する事が出来ます。

IMAPSでの会話には`openssl s_client`コマンドを使用します。

```console:ホスト側
openssl s_client -connect 172.16.1.3:$IMAPS_PORT
```

opensslプロンプト内で実行するコマンドは下記の通り。行頭の番号から入力します。

```console:openssl
1 login ubuntu password
2 list "" *
3 select INBOX
4 fetch 1 body[]
5 logout
```

実行結果は下記になります。証明書の内容が表示されてしまうので少々長くなりますが。丁寧に読むと、CommonName(CN)としてコンテナ名を設定しているオレオレ証明書が自動的に仕込まれているようです。
そして`4 fetch 1 body[]`で、[前回のLMTP](https://qiita.com/katz_engineer/items/9e8716c8bdf2bb1a54a8)でテスト送信したメールが表示されます。

```console:ホスト側
$ openssl s_client -connect 172.16.1.3:$IMAPS_PORT
CONNECTED(00000003)
Can't use SSL_get_servername
depth=0 CN = dovecot1
verify error:num=18:self-signed certificate
verify return:1
depth=0 CN = dovecot1
verify return:1
---
Certificate chain
 0 s:CN = dovecot1
   i:CN = dovecot1
   a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA256
   v:NotBefore: Apr 29 06:30:44 2023 GMT; NotAfter: Apr 26 06:30:44 2033 GMT
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIC9TCCAd2gAwIBAgIUVQ5EDsKo56lCwr24VHDeTHeW8j8wDQYJKoZIhvcNAQEL
BQAwEzERMA8GA1UEAwwIZG92ZWNvdDEwHhcNMjMwNDI5MDYzMDQ0WhcNMzMwNDI2
MDYzMDQ0WjATMREwDwYDVQQDDAhkb3ZlY290MTCCASIwDQYJKoZIhvcNAQEBBQAD
ggEPADCCAQoCggEBANMJYCHlJiKZwXw1T050RodpXmjVfLFjZJLuc75qH9BkHfEz
HGRZY+z758QMQjTTKHxFPctvSQssAznRb8E8bpmiKGGUIPuIzOLpGHTw1+f0nROm
J3s8BEm9grJ7hCElNxEtI/jlQr6dP1+C7tdjFjejS9ouchznYco8z2Gvhj8OPtZS
sEM08Zf2wiawJlXk+9EYFF0FfZ3Xscks7a8a+7TgRdUK5ItrGgrJB64FdciZryps
/yVcN/Ibjg1zkRk599KhU9Zp/zrrDC4u/6W1ywHsEXzpLDBIDlVps3hdqxzwWVQ8
CO4XpFxw+Q69jCzGyWN/PIhIcTYNqkvk5RDDZmcCAwEAAaNBMD8wCQYDVR0TBAIw
ADATBgNVHREEDDAKgghkb3ZlY290MTAdBgNVHQ4EFgQUv8GYFHo2ismK97KEu1At
04iX8oEwDQYJKoZIhvcNAQELBQADggEBAGu7ORSd6yprVa7ebMxLpTtqj0LEjyZi
4HylbetUye2819cracmoV1WRw16ALhOD9eXvGf1Fkp19M3VayM2Wzpx+J17KRquF
hSQ5dBKn4SRg5BaaXe+dZVX82S1mSxay39NFlIA1WnmJlSjCwtS1VaSKF1MSDVup
jUdF0GMB6/32DdJXYt9ja7CgdH5kpeESpwEjeWrfZV4tBBz2aEt9ozJhWsOxxw7i
hQ5CL4eHtKKAt8s57cz+9CvLo7T0lR+PWd42Wd4SmKA6xhbL8uIyxzUF0D0xJiRz
l4avrjvRH4jaUreBIcAyuHgrJk2HV1ZwfiCnJTmiQQ2wXlS5xgDLJFg=
-----END CERTIFICATE-----
subject=CN = dovecot1
issuer=CN = dovecot1
---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 1317 bytes and written 373 bytes
Verification error: self-signed certificate
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 2048 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 18 (self-signed certificate)
---
---
Post-Handshake New Session Ticket arrived:
SSL-Session:
    Protocol  : TLSv1.3
    Cipher    : TLS_AES_256_GCM_SHA384
    Session-ID: C791D67F83B334E94A147F9ADB03DB232F1B676D361A23BF2341F6FBDE4CD51E
    Session-ID-ctx:
    Resumption PSK: B32991AE77C19CCD32B2B0E5B4B67212275BBCD18B1774C350F18E6FEF951B49650432206D554A52EDB6391A929E25DD
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 7200 (seconds)
    TLS session ticket:
    0000 - 3c 0d 71 0e ef 73 24 13-48 0d fc 94 96 f6 46 67   <.q..s$.H.....Fg
    0010 - 2b c1 fa cc 8d a0 df d3-7a 21 97 e1 65 00 a1 1f   +.......z!..e...
    0020 - ac 1b 32 4e 49 33 8f 19-9a 39 af 3b f3 bd 5a 7c   ..2NI3...9.;..Z|
    0030 - e1 db a0 4a a5 09 1f 2d-eb ed bb f5 dc d2 e9 f0   ...J...-........
    0040 - 73 7d 8e ab 94 2e 67 88-07 fa 11 71 17 ca 1e 12   s}....g....q....
    0050 - 56 da ba 64 09 a5 d6 35-4c 34 df 8e b9 0d c0 6a   V..d...5L4.....j
    0060 - 9b a7 a0 5d d1 cf 02 0f-d1 fe 1c 47 eb c8 ac 7f   ...].......G....
    0070 - eb bc d4 b2 9b 1a 2e 28-d9 90 74 da aa 93 87 f9   .......(..t.....
    0080 - 2f 5a e4 5a 3d e6 b2 26-87 22 b0 40 a7 32 3b 7d   /Z.Z=..&.".@.2;}
    0090 - 57 1c d4 c8 13 1a 12 fa-c5 aa 28 dc ae 7c 4d 55   W.........(..|MU
    00a0 - 85 f5 9a d5 bf 64 8d a8-67 b7 90 22 67 ed 3e 4e   .....d..g.."g.>N
    00b0 - 85 71 48 0b 22 0d 27 fc-76 3f 52 1c 43 79 2a d1   .qH.".'.v?R.Cy*.
    00c0 - ff 59 9a 00 10 01 04 f2-d8 d8 19 7d bf 91 81 66   .Y.........}...f

    Start Time: 1683422805
    Timeout   : 7200 (sec)
    Verify return code: 18 (self-signed certificate)
    Extended master secret: no
    Max Early Data: 0
---
read R BLOCK
---
Post-Handshake New Session Ticket arrived:
SSL-Session:
    Protocol  : TLSv1.3
    Cipher    : TLS_AES_256_GCM_SHA384
    Session-ID: C47BE4FF7B107B6C9F195121428E477E8BF0A186004E493291CBA346EA981E82
    Session-ID-ctx:
    Resumption PSK: D10F5D48E89A8A438A844B24561694F387C3421A0388F6215B7B1EAC47971A574659873BEA732C8FD311DFB10915662B
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 7200 (seconds)
    TLS session ticket:
    0000 - 3c 0d 71 0e ef 73 24 13-48 0d fc 94 96 f6 46 67   <.q..s$.H.....Fg
    0010 - ba a1 4c e1 eb ef 1d d5-30 83 d2 a7 4d e9 cb 1f   ..L.....0...M...
    0020 - a1 a6 0e c1 91 85 1f 3c-bb 7a 6a 8f 2f be e9 c3   .......<.zj./...
    0030 - 13 6c 96 db ea 5b ab 1e-4a 06 d8 c5 20 7b 15 e7   .l...[..J... {..
    0040 - 64 72 3a 8d 31 e9 77 34-7e f8 46 bc e2 92 37 c5   dr:.1.w4~.F...7.
    0050 - c6 9a d0 54 0a 8b fc 4f-39 87 e5 60 99 93 5f c7   ...T...O9..`.._.
    0060 - f6 56 ad 92 45 9b b4 9b-9f b7 21 07 24 17 2c 1c   .V..E.....!.$.,.
    0070 - 72 28 67 f3 aa 61 c6 3c-db 37 6d 5a 98 34 43 f3   r(g..a.<.7mZ.4C.
    0080 - a1 03 98 c7 56 2e 6a 23-d7 db 19 8b 0e 38 91 89   ....V.j#.....8..
    0090 - a5 7a 26 75 45 03 66 4b-8d a6 5a 5f de 3e 60 5b   .z&uE.fK..Z_.>`[
    00a0 - 1b a3 2d 70 4d 77 b5 2c-e9 26 62 49 6f f3 31 a9   ..-pMw.,.&bIo.1.
    00b0 - 0d 85 02 d5 9c b8 ac 50-6d 6c f7 cf b6 78 08 48   .......Pml...x.H
    00c0 - f2 c9 30 3d ef 4f 99 6f-db fc de 8b 14 42 df fb   ..0=.O.o.....B..

    Start Time: 1683422805
    Timeout   : 7200 (sec)
    Verify return code: 18 (self-signed certificate)
    Extended master secret: no
    Max Early Data: 0
---
read R BLOCK
* OK [CAPABILITY IMAP4rev1 SASL-IR LOGIN-REFERRALS ID ENABLE IDLE LITERAL+ AUTH=PLAIN] Dovecot (Ubuntu) ready.
1 login ubuntu password
1 OK [CAPABILITY IMAP4rev1 SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS BINARY MOVE SNIPPET=FUZZY PREVIEW=FUZZY PREVIEW STATUS=SIZE SAVEDATE LITERAL+ NOTIFY SPECIAL-USE] Logged in
2 list "" *
* LIST (\HasNoChildren) "." INBOX
2 OK List completed (0.002 + 0.000 + 0.001 secs).
3 select INBOX
* FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
* OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft \*)] Flags permitted.
* 1 EXISTS
* 1 RECENT
* OK [UNSEEN 1] First unseen.
* OK [UIDVALIDITY 1682756249] UIDs valid
* OK [UIDNEXT 2] Predicted next UID
3 OK [READ-WRITE] Select completed (0.003 + 0.000 + 0.002 secs).
4 fetch 1 body[]
* 1 FETCH (FLAGS (\Seen \Recent) BODY[] {317}
Return-Path: <test@sender.home>
Delivered-To: ubuntu
Received: from sender.home ([172.16.1.3])
        by dovecot1 with LMTP
        id UMwGBHjSTGT8EQAA9sUnBg
        (envelope-from <test@sender.home>)
        for <ubuntu>; Sat, 29 Apr 2023 17:16:56 +0900
From: test@sender.home
To: ubuntu@yuki.home
Subject: test mail

hello, world
)
4 OK Fetch completed (0.003 + 0.000 + 0.002 secs).
5 logout
* BYE Logging out
5 OK Logout completed (0.001 + 0.000 secs).
closed
```

## Dovecot IMAPS 用の証明書

自動で仕込まれたオレオレ証明書だと、設定されているのがコンテナ名になります。ホスト名をCommonNameとする証明書を作ってオレオレ認証局で認証、を[以前やりました](https://qiita.com/katz_engineer/items/1bb165f5f59c43c0ab6a)ので、これを仕込みます。

認証局：

- 秘密鍵 `/opt/CA/demoCA/pki/private/ca.key`
- 公開鍵 `/opt/CA/demoCA/pki/ca.crt`

サーバーマシン secondary.home の証明書：

- 秘密鍵 `/opt/CA/demoCA/pki/private/secondary.home.key`
- 公開鍵 `/opt/CA/demoCA/pki/issued/secondary.home.crt`

Dovecot-IMAPで必要な証明書は、書き方が他とはちょっと違うようです。証明書と認証局の鍵を結合して、Dovecot用のpemファイル`dovecot_secondary.pem`を作成します。

- [dovecotでのサーバ証明書のインストール方法 - SSL・EV SSL サーバー証明書 サポート - SSLSERVER](https://rms.ne.jp/sslserver/install/install_dovecot-html/)

```console:ホスト側
cd
mkdir dovecotIMAP
cd dovecotIMAP
```

```console:ホスト側
sudo cat /opt/CA/demoCA/pki/private/secondary.home.key >dovecot_secondary.pem
```

```console:ホスト側
sudo openssl x509 -outform pem -in /opt/CA/demoCA/pki/issued/secondary.home.crt >>dovecot_secondary.pem
```

```console:ホスト側
sudo cat /opt/CA/demoCA/pki/ca.crt >>dovecot_secondary.pem
```

pemファイルを作成できたら、所定の場所にコピーします。

```console:ホスト側
lxc file push dovecot_secondary.pem $CONTAINER/etc/dovecot/private/dovecot_secondary.pem
```

セキュリティの都合で、権限とファイルオーナーを設定します。

```console:ホスト側
lxc exec $CONTAINER chown root:root /etc/dovecot/private/dovecot_secondary.pem
```

```console:ホスト側
lxc exec $CONTAINER chmod 600 /etc/dovecot/private/dovecot_secondary.pem
```

## dovecot IMAP 証明書の設定

作成した証明書を参照するように設定します。

まずはパッチファイルを用意します。

```console:ホスト側
cat >imap.patch <<___
Index: /etc/dovecot/conf.d/10-ssl.conf
===================================================================
--- /etc/dovecot/conf.d/10-ssl.conf     (revision 3)
+++ /etc/dovecot/conf.d/10-ssl.conf     (working copy)
@@ -9,8 +9,8 @@
 # dropping root privileges, so keep the key file unreadable by anyone but
 # root. Included doc/mkcert.sh can be used to easily generate self-signed
 # certificate, just make sure to update the domains in dovecot-openssl.cnf
-ssl_cert = </etc/dovecot/private/dovecot.pem
-ssl_key = </etc/dovecot/private/dovecot.key
+ssl_cert = </etc/dovecot/private/dovecot_secondary.pem
+ssl_key = </etc/dovecot/private/dovecot_secondary.pem

 # If key file is password protected, give the password here. Alternatively
 # give it when starting dovecot with -p parameter. Since this file is often
___
```

設定ファイルを、コンテナ内からホスト側へ取り出します。

```console:ホスト側
lxc file pull $CONTAINER/etc/dovecot/conf.d/10-ssl.conf .
```

パッチを当てます。今回はエラーは出ないようです。

```console:ホスト側
patch 10-ssl.conf <imap.patch
```

パッチを当てた設定ファイルをコンテナに戻します。

```console:ホスト側
lxc file push 10-ssl.conf $CONTAINER/etc/dovecot/conf.d/
```

Dovecotに設定を読み込ませます。

```console:ホスト側
lxc exec $CONTAINER systemctl reload dovecot
```

## IMAPSでDovecotと会話

再び`openssl s_client`コマンドを実行します。172.16.1.3は私のホストマシンのIPアドレスです。

```console:ホスト側
openssl s_client -connect 172.16.1.3:$IMAPS_PORT
```

opensslプロンプト内で実行するコマンドを再掲します。

```console:openssl
1 login ubuntu password
2 list "" *
3 select INBOX
4 fetch 1 body[]
5 logout
```

今度の実行結果はこんな感じ。最初に表示される証明書の内容が変わります。

```console:ホスト側
$ openssl s_client -connect 172.16.1.3:$IMAPS_PORT
CONNECTED(00000003)
Can't use SSL_get_servername
depth=1 CN = demoCA
verify error:num=19:self-signed certificate in certificate chain
verify return:1
depth=1 CN = demoCA
verify return:1
depth=0 CN = secondary.home
verify return:1
---
Certificate chain
 0 s:CN = secondary.home
   i:CN = demoCA
   a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA256
   v:NotBefore: May  7 01:15:48 2023 GMT; NotAfter: Aug  9 01:15:48 2025 GMT
 1 s:CN = demoCA
   i:CN = demoCA
   a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA256
   v:NotBefore: May  7 01:11:29 2023 GMT; NotAfter: May  4 01:11:29 2033 GMT
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIDbjCCAlagAwIBAgIRAP8ZVwc46vGV+jGuyH0xOkwwDQYJKoZIhvcNAQELBQAw
ETEPMA0GA1UEAwwGZGVtb0NBMB4XDTIzMDUwNzAxMTU0OFoXDTI1MDgwOTAxMTU0
OFowGTEXMBUGA1UEAwwOc2Vjb25kYXJ5LmhvbWUwggEiMA0GCSqGSIb3DQEBAQUA
A4IBDwAwggEKAoIBAQCyBlKnqQZumtTTnD94RdcVkFOohD5DB9SAbfx/Ew2lfq1N
MY4jlBgj6/xUBfLQTmQV8qq38g+Z05OC4lHJlDYNCYwtSd+pX7x3DWmfTotMS/k8
NHwYm3i87CZZHi9fhPteQu5ibTy2CiujBeNFotQhGr0KwsL3sl4NLMfrzauRo/RH
LWSPPW3qJVQPKi7J43K6fJ0C8DvV0HfhrHKbroFkuRW5KdHCcPBz+uVflF2Uw+s8
LhPZbiPccLk3QRg5CDDNAEAgoJU8cxuD0D8UEqtl3bbW1TyroFdFtSigPK6PiP8V
XQvIV6JPjXqPzN/EPNDT7ullYq74sZ1sTeRU2/b3AgMBAAGjgbgwgbUwCQYDVR0T
BAIwADAdBgNVHQ4EFgQUGmQz5bCGgtsEy6CZT90Ta4DX9sIwTAYDVR0jBEUwQ4AU
eJgw+VfFZOfwc7XVXWc0zIkHPlShFaQTMBExDzANBgNVBAMMBmRlbW9DQYIUBXCd
6WMauOe6FTgb/y3NNQrLUp4wEwYDVR0lBAwwCgYIKwYBBQUHAwEwCwYDVR0PBAQD
AgWgMBkGA1UdEQQSMBCCDnNlY29uZGFyeS5ob21lMA0GCSqGSIb3DQEBCwUAA4IB
AQAW3/hFcdsYntZK4B81yfIWCHhs4ixz+q6uWBxC8rL/ymfs+E+fvU+vA/ZeVR/m
PbUTXg97DoY/R5t7/GjCob761ZEkw37dgIXwNRxoVjUXuREW8DyKIFq76f+veVzv
wCFvLo7CiSengswRq8GNvMmfkVW32YW2Ul1KOHSu4UG2Or1wvXbjvZDVT2BGq5tV
JR6hlg+f4bB+AP7XCe3lgTsiV1EFKX/2WfpqbmnHSjn+4HYxcTee/j5frUPxxXbZ
AYt16zl8FVEluUX0jyyQFMmgCa0ZHfVLgSocuIoZ7+RexgiW5jSVr6AmVXQb0EO+
Hgx310kbfAiZnNanqKNi/A1G
-----END CERTIFICATE-----
subject=CN = secondary.home
issuer=CN = demoCA
---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 2275 bytes and written 373 bytes
Verification error: self-signed certificate in certificate chain
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 2048 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 19 (self-signed certificate in certificate chain)
---
---
Post-Handshake New Session Ticket arrived:
SSL-Session:
    Protocol  : TLSv1.3
    Cipher    : TLS_AES_256_GCM_SHA384
    Session-ID: 0CCBECD9CD806FF06FE29FF0722F23E02BB68EADCF763A5C6AEE85FC590D0E4E
    Session-ID-ctx:
    Resumption PSK: B9EB1CAA2A0BD8BBDB50B4838C6C4F1F9B0A748596C91B8F194B0C2A17DB54E1B644140FC2A94748593A5545D53097D4
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 7200 (seconds)
    TLS session ticket:
    0000 - 13 2d e8 b1 6c 67 74 7a-c2 78 d4 f0 07 3e 51 00   .-..lgtz.x...>Q.
    0010 - d4 29 d8 49 67 05 e7 e1-d9 35 e2 b4 0f a5 f9 06   .).Ig....5......
    0020 - 22 fe aa 20 91 2c 44 b9-72 e5 94 de c5 fa b1 18   ".. .,D.r.......
    0030 - 14 a3 72 6a c2 61 d1 4a-5e 55 17 30 9c 63 f1 9c   ..rj.a.J^U.0.c..
    0040 - 9d cd 1b 92 ca b2 38 82-30 6e 2a 3a a7 02 75 05   ......8.0n*:..u.
    0050 - d1 0d 2f 4d 77 44 e0 75-1d b7 dc 36 36 96 1b 81   ../MwD.u...66...
    0060 - cc 8b 55 25 d3 ff 72 56-5b 5b 66 b6 4e 7e ea 15   ..U%..rV[[f.N~..
    0070 - 17 de a2 ee 5e 9e 6f c9-55 f3 48 8b 31 dd 1f 4a   ....^.o.U.H.1..J
    0080 - cc b9 b5 55 ea c8 b1 23-ff 9d bb 67 b3 97 12 06   ...U...#...g....
    0090 - 3b c7 fd d2 02 2d 94 15-30 bd f5 af b6 9c 6b 3b   ;....-..0.....k;
    00a0 - 5a f3 6d ba ce 50 8f e8-4d dd 79 15 b5 72 0f 44   Z.m..P..M.y..r.D
    00b0 - 9a 72 d2 4f 82 71 a7 cb-1e ef a9 01 f7 18 65 2b   .r.O.q........e+
    00c0 - f3 e3 f5 03 60 49 19 e0-76 e7 ed 6b 76 88 0b 05   ....`I..v..kv...

    Start Time: 1683423312
    Timeout   : 7200 (sec)
    Verify return code: 19 (self-signed certificate in certificate chain)
    Extended master secret: no
    Max Early Data: 0
---
read R BLOCK
---
Post-Handshake New Session Ticket arrived:
SSL-Session:
    Protocol  : TLSv1.3
    Cipher    : TLS_AES_256_GCM_SHA384
    Session-ID: 116C5075749359A1A1E3A8BB1F1D844E79688085246333D8D9A41FAE23F553AD
    Session-ID-ctx:
    Resumption PSK: D88D42C6CB5A739BBF7B4876E54C2205131F5FE33F63208EA73A1ADCC942EEFAC0AC029AE35902EEE706E9B9CD77ED68
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 7200 (seconds)
    TLS session ticket:
    0000 - 13 2d e8 b1 6c 67 74 7a-c2 78 d4 f0 07 3e 51 00   .-..lgtz.x...>Q.
    0010 - a4 aa fb 10 e9 ea 3e e2-07 9b 87 5e b4 51 46 c5   ......>....^.QF.
    0020 - 29 b2 1e 99 83 8e dc 72-47 72 e1 f9 0c 34 2f e7   )......rGr...4/.
    0030 - 30 6f c2 4a 2c f0 ee bd-7c a3 dc 08 d2 7b 5d 06   0o.J,...|....{].
    0040 - f2 71 e1 1b 65 6a 97 f0-e1 02 b1 7b 32 fe 26 d1   .q..ej.....{2.&.
    0050 - 7b 70 e6 27 0d 08 ba 58-9d c9 fb c7 e9 01 86 df   {p.'...X........
    0060 - 7f 66 c2 50 02 5f 49 42-3a 91 11 32 08 17 a2 3d   .f.P._IB:..2...=
    0070 - 2f 8f 32 ff 80 74 4d 46-52 28 67 a9 2f e3 11 f4   /.2..tMFR(g./...
    0080 - 22 5a 5a 01 54 b8 36 44-23 e0 58 f6 82 cb f9 b9   "ZZ.T.6D#.X.....
    0090 - bd 9a 33 d1 5d c2 84 44-22 a0 7d 3c 9e 0e c1 91   ..3.]..D".}<....
    00a0 - 8e 67 5e 1e 2a 0a f4 8a-1c a4 27 90 84 eb f4 48   .g^.*.....'....H
    00b0 - f0 2f 4b 10 1b 0a cb 6f-1f e8 3a e5 19 64 ad 84   ./K....o..:..d..
    00c0 - 11 eb ce c9 11 87 37 91-bb c0 47 83 91 44 24 8a   ......7...G..D$.

    Start Time: 1683423312
    Timeout   : 7200 (sec)
    Verify return code: 19 (self-signed certificate in certificate chain)
    Extended master secret: no
    Max Early Data: 0
---
read R BLOCK
* OK [CAPABILITY IMAP4rev1 SASL-IR LOGIN-REFERRALS ID ENABLE IDLE LITERAL+ AUTH=PLAIN] Dovecot (Ubuntu) ready.
1 login ubuntu password
1 OK [CAPABILITY IMAP4rev1 SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS BINARY MOVE SNIPPET=FUZZY PREVIEW=FUZZY PREVIEW STATUS=SIZE SAVEDATE LITERAL+ NOTIFY SPECIAL-USE] Logged in
2 list "" *
* LIST (\HasNoChildren) "." INBOX
2 OK List completed (0.001 + 0.000 secs).
3 select INBOX
* FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
* OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft \*)] Flags permitted.
* 1 EXISTS
* 0 RECENT
* OK [UIDVALIDITY 1682756249] UIDs valid
* OK [UIDNEXT 2] Predicted next UID
3 OK [READ-WRITE] Select completed (0.002 + 0.000 + 0.001 secs).
4 fetch 1 body[]
* 1 FETCH (BODY[] {317}
Return-Path: <test@sender.home>
Delivered-To: ubuntu
Received: from sender.home ([172.16.1.3])
        by dovecot1 with LMTP
        id UMwGBHjSTGT8EQAA9sUnBg
        (envelope-from <test@sender.home>)
        for <ubuntu>; Sat, 29 Apr 2023 17:16:56 +0900
From: test@sender.home
To: ubuntu@yuki.home
Subject: test mail

hello, world
)
4 OK Fetch completed (0.001 + 0.000 secs).
5 logout
* BYE Logging out
5 OK Logout completed (0.001 + 0.000 secs).
closed
```

# 仕舞い

コンテナ内の`/etc`をSubversion登録しましょう。

```console:ホスト側
lxc shell $CONTAINER
```

今回は、設定とpemファイル追加があります。

```console:コンテナ内
svn st /etc
```

こんな感じ。

```console:コンテナ内
# svn st /etc
M       /etc/dovecot/conf.d/10-ssl.conf
?       /etc/dovecot/conf.d/20-imap.conf
?       /etc/dovecot/private/dovecot_secondary.pem
?       /etc/ufw
```

おっと。`/etc/ufw`はファイアウォールの設定です。Dovecot-IMAPをインストールするとファイアウォールの設定まで付いてくるようですな。

ファイルを追加。

```console:コンテナ内
svn st /etc | grep "^?" | cut -b9- | xargs -I{} sudo find {} -type f -or -type d -or -type l | xargs -t sudo svn add
```

```console:コンテナ内
svn ci -m"Dovecot IMAP setting" /etc
svn up /etc
```

これで、蓄積されたメールをIMAPSで参照できるようになりました。やったね:thumbsup_tone1: