Unfederated Email, Part II ========================== A few years ago, I wrote a phlog entry about self-hosting an unfederated email server (which only sends emails among the users on the local machine). I set up the server on my home network and used it to send notes and files to my old devices. Since it was on my LAN, the server sent and received mails in clear text, without certificates and without encryption. I mentioned in that post that my ultimate aim was to add encryption, so that I could access the server with my email client over the open internet. Several months later, a reader let me know that they'd like the setup details when I did it. Well, I finally set it up, and the details are below. It's the simplest possible system. Each system user automatically has an email account on the server, using their regular username and password. It also requires the use of TLS on all connections. If you want to add new email users, just create a system user account for them. If you don't want them actually using the system, permit server logins with an RSA certificate only. Why? ==== If you're wondering why a person might want an unfederated email server, I get it. But it does have uses. Mine is to send myself emails. I often send myself emails containing reminders, notes, and files. If I look at my inbox, almost all of the incoming traffic consists of commercial notifications. I hardly ever respond to those emails. In fact, when I look at my sent items, almost all of the outgoing traffic is notes to myself or emails to family. So why not keep some of that traffic away from my email provider? I'm sure there are other reasons to do this as well. You might want to set up a private Delta Chat server. Or you might want to send emails among a small group of people or set up something like a groupchat or mailing list. How? ==== The following setup guide is for an unfederated server running Debian 12 (Bookworm). The server makes use of Dovecot for IMAP connections (for retrieving email), OpenSMTPD for SMTP (for sending), and mailutils (for some of the local setup on the machine). Since the server is unfederated and you don't have to scan for spam, the demands on the system are very light. All of the setup below must be done as root. 1. Pre-installation ------------------- A. Add backports to your repositories. The version of OpenSMTPD in Debian Bookworm has a TLS bug that prevents it from establishing secure connections. This caused me serious amounts of frustration before I found out about the bug! To add backports, edit your /etc/apt/sources.list Add the following line: deb http://deb.debian.org/debian bookworm-backports main B. Update your server apt-get update apt-get upgrade 2. Installation --------------- Install dovecot, OpenSMTPD, and mailutils: apt-get install mailutils dovecot-imapd apt-get install opensmtpd/bookworm-backports When openSMTPD asks for the server name, give it the fully-qualified domain name (the whole URL for your server). 3. Dovecot Configuration ------------------------ A. Edit /etc/dovecot/conf.d/10-ssl.conf Change the line "ssl = yes" to: ssl = required If you want to use the self-signed certificate automatically created by Dovecot, make sure the following lines are uncommented (remove the octothorpe at the beginning of the line, if any): ssl_cert = </etc/dovecot/private/dovecot.pem ssl_key = </etc/dovecot/private/dovecot.key Alternatively, if you have Let's Encrypt certificates on the server, you can link to them instead. In my case, I had them for the Apache2 webserver already, so the two lines above look like this instead: ssl_cert = </etc/apache2/ssl/fullchain.pem ssl_key = </etc/apache2/ssl/private/key.pem Note: you have to put the < before the file link. It's mandatory! B. Edit /etc/dovecot/conf.d/10-auth.conf Uncomment the line: disable_plaintext_auth = yes C. Edit /etc/dovecot/conf.d/10-master.conf Find these lines: service imap-login { inet_listener imap { #port = 143 } inet_listener imaps { #port = 993 #ssl = yes } Edit them to look like this: service imap-login { #inet_listener imap { #port = 143 #} inet_listener imaps { port = 993 ssl = yes } 4. OpenSMTPD Configuration -------------------------- Edit /etc/smtpd.conf Save the existing file as smtpd.conf.bak or something like that. Then delete the existing contents of /etc/smtpd.conf and cut and paste everything from "table" to the final "local" below into the file. You can use the self-signed certificate/key pair created by Dovecot, or your Let's Encrypt set if you have one. Just comment out the certificate/key pair that you don't want to use. If your Let's Encrypt certificates are kept in a different directory, change the links as necessary (here and in Dovecot's /etc/dovecot/conf.d/10-ssl.conf file). Wherever it says "your.domain.name" substitute your fully-qualified domain name. table aliases file:/etc/aliases #pki your.domain.name cert "/etc/dovecot/private/dovecot.pem" #pki your.domain.name key "/etc/dovecot/private/dovecot.key" pki your.domain.name cert "/etc/apache2/ssl/fullchain.pem" pki your.domain.name key "/etc/apache2/ssl/private/key.pem" listen on your.domain.name port 465 smtps pki your.domain.name auth action "local" mbox alias <aliases> match for local action "local" match from any for domain "localhost" action "local" match from any for domain "localhost.localdomain" action "local" match from any for domain "your.domain.name" action "local" 5. Restart the services to reload the configuration files: ---------------------------------------------------------- systemctl restart dovecot systemctl restart opensmtpd 6. Open Ports ------------- Open ports 465 and 993 in your firewall. If you don't have a firewall, look up ufw (uncomplicated firewall). It is very simple to use. If the server is at home, you'll have to set up port forwarding on your router to gain external access. If your internet provider blocks ports 465 and 993, you can use different numbers. Just don't use ports regularly used by other services. You can find lists of commonly used ports by searching online. 7. Set up your email client --------------------------- I use Claws-Mail and set it up as follows. Note that myusername is the username from my account on the server. Basic Tab --------- Email Address: yourusername@your.domain.name Protocol: IMAP Server for Receiving: your.domain.name SMTP server (send): your.domain.name User ID: yourusername <-- don't include the @your.domain.name! Password: password for the user account on the server Send Tab -------- Check the box for SMTP Authentication. You don't have to fill in the User ID or Password. TLS Tab ------- Select the checkbox for "Use TLS" for both IMAP and SMTP. Advanced Tab ------------ Select the checkbox for SMTP port and enter 465. Select the checkbox for IMAP port and enter 993. 8. Final Notes -------------- A. I suspect that in some situations using regular user accounts for email could pose a security risk by increasing the possibility of revealing usernames and passwords, but I only permit RSA key logins on my servers (and no root logins). B. If you use a Let's Encrypt certificate, you'll probably want to add Dovecot and OpenSMTPD to the services that restart after each renewal. How you do that will depend on the client you use to update Let's Encrypt. Both certbot and acme.sh have that capability.