Tag Archives: dovecot

Virtual hosting met Postfix en Dovecot

Mijn mailserver is nodig aan vervanging toe en zoals ook voor mijn andere machines geldt, wordt ook deze voorzien van Centos in verband mijn aanloop naar het RHCA zijn.

In de nieuwe setup wilde ik geen gebruik meer maken van LDAP, dat heb ik jaren gedaan, maar gewoon simpel van configuratie bestanden, daar heb ik met mijn paar domeintjes ruim voldoende aan. De uiteindelijke aflevering van de email in de juiste box, laat ik over aan het ‘deliver’ programma van Dovecot, zodat ik in de toekomst ook de filtering daarvan kan gaan gebruiken.

Postfix

De wijzigingen (toevoegingen in dit geval) aan /etc/postfix/main.cf zijn minimaal:

1 virtual_minimum_uid = 500
2 virtual_uid_maps = static:500
3 virtual_gid_maps = static:500
4 virtual_mailbox_domains = hash:/etc/postfix/vdomains
5 virtual_transport = dovecot:
6 transport_maps = hash:/etc/postfix/transport
7 virtual_mailbox_maps = hash:/etc/postfix/vmailbox
8 virtual_alias_maps = hash:/etc/postfix/virtual

Op regel 1 zie je virtual_minimum_uid staan. Dit is fallback methode van Postfix, mocht er ergens een fout gemaakt zijn, dan zal er nooit een lager UID dan 500 gebruikt worden.

Regel 2 en 3 (virtual_uid_maps, virtual_gid_maps) geven aan hoe de mapping van de UID en GID informatie moet geschieden. Omdat ik gebruik maak van virtual hosting en dus de gebruikers geen entry in /etc/passwd hebben, dienen we postfix te vertellen welk UID en GID we willen gebruiken. Ik maak gebruik van UID en GID 500, welke ik koppel aan de gebruiker vmail. Deze gebruiker dient ook aangemaakt te worden:

groupadd -g 500 vmail
adduser -c 'Virtual Mail User' -d /var/vmail -M -g 500 -u 500 -s /sbin/nologin vmail

Met regel 4 (virtual_mailbox_domains) geef ik aan welke domeinen ik als virtueel beschouw. Ik neem hier alle domeinen in op, ook degene waarvoor ik alleen maar backup MX ben en via virtual_transport (regel 5) vertel ik Postfix welke manier van aflevering (transport) ik voor deze domeinen wil. Met transport_maps (regel 6) kan in de default waarde die gezet is met virtual_transport overrulen, dat gebruik ik voor de domeinen waarvoor ik MX backup ben.

De optie virtual_mailbox_maps op regel 7 koppelt een email adres aan een mailbox (directory of bestand) op het systeem. Normaal gesproken vertel je Postfix hiermee in welke directory er geschreven dient te worden, maar aangezien ik het programma deliver van Dovecot gebruik, hoef ik hierin alleen maar de email adressen te specificeren. Het tweede veld verwacht Postfix wel, dus daar kunnen we dummy info plaatsen.

Met virtual_alias_maps ( regel 8 ) koppel je een email adres aan een andere. Postfix geeft aan dat je hier nooit een wildcard domein in op moet nemen, uiteraard vanwege spam redenen, ik gebruik dat voor 1 van mijn domeinen wel, maar daar heb ik dan ook goede redenen voor.

De hash tables die aangemaakt dienen te worden, zie je hieronder staan. Waar ‘dummy’ staat, verwacht Postfix informatie die in deze situatie niet nodig is. Vergeet niet om na iedere wijziging een ‘postmap $bestandsnaam’ te doen.

/etc/postfix/vdomains
domain1 dummy
domain2 dummy

/etc/postfix/transport
friends_domain.nl relay
.friends_domain.nl relay

/etc/postfix/vmailbox
user1@domain1.nl dummy
user2@domain1.nl dummy

/etc/postfix/virtual
alias1@domain1.nl address1@domain1.nl
alias2@domain1.nl address1@domain1.nl, address2@domain1.nl
@domain2.nl address1@domain1.nl

Verschillende keren heb ik in bovenstaande tekst het programma deliver genoemd van Dovecot. Postfix kent deze standaard niet als LDA (local delivery agent), daarvoor moet aan /etc/postfix/master.cf het volgende worden toegevoegd:

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

Dovecot

De Dovecot configuratie zoals ik hem op dit moment gebruik is alleen voor het afleveren van de email in de juiste mailbox, vandaar dat /etc/dovecot/dovecot.conf er nog minimaal uitziet. In een later stadium ga ik hier onder andere nog SSL aan toevoegen, zoals gezegd, dat heb ik nu nog niet nodig.

ssl = no
protocols = imap
mail_location = maildir:/var/vmail/domains/%d/%n
service auth {
unix_listener auth-userdb {
mode = 0600
user = vmail
group = vmail
}
}
passdb {
driver = passwd-file
args = /etc/dovecot/imapusers
}
userdb {
driver = static
args = uid=vmail gid=vmail home=/var/vmail/domains/%d/%n
}

In het bestand /etc/dovecot/imapusers staan de gebruikers met hun wachtwoord. Het is mogelijk om daarin mee informatie zoals GECOS en dergelijk op te nemen, maar ook hier geldt weer dat ik dat in mijn situatie niet nodig heb.

/etc/dovecot/imapusers
user1@domain1.nl:{DIGEST-MD5}0000aa0000aa0a000aa0a000aa00aa0a
user2@domain1.nl:{DIGEST-MD5}1111bb1111bb1b111bb1b111bb11bb1b

Selinux

Om Dovecot’s deliver te mogen laten schrijven in /var/vmail/, moet de Selinux verteld worden wat de juiste context is voor /var/vmail.

/usr/sbin/semanage fcontext -a -t mail_spool_t '/var/vmail(/.*)?'

Hierna is een restorecon -R /var/vmail nodig om een en ander juist te zetten. Mocht je ooit zelf in deze directory iets aanpassen, herhaal dan het restorecon commando.

Dovecot met LDAP (jamm) en SSL (imaps)

Ik gebruik al langere tijd FreeBSD voor al mijn thuis servers. Echter zakelijk kom ik FreeBSD niet zo vaak tegen, echter Red Hat Enterprise Linux en aanverwanten wel. Vorig jaar heb ik besloten om mezelf te gaan certificeren voor Red Hat en heb RHCE gehaald. Nu ben ik voorzichtig aan het kijken om misschien zelfs voor RHCA te gaan.

Om nog vaker met RHEL systemen te werken, worden steeds meer van mijn FreeBSD machines vervangen door Centos systemen. Binnenkort zal mijn huidige FreeBSD mailserver daarom ook vervangen worden door een Centos systeem. Ter voorbereiding daarop heb ik alvast uitgezocht hoe ik Dovecot (imaps) laat samenwerken met mijn huidige mailstorage omgeving, waarbij authenticatie gegevens in LDAP staan en ik gebruik heb gemaakt van het Jamm schema.

Voor IMAPS maak ik gebruik van certificaten die gesigned zijn door cacert.org. Deze Certificate Authority werkt met een methode ‘Web of trust’ die soortgelijk is aan de methode waarop bijvoorbeeld PGP/GPG key signing werkt. Uiteraard kun je er ook voor kiezen om je certificaten van een andere partij te betrekken of te werken met ‘self signed’ certificaten.

Voordat we aan de slag kunnen, moeten er eerst wat packages geïnstalleerd worden:

sudo yum -y install dovecot openssl

Voor het verkrijgen van een door CAcert gesigned certificaat, moet je een ‘signing request’ (CSR) aanmaken. Een CSR maak je aan voor een door jezelf gegeneerde RSA private key. Normaal gesproken moet je dus met het openssl commando eerst een RSA KEY aanmaken en dan een CSR. Dit is allemaal best wel lastig, gelukkig is het bij RHEL systemen erg simpel gemaakt:

cd /etc/pki/tls/certs
make dovecot.csr

(Vul bij CommonName de volledige naam (fqdn) in van jouw systeem, dus bijvoorbeeld: imapserver.example.com)

Ga hierna naar https://secure.cacert.org/account.php?id=10 en plak de inhoud van dovecot.csr in het formulier. Laat het certificaat type op Class 3 staan. Na wat klikken komt er uiteindelijk een prachtig gesigned certificaat, plak de inhoudt hiervan in dovecot.crt. Je krijgt ook een email van CAcert met de link naar jouw nieuwe certificaat. Je hebt ook het Class 3 root certificaat nodig van CAcert. download deze van http://www.cacert.org/certs/class3.crt

Vanuit de Dovecot configuratie file gaan we straks verwijzen naar deze 3 bestanden, zet deze op de juiste plaats, met passende permissies:

install -o root -g root -m 644 class3.crt /etc/pki/tls/certs/cacert-class3.crt
install -o root -g root -m 644 dovecot.crt /etc/pki/dovecot/certs/dovecot.crt
install -o root -g root -m 644 dovecot.key /etc/pki/dovecot/private/dovecot.key

Plaats het volgende in /etc/dovecot.conf. Maak eerst een backup!

auth_verbose = yes
protocols = imap imaps
base_dir = /var/run/dovecot/

ssl_cert_file = /etc/pki/dovecot/certs/dovecot.crt
ssl_key_file = /etc/pki/dovecot/private/dovecot.key
ssl_ca_file = /etc/pki/tls/certs/cacert-class3.crt

shutdown_clients = yes
mail_location = maildir:/var/vmail/domains/%d/%n

auth default {
mechanisms = PLAIN LOGIN

userdb static {
args = uid=500 gid=500
}

passdb ldap {
args = /etc/dovecot-ldap.conf
}

userdb ldap {
args = /etc/dovecot-ldap.conf
}

socket listen {
master {
path = /var/run/dovecot/auth-master
mode = 0600
user = vmail
group = vmail
}
}

user = vmail
}

Zorg er voor dat een en ander conform jouw setup is. Denk hierbij vooral aan de user (vmail) en het bijbehorende UID (500) en de locatie van de imap data (mail_location). Bij mij staat de imap dat in /var/vmail/domains/$domein/$user, bijvoorbeeld /var/vmail/domains/example.com/pietjepuk. De loginnaam van deze voorbeeld gebruiker is dan pietjepuk@example.com.

In mail_location worden enkele Dovecot specifieke variabelen gebruikt. De betekenis er van en andere mogelijkheden, vind je op http://wiki.dovecot.org/Variables

Plaats het volgende in /etc/dovecot-ldap.conf. Als het goed is, bestond dit bestand nog niet. Anders maak je uiteraard eerst een backup.

hosts = $ldapserver
auth_bind = yes
auth_bind_userdn = mail=%u,vd=%d,o=hosting,dc=example,dc=com
ldap_version = 3
base = o=hosting,dc=example,dc=com
dn = cn=phamm,o=hosting,dc=example,dc=com
dnpass = $password
deref = never
scope = subtree
user_attrs = mailbox=mail=maildir:/var/vmail/domains/%$
user_filter = (&(objectClass=VirtualMailAccount)(accountActive=TRUE)(mail=%u))
pass_attrs = mail,userPassword
pass_filter = (&(objectClass=VirtualMailAccount)(accountActive=TRUE)(mail=%u))
default_pass_scheme = MD5
user_attrs = quota=quota=maildir:storage=%$B
user_global_uid = 500
user_global_gid = 500

Ook hier geldt weer, pas alles aan naar jouw eigen situatie.

Alle instellingen zijn nu gedaan. Start Dovecot en testen maar!

chkconfig dovecot on
service dovecot restart

Bij het starten van Dovecot, wordt er gevraagd om de passphrase van je SSL key (dovecot.key). Mocht je dit niet willen, dan dien je de passphrase te verwijderen van je key. Dat doe je als volgt:

openssl rsa -in dovecot.key -out dovecot.key