In het eerste deel van deze workshop las je al hoe je met Postfix en Dovecot een eenvoudige mailserver opzet. In dit deel breiden we Dovecot uit met ondersteuning voor quota, compressie, deduplicatie, server-side filtering, commandline processing en gedeelde mappen. Tot slot installeren we nog een webmail client om vanaf elke pc onze e-mails te lezen. 

Quota

Quota zijn onmisbaar om te voorkomen dat één gebruiker met alle beschikbare opslagruimte aan de haal gaat. Niet iedereen beseft namelijk dat de opslagruimte van een mailserver beperkt is. Sommige mensen gebruiken hun mailbox alsof het een fileserver is en dat zorgt natuurlijk voor problemen. Dovecot ondersteunt twee types quota: aantal berichten (MESSAGE) en gebruikte opslagruimte (STORAGE). In de meeste gevallen is een beperking op aantal berichten weinig zinvol, aangezien de berichtgrootte enorm varieert. Dovecot bewaart de ingestelde quota samen met de overige gebruikersinformatie in een MySQL-database. In deel 1 van deze artikelenreeks hadden we daarvoor reeds het veld ‘quota_limit_bytes’ in de ‘users’-tabel voorzien. Het bestand /etc/dovecot/dovecot-sql.conf.ext bevat ook al de benodigde configuratie om dat veld in te lezen in Dovecot. 

Maar Dovecot moet voor elke gebruiker ook ergens de huidige waarde van de MESSAGE- en STORAGE-quota bewaren. Daarvoor maken we een tweede tabel in aan in de ‘dovecot’-database, genaamd ‘quota’ (zie afbeelding 1). We stellen ook meteen een limiet van 1GB in voor de gebruiker ‘filip@candf.be’. In afbeelding 2 zie je de benodigde wijzigingen aan Dovecot’s configuratiebestanden om quota te activeren met de quota-tabel als backend. Vergeet niet Dovecot te herstarten om de wijzigingen te activeren. Het commando ‘doveadm quota get -A’ toont je nu een beknopt overzicht van de ingestelde quota én de huidige waardes (zowel absoluut als procentueel) voor alle gebruikers. Wil je de quota testen, verlaag dan tijdelijk de STORAGE-quota van één gebruiker tot bijvoorbeeld 5MB. Probeer daarna een attachment van 5MB te versturen naar die mailbox. De verzender krijgt dan een foutmelding dat de mail niet afgeleverd kan worden, omdat de mailbox over quota is.

 Uiteraard wil je dergelijke situaties zoveel mogelijk vermijden. We moeten onze mailgebruikers dus tijdig informeren wanneer hun mailbox over quota dreigt te geraken. Voeg daarom de opties uit afbeelding 3 toe aan /etc/dovecot/conf.d/90-quota.conf om de quota-warning-plugin te activeren. Die plugin heeft een extern script nodig om een actie uit te voeren in geval van problemen: in ons voorbeeld is dit /opt/local/bin/dovecot_warnquota.sh (zie afbeelding 4). Met dat script versturen we een e-mail naar een gebruiker zodra zijn mailbox 95% of 98% van zijn ingesteld quotum bereikt heeft. Daarvoor gebruiken we Dovecot’s Local Delivery Agent (/usr/lib/dovecot/dovecot-lda) met uitgeschakelde quota-plugin in plaats van bijvoorbeeld mailx. Alleen op die manier zijn we zeker dat de waarschuwingsmail altijd aankomt, zelfs als de mailbox al op 100% van zijn quotum staat. 

Compressie

Met quota verdeel je de beschikbare opslagruimte over de verschillende gebruikers. Maar dat neemt niet weg dat opslagruimte geld kost en je er dus best spaarzaam mee omgaat. Met compressie reduceer je de benodigde opslagruimte, al gaat dat wel ten koste van enige snelheid. Maar op een mailserver met een beperkt aantal gebruikers zal je dat nauwelijks merken. Dovecot ondersteunt compressie via de zlib-plugin, die je activeert in de bestanden 10-mail.conf en 20-imap.conf (zie afbeelding 5). Nu is Dovecot in staat om reeds gecomprimeerde mails in mailbox te lezen, maar nieuwe mails worden nog steeds ongecomprimeerd bewaard. Wil je inkomende mails meteen comprimeren, voeg dan ook de zlib_save- en zlib_save_level-optie toe. Let op dat het activeren van die opties de bestaande e-mails in je mailbox niet comprimeert! Gebruik je dbox als mailbox-formaat (zoals in deze workshop), dan moet je al jouw e-mails naar een andere mailbox kopiëren en nadien terug importeren om ze te comprimeren. Dat klinkt misschien omslachtig, maar je moest wellicht toch al je oudere e-mails van bijvoorbeeld Gmail importeren. Doe je dat pas na het instellen van de zlib_save-optie, dan worden ze meteen gecomprimeerd!

 

Deduplicatie

Hoewel je met compressie ongetwijfeld schijfruimte zal besparen, valt het resultaat in de praktijk wel eens tegen. De e-mails – zowel plain text als HTML – worden erg goed gecomprimeerd, maar het zijn vooral de attachments die veel ruimte innemen. En die zijn vaak al gecomprimeerd: denk maar aan JPEG-, MP3- of PDF-bestanden. Daar valt dus weinig winst te boeken door compressie in te schakelen. Maar Dovecot beschikt nog over een veel interessantere feature dan compressie, namelijk deduplicatie. Met deduplicatie worden meerdere kopieën van hetzelfde attachment slechts eenmaal bewaard op het onderliggende filesystem. Stuur je bijvoorbeeld een PDF-bestand van 5MB naar 10 verschillende gebruikers op jouw mail-server, dan neemt dit effectief slechts 5MB in beslag op het systeem. Zonder deduplicatie zou dat maar liefst 55MB zijn (één kopie in de Inbox van elke bestemming plus één kopie in jouw ‘Sent Items’)! Dovecot’s deduplicatie wordt ook wel ‘Single Instance Storage’ genoemd, oftewel SIS.

Om SIS in te schakelen, maak je eerst een aparte directory aan voor de attachments. Aangezien onze e-mails onder /var/vmail/<domain> staan, plaatsen we de attachments in /var/vmail/attachments. (De deduplicatie werkt immers ook voor e-mailgebruikers uit verschillende domeinen.) Vervolgens voegen we de drie configuratieregels uit afbeelding 6 toe aan /etc/dovecot/conf.d/10-mail.conf en herstarten we Dovecot. Met de optie mail_attachment_min_size stel je een minimumgrootte in voor attachments die gededupliceerd moeten worden. Het heeft namelijk weinig zin om attachments van enkele tientallen kilobytes afzonderlijk te bewaren. Net zoals bij compressie hebben de wijzigingen enkel effect op nieuwe mails. Ook deduplicatie schakel je dus het beste in vóór je een externe mailbox migreert naar jouw eigen server. Ben je benieuwd hoeveel schijfruimte je precies hebt bespaard met compressie en deduplicatie? Vergelijk dan de quota-informatie voor alle gebruikers met de gebruikte schijfruimte onder /var/vmail. In afbeelding 7 zie je een voorbeeld waarin 2329MB aan e-mails bewaard wordt in 1415MB: dat is een winst van ongeveer 40%. Dit voorbeeld komt van een mailserver met slechts twee gebruikers: op systemen met meerdere gebruikers is het effect van deduplicatie wellicht nog groter.

Server-side filtering

Heb je een erg groot e-mailarchief, dan is je mailbox waarschijnlijk onderverdeeld in verschillende submappen. Mail clients, zoals Thunderbird, bieden de mogelijkheid om inkomende e-mail op basis van verschillende criteria (zoals afzender of onderwerp) meteen in de juiste submap te plaatsen. Dergelijke filters zijn best praktisch, maar er kleeft wel één nadeel aan: ze werken enkel in één specifieke mail client. Check je even je e-mail op je smartphone of via een webmail-client, dan worden de filters niet uitgevoerd. De oplossing: server-side filtering, zodat de filter reeds uitgevoerd wordt bij het afleveren van de e-mail in je mailbox. 

Er bestaat een specifieke programmeertaal voor server-side mail filtering, namelijk Sieve. Je definieert dus mail filters door Sieve-scriptbestanden op de mail server aan te maken. Aangezien de meeste mailgebruikers geen shell-toegang hebben tot de mailserver, kan je ook scripts uploaden via het managesieve-protocol. Dovecot ondersteunt zowel Sieve-scripts als het managesieve-protocol zodra je de pakketten dovecot-sieve en dovecot-managesieved installeert. In afbeelding 8 zie je een standaardconfiguratie voor de sieve-plugin en managesieve-service. Verderop lees je hoe je via Roundcube Sieve-filters aanmaakt.

 

Commandline processing

 

We hebben het doveadm-commando reeds gebruikt om de quota na te kijken, maar dit commando biedt ook nog andere mogelijkheden. Vooral interessant is de expunge-optie, waarmee je e-mails kan verwijderen op basis van verschillende criteria. De lijst van ondersteunde criteria is behoorlijk lang: bekijk maar eens de manpage van doveadm-search-query! We beperken ons hier tot enkele voorbeelden (zie afbeelding 9):

 

·        e-mails ouder dan 2 weken verwijderen uit de Trash van alle mailboxen van een bepaald domein;

 

·        gelezen e-mails ouder dan 2 weken verwijderen uit de submap ‘News’ van één specifieke gebruiker;

 

·        e-mails verwijderen uit een bepaalde mailbox met een onderwerp dat start met ‘My Backup on’ of ‘Cron’ en die ouder zijn dan 13 weken.

Bovenstaande commando’s voer je bijvoorbeeld één keer per dag uit vanuit de crontab van de root-gebruiker. Vergeet niet om je zoekopdrachten te testen voordat je het expunge-commando uitvoert. Vervang je ‘expunge’ door ‘search’, dan geeft doveadm een (nietszeggende) lijst van mailbox ID’s en mail ID’s terug die aan de zoekopdracht voldoen. Wil je snel de afzender en het onderwerp controleren van die e-mails, gebruik dan het laatste commando uit afbeelding 9.

 

Gedeelde mappen

Handig is ook de mogelijkheid om bepaalde mappen van jouw mailbox te delen met andere gebruikers op de mailserver. In combinatie met server-side filtering is dit een erg krachtig instrument. Stel dat je alle e-mails met een bepaald onderwerp of van bepaalde afzenders wilt delen met een andere gebruiker. Maak dan een submap aan in je Inbox, samen met een filter om de gewenste mails automatisch naar die submap te verplaatsen. Met Dovecot’s acl-plugin bepaal je vervolgens wie toegang krijgt tot die map. Die plugin activeer je met de code uit afbeelding 10. Vervang ook de ‘namespace inbox’-definitie uit 10-mail.conf met de configuratie in afbeelding 11. Zonder die wijziging toont Dovecot immers niet de met jouw gedeelde mappen in jouw mailbox. Dovecot bewaart de eigenlijke ACL’s (wie mag welke map benaderen?) in tekstbestanden onder /var/vmail. Je kan die tekstbestanden aanpassen om ACL’s te definiëren, maar handig is dat niet. Ondersteunt jouw mail client de IMAP-commando’s GETACL, SETACL en DELETEACL? Dan pas je de ACL’s gewoon aan via een grafische interface, wat veel gemakkelijker is.

Webmail

 

We hebben intussen een behoorlijk functionele IMAP-server met ondersteuning voor quota, compressie, deduplicatie, server-side filtering en gedeelde mappen. Het enige wat nog ontbreekt, is een goede webmail client. Onze voorkeur gaat uit naar Roundcube, dat een gebruiksvriendelijke interface koppelt aan een uitgebreide featureset én ondersteuning voor plugins. In de meeste distributies vind je Roundcube terug in de repositories, al gaat het vaak om een iets oudere versie. Wij raden je dan ook aan om het .tar.gz-bestand van de laatste versie van het “Complete”-package te downloaden op https://roundcube.net/download en dat manueel te installeren. De precieze installatie-instructies vind je op http://bit.ly/1IqnVj4. Vergeet niet dat je bij een manuele installatie ook zélf instaat voor het installeren van security updates. Daarvoor schrijf je je het beste in op de roundcube-announce newsletter (http://bit.ly/1DE67Kx). Zo blijf je steeds op de hoogte van nieuwe releases en security vulnerabilities. Vind je dat allemaal teveel werk, dan blijf je beter bij de versie van je package manager.

 

Configuratie

 

In Roundcube’s loginscherm moet je je gebruikersnaam, je wachtwoord en de mailserver invoeren om in te loggen. Maar je wilt toch niet dat andere mensen jouw Roundcube-installatie gebruiken om in te loggen op hun eigen mailserver? Open daarom de Roundcube-configuratie in /var/www/roundcube/config/config.inc.php (de precieze locatie hangt af van de gekozen installatiemethode) en vul ‘localhost’ in bij de default_host-optie. Ook in Roundcube is de ACL- en filterfunctionaliteit via een optionele plugin beschikbaar. Controleer eerst of de plugins ‘acl’ en ‘managesieve’ geïnstalleerd zijn in /var/www/roundcube/plugins. Heb je Roundcube via je package manager geïnstalleerd, dan zitten die mogelijk in een afzonderlijk pakket (onder Debian is dit roundcube-plugins). Vervolgens activeer je de plugins in config.inc.php. Tot slot configureer je dezelfde host en poort in Roundcube’s plugin zoals je eerder in Dovecot gedaan hebt (zie afbeelding 12, vergelijk met afbeelding 8).

 Mail lezen

 

Roundcube is nu helemaal klaar voor gebruik! Na het inloggen krijg je links een overzicht van de mappen in je mailbox en rechtsboven een lijst van e-mails in de geselecteerde map. Eenmaal klikken op een mail toont de inhoud ervan rechtsonder, dubbelklikken opent de mail in een groter venster. Verder zijn er nog een aantal uitklapmenu’s om mails te selecteren of te filteren op status (ongelezen, onbeantwoord, enz.). De zoekfunctie vind je rechtsboven: klik op het vergrootglas om het zoekbereik (zoals de huidige map of alle mappen) en de zoekvelden (onderwerp, afzender, …) in te stellen. Heb je quota ingesteld, dan toont Roundcube linksonder het percentage van jouw quotum dat je in gebruik hebt (bijvoorbeeld 93%). Blijf even met je muiscursor boven dit percentage hangen om de exacte waarden te zien (bijvoorbeeld 885MB van de 950MB gebruikt). In de zwarte navigatiebalk bovenaan zie je nog twee andere tabs: “Adresboek” en “Instellingen”. Via de eerste tab beheer je je contactpersonen, die je al dan niet verder groepeert in groepen. Heb je al een adresboek gemaakt in een andere applicatie? Dan kan je dit in vCard of .csv-formaat importeren in Roundcube. 

 

ACL’s en filters

 

Het tabblad “Instellingen” bevat een groot aantal opties om Roundcube aan je wensen aan te passen. We laten het aan jou over om die nog verder te verkennen. We gaan wel nog even in op de twee Roundcube-plugins die we ingeschakeld hadden. ACL’s beheer je via het onderdeel “Mappen”. Klik op een map in de lijst links en scroll dan naar beneden in het venster rechts. Onderaan zie je het onderdeel “Delen”, met daaronder een ‘+’-knopje om een ACL toe te voegen. Elke ACL is een combinatie van een gebruiker (één specifieke gebruiker of alle gebruikers) en bepaalde rechten (lezen, schrijven of verwijderen). Per map kan je zoveel ACL’s instellen als je wilt. IMAP ACL’s zijn in feite nog iets complexer dan Roundcube laat uitschijnen. Via de optie “Geavanceerde modus” (onder het tandwielicoontje) toont Roundcube de onderliggende IMAP ACL’s. Op die manier kan je ook minder gangbare ACL-configuraties definiëren vanuit Roundcube.

In het onderdeel “Filters” beheer je tot slot je Sieve-filters. Roundcube ondersteunt verschillende filtersets: normaal gezien is er reeds een set “managesieve” gedefinieerd. In die set kan je nu verschillende filters toevoegen, die elk een eigen actie uitvoeren. Filtercriteria zijn onder andere afzender, ontvanger, onderwerp, grootte, datum of inhoud en acties zijn onder andere het bericht verplaatsen, kopiëren, doorsturen, verwijderen, automatisch beantwoorden of markeringen instellen.

Roundcube Next

 

Na tien jaar ontwikkeling is Roundcube erg stabiel én functioneel, maar écht vernieuwend is het nou ook niet meer. Om die reden hebben de ontwikkelaars het Rouncube Next project gestart. Het doel: Roundcube grotendeels vanaf scratch herschrijven met gebruik van de nieuwste technologieën. Dat is een klus van de lange adem, aangezien men intussen ook de huidige versie verder blijft ontwikkelen. Er is dan ook een crowdfunding campaign opgestart om extra ontwikkelaars te werven. Op http://bit.ly/1IgT340 lees je hier alles over.

Encryptie

We hopen dat je na het lezen van deze workshop zin hebt gekregen om je eigen mailserver te installeren. Onze voorbeeldsetup is prima geschikt voor persoonlijk of klein zakelijk gebruik. Maar dat betekent natuurlijk niet dat je onze configuratie klakkeloos moet overnemen. We raden je sterk aan om je verder te verdiepen in de configuratie van de verschillende componenten. De configuratiebestanden van zowel Postfix en Dovecot als Roundcube zijn erg goed gedocumenteerd. Het enige wat nog ontbreekt aan onze setup is TLS-encryptie. In Linux Magazine 5 van dit jaar, dat volledig aan security gewijd is, gaan we aan de slag met SSL-certificaten om Postfix, Dovecot én Roundcube nog beter te beveilige