docker-mailserver/docs/content/a-mail-server's-101.md
2020-06-12 07:15:22 +02:00

17 KiB

What is a mail server and how does it perform its duty?
Here's an introduction to the field that covers everything you need to know to get started with docker-mailserver.

Anatomy of a mail server

A mail server is only a part of a client-server relationship aimed at exchanging information in the form of emails. Exchanging emails requires using specific means (programs and protocols).

docker-mailserver provides you with the server portion, whereas "the" client can be anything from a console, text-only software (eg. Mutt) to a fully-fledged desktop application (eg. Mozilla Thunderbird, Microsoft Outlook…), to a webmail, etc.

Unlike the client side where usually a single program is used to perform retrieval and reading of emails, the server side is composed of many specialized components. "The" mail server is capable of accepting, forwarding, delivering, storing and overall exchanging messages, but each one of those tasks is actually handled by a specific piece of software. All those "agents" must be integrated with one another for the exchange to take place.

docker-mailserver has made some informed choices about those components and their (default) configuration. It offers a comprehensive platform to run a feature-full mail server in no time!

Components

The following components are required to create a complete delivery chain:

  • MUA: a Mail User Agent is basically any client/program capable of sending emails to arbitrary mail servers; and most of the times, capable of fetching emails from such mail servers and presenting them to the end users.
  • MTA: a Mail Transfer Agent is the so-called "mail server" as seen from the MUA's perspective. More specifically, it's a piece of software dedicated to accepting, and in some cases, transfering/relaying emails. A MTA may accept incoming emails either from MUAs or from other MTAs. It may then relay emails to either other MTAs or, eventually, an MDA.
  • MDA: a Mail Delivery Agent is responsible for accepting emails from a MTA, but instead of forwarding it to another MTA, it is responsible for dropping emails into their recipients' mailboxes, whichever the form.

Here's a schematic view of mail delivery:

Sending an email:    MUA ---> MTA ---> MTA ---> ... ---> MTA ---> MDA
Fetching an email:   MUA <--------------------------------------- MDA

There may be other moving parts or sub-divisions (for instance, at several points along the chain, specialized programs may be analyzing, filtering, bouncing, editing… the exchanged emails).

In a nutshell, docker-mailserver provides you with the following components:

  • a MTA: Postfix
  • a MDA: Dovecot
  • a bunch of additional programs to improve security and emails processing

Here's where docker-mailserver's toochain fits within the delivery chain:

                                    docker-mailserver is here:
                                                         ┏━━━━━━━┓
Sending an email:    MUA ---> MTA ---> MTA ---> ... ---> ┫ MTA ╮ ┃
Fetching an email:   MUA <------------------------------ ┫ MDA ╯ ┃
                                                         ┗━━━━━━━┛

By default, docker-mailserver does not act as a relay nor does it accept emails from relays. It only handles direct email trafic, bound to a specific hostname. Thus our schema can be further simplified to look like this:

         docker-mailserver is here:
                              ┏━━━━━━━┓
Sending an email:    MUA ---> ┫ MTA ╮ ┃
Fetching an email:   MUA <--- ┫ MDA ╯ ┃
                              ┗━━━━━━━┛

Of course the MUA and docker-mailserver's MTA may be located in distant (network-wise) places, so don't expect a direct connection between MUAs and your mail server. It is very likely email trafic will hop through several relaying TCP servers-but those will not be MTA servers, so are irrelevant here.

One important thing to note is that MTA and MDA programs may actually handle multiple tasks (which is the case with docker-mailserver's Postfix and Dovecot).

For instance, Postfix is both a SMTP server (accepting emails) and a relaying MTA (transfering ie. sending emails to other MTA/MDA); Dovecot is both a MDA (delivering emails in mailboxes) and an IMAP server (allowing MUAs to fetch emails from the so-called "mail server"). On top of that, Postfix may rely on Dovecot's authentication capabilities!

The exact relationship between all the components and their respective (and sometimes, shared) responsibilities is beyond the scope of this document. Please explore this wiki & the web to get more insights about docker-mailserver's toolchain.

About security & ports

In the previous section, different components were outlined. Each one of those is responsible for a specific task, it has a specific purpose.

Three main purposes exist when it comes to exchanging emails:

  • Submission: for a MUA (client), the act of sending actual email data over the network, toward a MTA (server).
  • Transfer (aka. Relay): for a MTA, the act of sending actual email data over the network, toward another MTA (server) closer to the final destination (where a MTA will forward data to a MDA).
  • Retrieval: for a MUA (client), the act of fetching actual email data over the network, from a MDA.

Postfix handles Submission (and might handle Relay), whereas Dovecot handles Retrieval. They both need to be accessible by MUAs in order to act as servers, therefore they expose public endpoints on specific TCP ports. Those endpoints may be secured, using an encryption scheme and TLS certificates.

When it comes to the specifics of email exchange, we have to look at protocols and ports enabled to support all the identified purposes. There are several valid options and they've been evolving overtime.

Here's docker-mailserver's default configuration:

Purpose Protocol TCP port / encryption
Transfer/Relay SMTP 25 (unencrypted)
Submission ESMTP 587 (encrypted using STARTTLS)
Retrieval IMAP4 143 (encrypted using STARTTLS) + 993 (TLS)
Retrieval POP3 Not activated
 ┏━━━━━━━━━━ Submission ━━━━━━━━━┓┏━━━━━━━━━━━━━ Transfer/Relay ━━━━━━━━━━━┓
                        ┌─────────────────────┐                    ┌┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┐
MUA ----- STARTTLS ---> ┤(587)   MTA ╮    (25)├ <-- plain text --> ┊ Third-party MTA ┊
    ---- plain text --> ┤(25)        │        |                    └┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┘
                        |┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄|
MUA <---- STARTTLS ---- ┤(143)   MDA ╯        |
    <-- enforced TLS -- ┤(993)                |
                        └─────────────────────┘
 ┗━━━━━━━━━━ Retrieval ━━━━━━━━━━┛

If you're new to the field, both that table and schema may be confusing.
Read on to gain insights about all those concepts, docker-mailserver's default configuration and how you could customize it.

Submission - SMTP

A MUA willing to send an email to a MTA needs to establish a connection with that server, then push data packets over a network that both the MUA (client) and the MTA (server) are connected to. The server implements the SMTP protocol, which makes it capable of handling Submission.

In the case of docker-mailserver, the MTA (SMTP server) is Postfix. The MUA (client) may vary, yet its Submission request is performed as TCP packets sent over the public internet. This exchange of information may be secured in order to counter eavesdropping.

The best practice as of 2020 would be to handle emails Submission using an Implicit TLS connection with an ESMTP server on port 465 (see RFC 8314). Let's break it down.

  • Implicit TLS means the server enforces the client into using an encrypted TCP connection, using TLS. With this kind of connection, the MUA has to establish a TLS-encrypted connection from the get go. The mail server would deny any client attempting at submitting emails in plain text (== not secure) or requesting a plain text connection to be upgraded to a TLS-encrypted one (== eventually secure). It is also known as Enforced TLS.
  • ESMTP is SMTP + extensions. It's the version of the SMTP protocol that most mail servers speak nowadays. For the purpose of this documentation, ESMTP and SMTP are synonymous.
  • Port 465 is (starting 2018) the reserved TCP port for Implicit TLS Submission. There is acually a boisterous history to that port's usage, but let's keep it simple.

Note: this Submission setup is sometimes refered to as SMTPS. Long story short: this is incorrect and should be avoided.

Although a very satisfactory setup, Implicit TLS on port 465 is somewhat "cutting edge". There exists another well established mail Submission setup that must be supported as well, SMTP+STARTTLS on port 587. It uses Explicit TLS: the client starts with a plain text connection, then the server informs a TLS-encrypted "upgraded" connection may be established, and the client may eventually decide to establish it prior to the Submission. Basically it's an opportunistic, opt-in TLS upgrade of the connection between the client and the server, at the client's discretion, using a mechanism known as STARTTLS that both ends need to implement.

In many implementations, the mail server doesn't enforce TLS encryption, for backwards compatibility. Clients are thus free to deny the TLS-upgrade proposal (or misled by a hacker about STARTTLS not being available), and the server eventually accepts unencrypted (plain text) mail exchange, which poses a confidentiality threat and, to some extent, spam issues. RFC 8314 (section 3.3) recommends for mail servers to support both Implicit and Explicit TLS for Submission, and to enforce TLS-encryption on ports 587 (Explicit TLS) and 465 (Implicit TLS). That's exactly docker-mailserver's default configuration: abiding by RFC 8314, it enforces a strict (encrypt) STARTTLS policy, where a denied TLS upgrade terminates the connection thus preventing unencrypted (plain text) Submission by the client.

  • docker-mailserver's default configuration enables and requires Explicit TLS (STARTTLS) for Submission on port 587.
  • It does not enable Implicit TLS Submission on port 465 by default. One may enable it through simple custom configuration, either as a replacement or (better!) supplementary mean of secure Submission.
  • It does not support old MUAs (clients) not supporting TLS encryption on ports 587/465 (those should perform Submission on port 25, more details below). One may relax that constraint through advanced custom configuration, for backwards compatibility.

A final Submission setup exists and is akin SMTP+STARTTLS on port 587, but on port 25. That port has historically been reserved specifically for unencrypted (plain text) mail exchange though, making STARTTLS a bit of a misusage. As is expected by RFC 5321, docker-mailserver uses port 25 for unencrypted Submission in order to support older clients, but most importantly for unencrypted Transfer/Relay between MTAs.

  • docker-mailserver's default configuration enables unencrypted (plain text) for Submission & Transfer/Relay on port 25.
  • It does not enable Explicit TLS (STARTTLS) on port 25 by default. One may enable it through advanced custom configuration, either as a replacement (bad!) or as a supplementary mean of secure Submission & Transfer/Relay.
  • One may also secure Transfer/Relay on port 25 using advanced encryption scheme, such as DANE and/or MTA-STS.

Retrieval - IMAP

A MUA willing to fetch an email from a mail server will most likely communicate with its IMAP server. As with SMTP described earlier, communication will take place in the form of data packets exchanged over a network that both the client and the server are connected to. The IMAP protocol makes the server capable of handling Retrieval.

In the case of docker-mailserver, the IMAP server is Dovecot. The MUA (client) may vary, yet its Retrieval request is performed as TCP packets sent over the public internet. This exchange of information may be secured in order to counter eavesdropping.

Again, as with SMTP described earlier, the IMAP protocol may be secured with either Implicit TLS (aka. IMAPS/IMAP4S) or Explicit TLS (using STARTTLS).

The best practice as of 2020 is to enforce IMAPS on port 993, rather than IMAP+STARTTLS on port 143 (see RFC 8314); yet the latter is usually provided for backwards compatibility.

docker-mailserver's default configuration enables both Implicit and Explicit TLS for Retrievial, on ports 993 and 143 respectively.

Retrieval - POP3

Similarly to IMAP, the older POP3 protocol may be secured with either Implicit or Explicit TLS.

The best practice as of 2020 would be POP3S on port 995, rather than POP3+STARTTLS on port 110 (see RFC 8314).

docker-mailserver's default configuration disables POP3 altogether. One should expect MUAs to use TLS-encrypted IMAP for Retrieval.

How does docker-mailserver help with setting everything up?

As a batteries included Docker image, docker-mailserver provides you with all the required components and a default configuration, to run a decent and secure mail server.

One may then customize all aspects of its internal components.

On the subject of security, one might consider docker-mailserver's default configuration to not be 100% secure:

  • it enables unencrypted trafic on port 25
  • it enables Explicit TLS (STARTTLS) on port 587, instead of Implicit TLS on port 465

We believe docker-mailserver's default configuration to be a good middle ground: it goes slightly beyond "old" (1999) RFC 2487; and with developper-friendly configuration settings, it makes it pretty easy to abide by the "newest" (2018) RFC 8314.

Eventually, it is up to you deciding exactly what kind of transportation/encryption to use and/or enforce, and to customize your instance accordingly (with looser or stricter security). Be also aware that protocols and ports can only go so far and that unencrypted/weak relaying (typically between MTAs) not under your control may defeat your highly-secure-on-paper setup; advanced counter-measure such as DANE, MTA-STS and full body encryption should be considered as well for increased confidentiality, without forgetting about backwards compatibility.

The README is the best starting point in configuring and running your mail server. You may then explore this wiki to cover additional topics, including but not limited to, security.