Hulpartikel overzicht

Hulpartikel

Postfix & Dovecot installeren en configureren in Linux

Op Linux mailservers wordt meestal Exim of Postfix (MTA) in combinatie met Dovecot (MDA) gebruikt. Exim en Postfix zorgen voor het versturen van mail van de ene mailserver naar de andere. Dovecot zorgt dat mail die aan je VPS wordt geleverd, daadwerkelijk bij het juiste mailadres uit komt.

In deze tutorial laten wij zien hoe je Postfix en Dovecot installeert op een Linux-VPS met CentOS 7, Ubuntu, of Debian. In deze tutorial laten wij zien hoe je een lijst van 'virtual domains en mailboxes' gebruikt om mail te verwerken. Hiervoor maken wij gebruik van een database die beheerd wordt via MariaDB. Daarnaast laten wij zien hoe je SSL (TLS) van Let's Encrypt gebruikt om de verbinding te beveiligen en je firewall configureert voor je mailserver.

  • Voor de stappen in deze handleiding heb je nodig:
     
  • Voer de stappen in dit artikel uit met sudo, of als root-user.
     
  • MariaDB moet geïnstalleerd zijn op je VPS. Hoe je MariaDB installeert en configureert leggen we in deze handleidingen uit voor CentOS 7, CentOS 8, Ubuntu 18.04, Ubuntu 20.04 en Debian 9.
     
  • De stappen in dit artikel zijn getest in CentOS 7 & 8, Ubuntu 20.04 en Debian 9.

Een database aanmaken

 

Voor de virtuele mailadressen raden wij aan een database te gebruiken. Hiermee is het eenvoudiger om domeinen en mailadressen toe te voegen dan vanuit de Postfix-configuratie zelf, bijvoorbeeld als je zelf een controlepaneel aanbiedt van waaruit mensen dit zelf kunnen doen. Je kunt dan eenvoudig gebruik maken van SQL statements.

 

Stap 1

Verbind met je VPS via SSH of de VPS-console in het TransIP-controlepaneel.


 

Stap 2

Update je VPS zodat je de meest recente software tot je beschikking hebt:

Ubuntu / Debian:

apt -y update
apt -y upgrade

CentOS:

yum -y update

Wij raden aan na een update je VPS te herstarten. Veel updates worden pas daadwerkelijk doorgevoerd na een reboot. Hierdoor komen eventuele problemen in de configuratie van je server dan sneller aan het licht en kun je eventueel nog een back-up terugplaatsen.


 

Stap 3

Start nu eerst een SQL-shell. Een nadere toelichting van SQL-commando's vind je in ons artikel over MariaDB beheren via command-line.

mysql -u root -p

Stap 4

Vervolgens genereer je de SQL-gebruiker, database en tabelen voor je mailserver. Eerst maak je de database aan met het volgende commando. Je bent vrij de naam 'mailserver' aan te passen.

CREATE DATABASE mailserver;

Stap 5

Maak de gebruiker aan met het commando (vervang 'user' en 'password' naar wens):

GRANT SELECT ON mailserver.* TO 'user'@'127.0.0.1' IDENTIFIED BY 'password';

Pas deze wijziging toe met het commando:

FLUSH PRIVILEGES;

 

Stap 6

Schakel over naar de database 'mailserver' die je zojuist hebt aangemaakt met het commando:

USE mailserver;

 

Stap 7

Maak vervolgens een tabel aan voor respectievelijk de virtuele domeinen, e-mailadressen (inclusief wachtwoord) en aliassen. De code hieronder kun je in zijn geheel kopiëren en plakken in Putty.

CREATE TABLE virtual_domains (
 DomainId INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
 DomainName VARCHAR(50) NOT NULL
);

CREATE TABLE virtual_mailboxes (
 MailId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
 DomainId INT NOT NULL,
 password VARCHAR(255) NOT NULL,
 Email VARCHAR(100) UNIQUE KEY NOT NULL,
 FOREIGN KEY (DomainId) REFERENCES virtual_domains(DomainId) ON DELETE CASCADE
);

CREATE TABLE virtual_aliases (
 AliasId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
 DomainId INT NOT NULL,
 Source VARCHAR(100) NOT NULL,
 Destination VARCHAR(100) NOT NULL,
FOREIGN KEY (DomainId) REFERENCES virtual_domains(DomainId) ON DELETE CASCADE
);

 

Stap 8

Sluit voor nu de SQL-shell met:

exit

Postfix installeren en configureren

 

Stap 1

Installeer Postfix met het commando:

Ubuntu/Debian:

apt -y install postfix postfix-mysql policycoreutils-python-utils

Je krijgt na de installatie automatisch een korte installatiewizard te zien. Er wordt gevraagd om je hostname, die standaard al ingevuld wordt.

ubuntu postfix configuration mail name

Vervolgens moet je een mail server configuration type selecteren. Kies hier voor 'internet site'.

ubuntu postfix configuration

CentOS:

yum -y install postfix postfix-mysql policycoreutils-python-utils

Het kan zijn dat Postfix al aanwezig is op je VPS. Bij een minimal install van CentOS 7 en 8 in juni 2020 was dit het geval.


 

Stap 2

De configuratie van Postfix wordt aangestuurd via /etc/postfix/main.cf. Open dit bestand, bijvoorbeeld met:

nano /etc/postfix/main.cf

 

Stap 3

Pas de volgende waardes aan/voeg ze toe in het geopende bestand. Een deel van deze opties zijn optioneel. In de toelichting onder de code leggen wij de functie van deze opties uit en welke waardes je kunt gebruiken.

Een overzicht van alle beschikbare configuratieopties voor Postfix vind je hier.

Heb je voor de installatie van je VPS een SSH, one time password, of Cloud-Init installatie gebruikt? Stel dan voor de correcte werking van mydestination eerst je hostname in, zie deze handleidingen voor Ubuntu en CentOS.

myhostname = mail.example.com
mydomain = example.com
myorigin = $mydomain
smtp_bind_address = 123.123.123.123
smtp_bind_address6 = 2a01:7c8:d001:2::1
inet_interfaces = all
inet_protocols = all
mydestination = $myhostname, localhost.$mydomain, localhost
smtpd_recipient_restrictions = permit_mynetworks
home_mailbox = Maildir/
Toelichting
  • myhostname: Wanneer je VPS mail stuurt namens de localhost / host name, gebruikt Postfix als domein de waarde van de variabele $myhostname. Standaard gebruikt Postfix als waarde de localhost van je VPS.
    Wil je dat Postfix een ander domein gebruikt voor $myhostname? Uncomment / verwijder dan de # bij een van de aanwezige #myhostname regels (omstreeks regel 80-90) en geef de gewenste domeinnaam op.
     
  • mydomain: De variabele $mydomain wordt een aantal keer gebruikt in de Postfix-configuratie, voornamelijk om andere variabelen aan te vullen (zie bijvoorbeeld myorigin hieronder).
    Postfix gebruikt hiervoor de waarde van $myhostname min het eerste deel. Is bijvoorbeeld server.example.com de waarde van $myhostname, dan wordt de $mydomain variabele automatisch ingevuld als 'example.com'.
    Wil je dit zelf aanpassen? Uncomment dan 'mydomain' en pas die naar wens aan.
     
  • myorigin: Voor lokale mail (binnen je VPS) gebruikt Postfix standaard de waarde van $myhostname. Het is netter dit aan te passen naar de waarde van $mydomain. Uncomment 'myorigin = $mydomain'.
     
  • smtp_bind_address (optioneel): Postfix gebruikt voor het versturen van mail een willekeurig beschikbaar IP-adres van je VPS. Wil je hier meer controle over, dan kun je een IP-adres specificeren door onderaan in het configuratiebestand de volgende regel toe te voegen. Vervang hierbij 123.123.123.123 door het IP-adres dat je wil gebruiken. Deze optie is niet aanwezig in CentOS 8.
     
  • smtp_bind_address6 (optioneel): Net als smtp_bind_address kun je smtp_bind_address6 gebruiken om aan een specifiek IPv6-adres te binden. Deze optie is niet aanwezig in CentOS 8.
     
  • inet_interfaces: De netwerk interfaces waarop Postfix mail ontvangt. Je kan hier IP-adressen specificeren.
     
  • inet_protocols: Wil je enkel IPv4 of IPv6 gebruiken? Pas dan de waarde van inet_protocols aan naar ipv4 of ipv6, bijvoorbeeld:
    inet_protocols=ipv4
    
     
  • mydestination: De domeinen waarvoor de $local_transport mail transport wordt gebruikt. Voor andere domeinen wordt de SQL-constructie gebruikt die we in dit artikel opzetten.
     
  • smtpd_recipient_restrictions: De waarde permit_mynetworks vertelt Postfix om verbindingen die in $mynetworks staan toe te staan voor 'RCPT TO'commando's.
     
  • home_mailbox: De mapnaam waar de mailbox in wordt aangemaakt. Stel dat je hier 'Maildir' invult, dan wordt met de configuratie die je in dit artikel doorloopt de mailbox aangemaakt in /home/vmail/<jedomeinnaam>/<gebruikersnaam>/Maildir/.
     

 

Stap 4

De Postfix-configuratie heeft (bijna) geen default of uitgecommentarieerde code voor SSL/TLS. Scroll naar het eind van het bestand en voeg de volgende code toe/pas de bestaande waardes aan. In de toelichting leggen wij de code nader toe.

Let op: In de versie van december 2021 van Postfix is er een kopje 'TLS parameters' aanwezig. Voeg de onderstaande code daar toe / pas de bestaande code aan waar nodig.

#TLS configuration options
append_dot_mydomain = no
biff = no
config_directory = /etc/postfix
dovecot_destination_recipient_limit = 1
smtp_tls_security_level = may
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_tls_cert_file=/etc/letsencrypt/live/mail.example.com/fullchain.pem
smtpd_tls_key_file=/etc/letsencrypt/live/mail.example.com/privkey.pem
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous, noplaintext
smtpd_sasl_tls_security_options = noanonymous
smtpd_tls_auth_only = yes
smtpd_tls_security_level = may
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtpd_use_tls=yes
Toelichting
  • append_dot_mydomain: lokale mail gericht aan gebruikers zonder domeinnaam krijgen de opgegeven domeinnaam toegevoegd. Gebruik 'no' of je hostname, e.g. server.voorbeeld.nl.
     
  • biff: Stuurt gebruikers op je besturingssysteem een 'new mail' notificatie als er nieuwe mail komt. Als je VPS als mailserver wordt opgezet en niet als remote werkplek, gebruik je 'no' als waarde om dit uit te schakelen.
     
  • config_directory: de locatie waar main.cf en master.cf zijn opgenomen.
     
  • dovecot_destination_recipient_limit: Geeft mails op je mailserver af aan maximaal het opgegeven aantal gebruikers tegelijkertijd.
     
  • smtp_tls_security_level: Het standaard beveiligingsniveau van de Postfix SMTP client. De optie 'may' zorgt ervoor dat TLS gebruikt wordt als de remote SMTP server waar mail naar verstuurd wordt dit ondersteund. Zo niet, dan wordt plaintext gebruikt.
     
  • smtp_ & smtpd_tls_session_cache_database: De naam van het SMTP en SMTPD session cache bestand, zie deze pagina voor meer informatie over session caching.
     
  • smtpd_tls_cert_file & smtpd_tls_key_file: De locatie van je SSL-certificaat en private key. Vervang mail.example.com door het subdomein dat je wil gebruiken om mail over te sturen en ontvangen.
     
  • smtpd_sasl_auth_enable: Staat SASL-authenticatie toe. SASL is een technologie waarmee authenticatie losgekoppeld kan worden van de applicatie. Onze VPS-mailservice gebruikt bijvoorbeeld SASL. In deze handleiding gebruiken we het om Dovecot en Postfix met elkaar te kunnen laten communiceren.
     
  • smtpd_sasl_security_options: Verbied anonieme verbindingen en plaintext wachtwoorden voor SASL-verbindingen. Dit gebruikt Postfix voor het afleveren van mail aan Dovecot.
     
  • smtpd_sasl_tls_security_options: Verbied anonieme verbindingen voor TLS versleutelde SMTP sessies.
     
  • smtpd_tls_auth_only: Met de waarde 'yes' wordt een TLS-verbinding vereist. Onveilige verbindingen zonder encryptie worden niet toegestaan.
     
  • smtpd_tls_security_level: De waarde 'may' laat remote SMTP clients weten dat STARTTLS ondersteund wordt op je server. Het wordt niet verplicht door deze optie, daar zorgt smtpd_tls_auth_only = yes voor.
     
  • smtpd_use_tls: Vereist TLS van remote SMTP clients met de waarde 'yes' (dit is aanzienlijk veiliger dan de default optie 'no').

 

Stap 5

In deze stap voeg je de benodigde code toe om gebruik te maken van virtual mailboxes. Voeg aan het eind van het bestand de volgende code toe. In de toelichting leggen wij virtual mailboxes en de code nader toe.

# Virtual mail settings
virtual_transport = dovecot
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
virtual_mailbox_domains = mysql:/etc/postfix/virtual-mailbox-domains.conf
virtual_mailbox_maps = mysql:/etc/postfix/virtual-mailbox-users.conf
virtual_alias_maps = mysql:/etc/postfix/virtual-alias-maps.conf
Toelichting

In de inleiding van dit artikel gaven wij aan dat wij virtual mailboxes gebruiken. In Linux heb je systeem users, zoals root en gebruikersaccounts die je zelf aanmaakt. Standaard worden die gebruikt voor het sturen van mail, met bijvoorbeeld als versturend domein je hostname. Dit werkt prima wanneer je één domein host, zoals voorbeeld.nl, maar als je twee of meer domeinen host, hoe maak je dan onderscheid tussen bijvoorbeeld info@voorbeeld.nl en info@example.com? Die zouden beide het gebruikersaccount 'info' gebruiken.

Voor dergelijke scenario's raden wij virtual mailboxes aan (en omdat het overzichtelijk werkt). Hiermee specificeer je duidelijk welke domeinen op je VPS mail mogen ontvangen en versturen.

Dat brengt ons bij de code:

  • virtual_transport: Geeft aan welke LMTP (Local Mail Transfer Protocol) gebruikt wordt voor het afleveren van mail. In dit geval is dat die van Dovecot.
     
  • virtual_sasl_type: Geeft aan welk type SASL-authenticatie gebruikt wordt. Hier is dat Dovecot.
     
  • virtual_sasl_path: Geeft aan waar de authenticatie-socket zich bevindt relatief gezien ten opzichte van de Postfix spool directory (standaard /var/spool/postfix)
     
  • virtual_mailbox_domains: geeft aan waar een overzicht te vinden is van de (virtuele) domeinen die via je VPS mail versturen / ontvangen. In dit geval wordt een mysql-verbinding gebruikt waarvan de configuratie bepaalt is in /etc/postfix/mysql-virtual-mailbox-domains.conf (dit bestand maak je aan in de volgende stap).
     
  • virtual_mailbox_maps: bepaalt waar de virtuele mailboxes te vinden zijn. In dit geval verwijst dit ook naar een configuratiebestand waarin een sql-verbinding is geconfigureerd.
     
  • virtual_alias_maps: Hiervoor geldt hetzelfde als bij virtual_mailbox_maps, maar dan voor mail aliases.

Sla hierna de wijzigingen op en sluit het bestand (ctrl + x > y > enter).


 

Stap 6

In de vorige stap heb je de locatie opgegeven van de virtual_mailbox_domains-, virtual_mailbox_maps- en virtual_alias_maps-configuratiebestanden. Met de code hieronder maak je deze bestanden aan en configureer je ze.

Pas de waardes 'user', 'password' en 'mailserver' aan naar respectievelijk de naam en het wachtwoord van de database-gebruiker en de databse naam die je in stap 5 en 4 van het eerste onderdeel hebt ingesteld.

Tip: Je kunt de code bijvoorbeeld naar een tekst editor kopiëren en plakken, waar nodig de gegevens aanpassen en daarna in Putty plakken.

echo 'user = user' > /etc/postfix/virtual-mailbox-domains.conf
echo 'password = password' >> /etc/postfix/virtual-mailbox-domains.conf
echo 'hosts = 127.0.0.1' >> /etc/postfix/virtual-mailbox-domains.conf
echo 'dbname = mailserver' >> /etc/postfix/virtual-mailbox-domains.conf
echo "query = SELECT 1 FROM virtual_domains WHERE DomainName ='%s'" >> /etc/postfix/virtual-mailbox-domains.conf

echo 'user = user' > /etc/postfix/virtual-mailbox-users.conf
echo 'password = password' >> /etc/postfix/virtual-mailbox-users.conf
echo 'hosts = 127.0.0.1' >> /etc/postfix/virtual-mailbox-users.conf
echo 'dbname = mailserver' >> /etc/postfix/virtual-mailbox-users.conf
echo "query = SELECT 1 FROM virtual_mailboxes WHERE Email='%s'" >> /etc/postfix/virtual-mailbox-users.conf

echo 'user = user' > /etc/postfix/virtual-alias-maps.conf
echo 'password = password' >> /etc/postfix/virtual-alias-maps.conf
echo 'hosts = 127.0.0.1' >> /etc/postfix/virtual-alias-maps.conf
echo 'dbname = mailserver' >> /etc/postfix/virtual-alias-maps.conf
echo "query = SELECT Destination FROM virtual_aliases WHERE Source='%s'" >> /etc/postfix/virtual-alias-maps.conf
Toelichting
  • Met de echo commando's wordt de code rechtstreeks in de opgegeven bestanden toegevoegd.
  • Het eerste echo commando in ieder blok maakt het bijbehorende bestand aan.
  • De >> in de commando's voegt de respectievelijke regel aan het eind van het bestand toe.
  • Het laatste commando in ieder blok gebruikt dubbele quotes omdat anders de apostrof niet meegenomen wordt.

 

Stap 7

Pas de rechten aan op de bestanden zodat de root-user ze kan lezen en schrijven en de groep ze kan lezen:

chmod 640 /etc/postfix/virtual-mailbox-domains.conf
chmod 640 /etc/postfix/virtual-mailbox-users.conf
chmod 640 /etc/postfix/virtual-alias-maps.conf

 

Stap 8

Open /etc/postfix/master.cf:

nano /etc/postfix/master.cf

 

Stap 9

De configuratie in dit bestand beheerst alle processen die door Postfix worden gestart. Pas de configuratie aan, zodat het eerste deel er uit ziet als in het voorbeeld hieronder.

#
# Postfix master process configuration file.  For details on the format
# of the file, see the master(5) manual page (command: "man 5 master" or
# on-line: http://www.postfix.org/master.5.html).
#
# Do not forget to execute "postfix reload" after editing this file.
#
# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (no)    (never) (100)
# ==========================================================================
smtp      inet  n       -       n       -       -       smtpd
#smtp      inet  n       -       n       -       1       postscreen
#smtpd     pass  -       -       n       -       -       smtpd
#dnsblog   unix  -       -       n       -       0       dnsblog
#tlsproxy  unix  -       -       n       -       0       tlsproxy
submission inet n       -       n       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_tls_auth_only=yes
  -o smtpd_reject_unlisted_recipient=no
#  -o smtpd_client_restrictions=$mua_client_restrictions
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
#  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING
#smtps     inet  n       -       n       -       -       smtpd
#  -o syslog_name=postfix/smtps
#  -o smtpd_tls_wrappermode=yes
#  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_reject_unlisted_recipient=no
#  -o smtpd_client_restrictions=$mua_client_restrictions
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
#  -o smtpd_recipient_restrictions=
#  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING
#628       inet  n       -       n       -       -       qmqpd
pickup    unix  n       -       n       60      1       pickup
cleanup   unix  n       -       n       -       0       cleanup
qmgr      unix  n       -       n       300     1       qmgr
#qmgr     unix  n       -       n       300     1       oqmgr
tlsmgr    unix  -       -       n       1000?   1       tlsmgr
rewrite   unix  -       -       n       -       -       trivial-rewrite
bounce    unix  -       -       n       -       0       bounce
defer     unix  -       -       n       -       0       bounce
trace     unix  -       -       n       -       0       bounce
verify    unix  -       -       n       -       1       verify
flush     unix  n       -       n       1000?   0       flush
proxymap  unix  -       -       n       -       -       proxymap
proxywrite unix -       -       n       -       1       proxymap
smtp      unix  -       -       n       -       -       smtp
relay     unix  -       -       n       -       -       smtp
        -o syslog_name=postfix/$service_name
#       -o smtp_helo_timeout=5 -o smtp_connect_timeout=5
showq     unix  n       -       n       -       -       showq
error     unix  -       -       n       -       -       error
retry     unix  -       -       n       -       -       error
discard   unix  -       -       n       -       -       discard
local     unix  -       n       n       -       -       local
virtual   unix  -       n       n       -       -       virtual
lmtp      unix  -       -       n       -       -       lmtp
anvil     unix  -       -       n       -       1       anvil
scache    unix  -       -       n       -       1       scache

Ga naar het eind van het bestand en voeg daar nog de volgende regels toe:

Ubuntu/Debian:

dovecot   unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -f ${sender} -d ${recipient}

CentOS:

dovecot   unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail:vmail argv=/usr/libexec/dovecot/deliver -f ${sender} -d ${recipient}

Sla tot slot je wijzigingen op en sluit het bestand (ctrl + x > y > enter).


Dovecot installeren en configureren

 

Stap 1

Installeer Dovecot met het commando:

Ubuntu/Debian:

apt -y install dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-mysql

CentOS:

yum -y install dovecot dovecot-mysql

 

Stap 2

De configuratie van Dovecot is verspreid over meerdere specifieke bestanden. Eerst pas je de algemene configuratie aan in /etc/dovecot/dovecot.conf.

nano /etc/dovecot/dovecot.conf

 

Stap 3

Pas de waardes van de onderstaande opties aan in het bestand zodat die overeenkomen met dit voorbeeld.

Ubuntu/Debian:

!include_try /usr/share/dovecot/protocols.d/*.protocol
listen = *, :: 
!include conf.d/*.conf 
!include_try local.conf

CentOS:

protocols = imap pop3 lmtp
listen = *, ::
!include conf.d/*.conf
!include_try local.conf

Sla de wijzigingen op en sluit tot slot het bestand (ctrl + x > y > enter).

CentOS 8/Ubuntu/Debian - Optioneel:

Optioneel kun je met de onderstaande code de log output van Dovecot naar een ander bestand laten wegschrijven dan waar Postfix naar wegschrijft. Zo houd je je logbestanden overzichtelijker in geval van problemen.

log_path = /var/log/dovecot.log

 

Stap 4 - Optioneel

Maak het opgegeven logbestand aan en pas de rechten aan, zodat Dovecot er gegevens naar kan wegschrijven.

touch /var/log/dovecot.log
chmod 666 /var/log/dovecot.log

 

Stap 5

Open de SSL-configuratie in het bestand 10-ssl.conf:

nano /etc/dovecot/conf.d/10-ssl.conf

 

Stap 6

Voeg onderstaande inhoud toe aan het bestand/pas de bestaande waarde aan:

ssl_cert = </etc/letsencrypt/live/mail.jedomein.nl/fullchain.pem 
ssl_key = </etc/letsencrypt/live/mail.jedomein.nl/privkey.pem

Sla daarna je wijzigingen op en sluit het bestand (ctrl + x > y > enter).

Toelichting

ssl_cert & ssl_key: verwijzen naar de locatie waar je Let's Encrypt SSL-certificaat staat.

  • Verander mail.jedomein.nl naar het subdomein die je wil gebruiken als server-naam voor inkomende en uitgaande mail.
     
  • Het certificaat genereer je in de laatste paragraaf van deze handleiding.
     

Aanvullende informatie

Je komt hier bij veel hanleidingen meestal de optie SSL = yes tegen. Standaard staat Dovecot ingesteld op SSL = required. SSL = required vereist in alle gevallen SSL/TLS en authenticatie voor SSL/TLS is ingeschakeld zal altijd falen. Dit is een veilige optie en daarom laten wij die op required staan.

Wanneer je gebruik maakt van SSL = yes en disable_plaintext_auth=no (plaintext in deze context is een niet versleuteld wachtwoord), is je verbinding onveilig tenzij je enkel plaintext mechanismes gebruikt (e.g. auth { mechanisms = plain login }). Dan werkt SSL = yes in essentie hetzelfde als SSL = required. Er is dus geen reden om een andere optie dan 'required' te gebruiken.


 

Stap 7

Vervolgens open je de mail-configuratie. Hierin geef je aan waar de mailbox zich bevindt op je server.

nano /etc/dovecot/conf.d/10-mail.conf

 

Stap 8

Pas in het bestand de onderstaande variabelen aan waar nodig:

mail_location = maildir:/home/vmail/%d/%n/Maildir
namespace inbox {
  inbox = yes
}
mail_privileged_group = mail
mbox_write_locks = fcntl

Sla daarna je wijzigingen op en sluit het bestand (ctrl + x > y > enter).

Toelichting

Met maildir: geef je aan dat je het maildir-format gebruikt. /home/vmail/%d/%n/Maildir geeft aan de folder te gebruiken die overeenkomt met /home/vmail/<domein>/<naam>/Maildir (%d vult het domein in en %n is een variabele die automatisch de naam die voor de domeinnaam staat in <naam>@<domein.com> invult).


 

Stap 9

Je geeft Postfix toestemming om Dovecot's authenticatiesysteem te gebruiken in 10-master.conf. Open dit bestand met:

nano /etc/dovecot/conf.d/10-master.conf

 

Stap 10

Pas de inhoud aan zodat de services die hieronder staan in je configuratie overeenkomen. De uitgecommentarieerde stukken, herkenbaar aan dat de regels beginnen met #, hebben wij voor leesbaarheid er uit gelaten.

service imap-login {
  inet_listener imap {
    port = 143
  }
  inet_listener imaps {
  port = 993
  ssl = yes
  }
}

service pop3-login {
  inet_listener pop3 {
    port = 110
  }
  inet_listener pop3s {
  port = 995
  ssl = yes
  }
}


service lmtp {
 unix_listener /var/spool/postfix/private/dovecot-lmtp {
   mode = 0600
   user = postfix
   group = postfix
 }
}

service auth {

  unix_listener auth-userdb {
    mode = 0600 
    user = vmail 
  }

  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix 
  }

  user = dovecot
}

service auth-worker {
  user = vmail
}

service dict {
  unix_listener dict {
  }
}
Toelichting

10-master.conf bevat configuraties van verschillende 'sockets' waarin bepaald wordt welke gebruiker welke rechten heeft bij het uitvoeren van de betreffende socket en waar die uitgevoerd wordt (gedefinieerd als de unix_listener).


 

Stap 11

Open het bestand waar de authenticatie in wordt verzorgt:

nano /etc/dovecot/conf.d/10-auth.conf

 

Stap 12

Pas in dit bestand de volgende waardes aan zodat die er uit zien zoals hieronder:

disable_plaintext_auth = yes
auth_mechanisms = plain login

#!include auth-system.conf.ext
!include auth-sql.conf.ext

Sla daarna je wijzigingen op en sluit het bestand (ctrl + x > y > enter).

Toelichting
auth_mechanisms = plain login: voegt ondersteuning voor plain en login toe. Dit zijn authenticatiemethodes die door (nagenoeg) alle mailsoftware ondersteund wordt.

auth-system-conf.ext: Door deze optie uit te commentariëren, voorkom je dat de standaard aanwezige authenticatie systemen conflicteren met de authenticatie voor SQL die je zelf insteld.

auth-sql.conf.ext: Het bestand waarin de authenticatie via SQL wordt verzorgd.

 

Stap 13

Open vervolgens het bestand auth-sql.conf.ext:

nano /etc/dovecot/conf.d/auth-sql.conf.ext

 

Stap 14

Pas de passdb- en userdb-driver aan als volgt:

passdb {
  driver = sql
  args = /etc/dovecot/dovecot-sql.conf.ext
}

userdb {
  driver = static
  args = uid=vmail gid=vmail home=/home/vmail/%d/%n/Maildir
} 

Sla je wijzigingen op en sluit het bestand (ctrl + x > y > enter).


 

Stap 15

in auth-sql.conf.ext zag je misschien al dat passdb verwijst naar /etc/dovecot/dovecot-sql.conf.ext. Dit bestand bestaat nog niet maar hierin moeten de gegevens voor de MySQL-verbinding komen. Maak het aan met de commando's hieronder, waarbij je de waardes 'mailserver', 'user' en 'password' in de 2e regel vervangt door de gegevens zoals je die in stap 4 en 5 van het eerste deel van deze handleiding hebt ingesteld.

echo 'driver = mysql' > /etc/dovecot/dovecot-sql.conf.ext
echo 'connect = "host=127.0.0.1 dbname=mailserver user=user password=password"' >> /etc/dovecot/dovecot-sql.conf.ext
echo 'default_pass_scheme = SHA512-CRYPT' >> /etc/dovecot/dovecot-sql.conf.ext
echo "password_query = SELECT Email as User, password FROM virtual_mailboxes WHERE Email='%u';" >> /etc/dovecot/dovecot-sql.conf.ext

Vmail-gebruiker aanmaken

In de stappen hierboven heb je een paar keer als user 'vmail' ingesteld. In de stappen hieronder maak je deze user aan en pas je waar nodig rechten tot directories e.d. aan.

 

Stap 1

Maak de vmail user, group en bijbehorende home directory aan met:

useradd -u 5000 vmail -d /home/vmail/
usermod -a -G vmail vmail
groupmod -g 5000 vmail
mkdir /home/vmail/

Het mkdir-commando is normaal gesproken niet nodig, maar uit voorzorg toegevoegd mocht je OS niet met het -d argument bij useradd de home directory correct aanmaken.


 

Stap 2

Pas de rechten van de vmail-user aan voor /home/vmail en /etc/dovecot als volgt:

chown -R vmail:vmail /home/vmail
chown -R vmail:dovecot /etc/dovecot
chmod -R o-rwx /etc/dovecot

Firewall en gerelateerde instellingen

Voor de correcte werking van je mail en het genereren van Let's Encrypt certificaten, is het nodig enkele poorten open te zetten. Dit doe je met de commando's:

Ubuntu/Debian

ufw allow 80
ufw allow 443
ufw allow 25
ufw allow 465
ufw allow 587
ufw allow 993
ufw allow 995

CentOS:

firewall-cmd --zone=public --permanent --add-port=80/tcp
firewall-cmd --zone=public --permanent --add-port=443/tcpfirewall-cmd --zone=public --permanent --add-port=25/tcp
firewall-cmd --zone=public --permanent --add-port=465/tcp
firewall-cmd --zone=public --permanent --add-port=587/tcp
firewall-cmd --zone=public --permanent --add-port=993/tcp
firewall-cmd --zone=public --permanent --add-port=995/tcp
firewall-cmd --reload
  • Poort 80 en 443 zijn nodig voor de Let's Encrypt-validatie (de acme-challenge).
  • Poort 993 en 995 zijn respectievelijk de IMAP- en POP3-poorten die Dovecot gebruikt voor TLS-verbindingen.
  • Poort 25, 465 en 587 zijn de poorten die Postfix gebruikt voor het versturen en ontvangen van e-mail.

 

Selinux

Gebruik je Selinux (te controleren met 'sestatus')? Voeg dan de nodige poorten ook hierin toe met:

semanage port --add -t ssh_port_t -p tcp 80semanage port --add -t ssh_port_t -p tcp 443
semanage port --add -t ssh_port_t -p tcp 25
semanage port --add -t ssh_port_t -p tcp 465semanage port --add -t ssh_port_t -p tcp 587semanage port --add -t ssh_port_t -p tcp 993
semanage port --add -t ssh_port_t -p tcp 995

 

Uitgaande mailpoorten openzetten

Bij nieuwe VPS'en zijn de mailpoorten om veiligheidsredenen gesloten in het TransIP-controlepaneel. In dit artikel laten wij zien hoe je ze open zet.


 

VPS-firewall

Gebruik je de VPS-firewall in het TransIP-controlepaneel? Zet dan ook daarin de poorten 80, 443, 993, 995 en 587 open.


 

Fail2ban

Gebruik je Fail2Ban? De logpath voor de Postfix-jail is /var/log/maillog


SSL

 

In dit onderdeel maak je een SSL-certificaat aan met Let's Encrypt en automatiseer je het vernieuwen ervan.

 

Stap 1

Installeer Let's Encrypt met het commando:

Ubuntu/Debian:

apt -y install certbot

CentOS:

yum -y install certbot

 

Stap 2

In deze stap genereer je een standalone certificaat met het onderstaande commando. Vervang hier mail.voorbeeld.nl door het subdomein dat je wil gebruiken om in je mailclient in te stellen als server voor inkomend en uitgaand verkeer.

Er zal je om een e-mailadres en toestemming gevraagd worden voor de algemene voorwaarden, en voor het delen van je e-mailadres met de Electronic Frontier Foundation (optioneel).

certbot certonly --standalone -d mail.voorbeeld.nl

 

Stap 3

Je Let's Encrypt-certificaat en keyfile zijn opgeslagen in /etc/letsencrypt/live/<hostname>/ (de exacte locatie staat in de output van het commando in stap 2).

Het voordeel van Let's Encrypt is dat je het verlengen van de certificaten kunt automatiseren. Dit doe je middels een cronjob die je aanmaakt met:

crontab -e

 

Stap 4

De eerste keer dat je crontab start wordt gevraagd wat voor type editor je wil gebruiken. Wij gebruiken hier vi voor, waarbij Crontab in command mode opent en je overschakelt op insert mode met de toets 'i'. Voeg daarna de inhoud hieronder toe.

SHELL=/bin/bash
HOME=/
@monthly certbot -q renew >> /var/log/le.log
  • De cronjob wordt iedere maand om 0:00 uitgevoerd.
  • -q zorgt ervoor dat er geen output wordt gegenereerd, behalve bij errors.
  • renew vernieuwt alle Let's Encrypt-certificaten die binnen 30 dagen verlopen. Let's Encrypt certificaten zijn 90 dagen geldig, dus hiermee wordt elke twee maanden een nieuw certificaat gegenereerd.
  • >> /var/log/le.log stuurt de output naar het bestand le.log. Deze maak je aan met het commando: touch /var/log/le.log (of gebruik de bestaande /var/log/letsencrypt/letsencrypt.log)

Door achtereenvolgens esc > :wq! te typen sluit je de crontab en sla je je wijzigingen op. Als alles goed gaat krijg je de volgende bevestiging te zien:

crontab: installing new crontab

 

Stap 6

Postfix en Dovecot hebben geen rechten tot de mappen waar de certificaten in zijn opgeslagen en tot het privkey1.pem bestand. Pas de rechten aan zodat beide er gebruik van kunnen maken:

chmod 755 /etc/letsencrypt/archive
chmod 755 /etc/letsencrypt/archive/mail.voorbeeld.nl
chmod 644 /etc/letsencrypt/archive/mail.voorbeeld.nl/privkey1.pem
chmod 755 /etc/letsencrypt/live
chmod 755 /etc/letsencrypt/live/mail.voorbeeld.nl

Een e-mailadres aanmaken

 

Stap 1

Maak eerst een directorie aan in /home/vmail/ voor het domein namens welke je mail gaat versturen en pas de eigenaar van die directorie aan, bijvoorbeeld:

mkdir -p /home/vmail/example.com/

 

Stap 2

Maak een directorie aan voor de mail van de gebruikeren pas de eigenaar van deze en de onderliggende directorie aan:

mkdir /home/vmail/example.com/gebruiker
chown -R vmail:vmail /home/vmail/example.com/

 

Stap 3

Start vervolgens een SQL-shell:

mysql -u root -p

 

Stap 4

Als je een mailadres wil toevoegen voor een domein dat nog niet in je database voorkomt (zoals wanneer je deze handleiding voor het eerst doorloopt), voeg je eerst het domein toe.

De huidige domeinen in je database controleer je met het commando:

SELECT * FROM mailserver.virtual_domains;

Een nieuw domein voeg je vervolgens toe met:

INSERT INTO mailserver.virtual_domains (DomainName) VALUES ('example.com');

Vervang hier 'example.com' door de naam van het domein dat je wil toevoegen


 

Stap 5

Voeg vervolgens een e-mailadres toe met de onderstaande code.

  • Vervang 1 (de DomainId) door het id van het domein in de virtual_domains tabel, te controleren met:
    SELECT * FROM mailserver.virtual_domains;
  • Vervang transip@voorbeeld.nl en password door respectievelijk het gewenste mailadres en wachtwoord.
INSERT INTO mailserver.virtual_mailboxes
  (DomainId, Email, Password)
VALUES 
  ('1', 'transip@voorbeeld.nl', ENCRYPT('password', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))));

of in één regel:

INSERT INTO mailserver.virtual_mailboxes (DomainId, Email, Password) VALUES ('1', 'transip@voorbeeld.nl', ENCRYPT('password', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))));

 

Stap 6

Sluit vervolgens de SQL-shell met:

exit

Wanneer je voortaan een nieuw mailadres voor een bestaand domein aanmaakt, herhaal je stap 2, 3, 5 en 6 van dit onderdeel.


 

Alles inschakelen

Gefeliciteerd! Je bent nu klaar bent met de configuratie van je mailserver. Het enige dat nog resteert, is je mailserver in te schakelen en in je e-mail clients je mailadres toe te voegen. Schakel eerst je mailserver in met:

systemctl enable postfix
systemctl enable dovecot
systemctl restart postfix
systemctl restart dovecot

E-mail instellen in mail software en apps

Voor deze handleiding hebben wij een domein gebruikt waarbij het MX-record de waarde 10 mail heeft en het subdomein mail naar de VPS verwijst. Wij gaan ervan uit dat je dezelfde structuur aanhoudt, zo niet, pas dan onderstaande aan naar je eigen scenario.

Voor het instellen van je mailadres in je mailsoftware gebruik je de volgende gegevens:

  • E-mailadres: het gewenste e-mailadres waar je mee wil mailen.
  • Username: hetzelfde e-mailadres als hierboven
  • Password: het bijbehorende (niet versleutelde) wachtwoord
  • Account naam: nogmaals hetzelfde e-mailadres
  • Send message using the name: De naam waarvan je wilt dat die verschijnt voor je e-mails.
     
  • Incoming server: mail.voorbeeld.nl (het subdomein dat verwijst naar je VPS)
  • Account type: imap of pop3. De verschillen worden hier uitgelegd.
  • Incoming port: 993 (IMAP) of 995 (POP3)
  • Require SSL: yes, of SSL/TLS
     
  • Outgoing (smtp) server: mail.voorbeeld.nl (het subdomein dat verwijst naar je VPS)
  • Outgoing port: 465 of 587
  • Require SSL: yes, of SSL/TLS
  • Outgoing server requires authentication: yes
  • Use the same user name and password for sending mail: yes

 

Daarmee zijn wij aan het eind gekomen van deze handleiding. Hierin hebben wij de basis van het opzetten van een mailserver met Postfix en Dovecot met TLS-beveiliging via Let's Encrypt behandelt. Voor de beveiliging van je mailserver raden wij aan ook nog de volgende documentatie door te nemen:

Mocht je aan de hand van deze handleiding nog vragen hebben, aarzel dan niet om onze supportafdeling te benaderen. Je kunt hen bereiken via de knop 'Neem contact op' onderaan deze pagina.

Wil je deze handleiding met andere gebruikers bespreken, laat dan vooral een bericht achter onder 'Reacties'.

Heb je ook een goed idee?

Stuur jouw idee in! Met genoeg stemmen komt jouw idee op onze wishlist!

Heeft dit artikel je geholpen?

Maak een account aan of log in om een beoordeling achter te laten.

Reacties

Maak een account aan of log in om een reactie te plaatsen.

Kom je er niet uit?

Ontvang persoonlijke hulp van onze supporters

Neem contact op