Support TLS for pure remote doveadm commands

Vincent Brillault vincent.brillault at cern.ch
Wed Nov 11 17:14:25 EET 2020


Dear all,

A lot of doveadm commands (e.g. backup/sync, deduplicate, mailbox) support a
`-S` (a.k.a `socket-path`) argument that allows to run the command remotely.
Unfortunately, I think that there is a bug in the handling of the TLS
configuration for this feature.

After a bit of debugging, I think it's simply due to
doveadm_mail_server_user_get_host
(https://github.com/dovecot/core/blob/master/src/doveadm/doveadm-mail-server.c#L179)
bailing out too quickly: It's used by doveadm_mail_server_user
(https://github.com/dovecot/core/blob/master/src/doveadm/doveadm-mail-server.c#L286)
to set its `user`, `host`, `hostip`, `port` and `ssl_flags`. When doveadm_port
is not (or set to 0):
- `user` is set to `input->username`: OK
- `host` is set to `ctx->set->doveadm_socket_path` (the content of the `-S`
option): OK
- `hostip` is not set: OK (Later on, the `host` is used in that case)
- `port` is set to 0: This is OK, as when the `hostip` (or rather the
`server->ip` later in the code) is not set, this is only the default, the port
is extracted from the `host` (or rather `server->name`)
- `ssl_flags` is not modified: this is not OK as there is nothing else
modifying it!

Bailing out just a few line later (as in
https://patch-diff.githubusercontent.com/raw/dovecot/core/pull/145.patch)
fixes the issue for me.

To reproduce the issue, with dovecot-2.3.11.3-4, you will need two systems, A
& B: A needs to have dovecot configured and port 9091 open in its firewall for
B. B just need dovecot to be installed.

- Testing without TLS:
    - Add the following to A's dovecot configuration (and reload it):
        ```
        service doveadm {
          inet_listener {
            port = 9091
          }
        }
        doveadm_password=VeryRandomString
        ```
    - On B, create a file X containing (only):
    ```
    doveadm_password=VeryRandomString
    ```
    - On B, running `doveadm -c X mailbox list -u ${existing_user} -S
${A}:9091` should return the mailbox list

- Switching to TLS:
    - Replace what was added to A's dovecot configuration (and reload it) with:
        ```
        service doveadm {
          inet_listener {
            port = 9091
            ssl = yes
          }
        }
        doveadm_password=VeryRandomString
        doveadm_ssl = ssl # Not strictly required
        ```
    - On B, create a file Y containing (only):
    ```
    doveadm_password=VeryRandomString
    doveadm_ssl=yes
    ```
    - On B, running `doveadm -c Y mailbox list -u ${existing_user} -S
${A}:9091` will not work.
    - On A, you should see in the logs: `dovecot[16435]: doveadm(${B}): Error:
SSL handshake failed: SSL_accept() failed: error:140760FC:SSL
routines:SSL23_GET_CLIENT_HELLO:unknown protocol`

Applying the patch mentioned above makes the 2nd case work.

What do you think?
Cheers,
Vincent

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <https://dovecot.org/pipermail/dovecot/attachments/20201111/d9528c6e/attachment-0001.sig>


More information about the dovecot mailing list