Postfix (algemeen)

Uit De Vliegende Brigade
Ga naar: navigatie, zoeken

Postfix is de standaard mailserver voor Ubuntu. Een standaard Postfix-installatie bestaat doorgaans uit de volgende onderdelen:

  • Postfix - Mail Transfer Agent (MTA) oftewel SMTP-server - Het eigenlijke verkeer van mailserver-tot-mailserver
  • Dovecot - IMAP/POP3-server, oftewel message-store access - Interactie tussen mailserver en mailclient
  • SASL - Simple Authentication and Security Layer - Middleware voor authenticatie & beveiliging
  • Squirrelmail - Webmail-email-client & IMAP-proxy-server - Handig voor testen.

Emailadres toevoegen

Postfix

Voeg het domein toe aan vhosts:

sudo vim /etc/postfix/vhosts

Voeg de e-mailadressen toe aan vmaps:

sudo vim /etc/postfix/vmaps

Voorbeeld van een e-mailadres en een alias:

info@example.com example.com/info/
alias@example.com example.com/info/

Update de vmaps lookup-table:

sudo postmap /etc/postfix/vmaps

Dovecot

Voeg per emailadres een regel toe aan /etc/dovecot/users. Voorbeeld:

info@example.com::5000:5000::/home/vmail/example.com/info/:/bin/false::
info@example.nl::5000:5000::/home/vmail/example.nl/info/:/bin/false::
info@example.nu::5000:5000::/home/vmail/example.nu/info/:/bin/false::

Configuratie - Overzicht

  • /etc/postfix/master.cf Bevat algemene instellingen zoals privileges. Onder operationele omstandigheden heb ik dit bestand waarschijnlijk zelden of nooit nodig
  • /etc/postfix/main.cf Is het centrale configuratiebestand.
  • postmap is een commando voor Postfix lookup table management: Hiermee worden oa. db-bestanden bijgewerkt of uitgelezen
  • Postfix maakt gebruik van virtuele mailboxen, om op één server meerdere domeinen te kunnen hosten
  • Het gebruikersaccount vmail wordt gebruikt voor deze virtuele mailboxen
  • /etc/postfix/vhosts bevat de lijst van domeinnamen waarvan de mailboxen door Postfix worden beheerd
  • /etc/postfix/vmaps bevat de lijst van emailadressen.

Emailadressen & vhosts verwijderen

  • Het script deletemailuser (zie appendix) geeft geen foutmeldingen, en de betreffende emailadressen verdwijnen daadwerkelijk uit bestand vmaps, dus dat ziet er hoopvol uit
  • bestand vhosts blijft onaangeroerd door dit script. Ook als je het laatste emailadres van een domein verwijderd, blijft de naam staan in dit bestand. Op zich logisch. In mijn ervaring kun je een domeinnaam handmatig verwijderen uit bestand vhosts.

Status

sudo postfix status

vertelt je hoe Postfix er aan toe is.

Casus sep. 2015: postmap: warning: /etc/postfix/vmaps.db: duplicate entry

  • vmaps.db is een binair bestand en kun je niet zomaar lezen. Waarschijnlijk gebruik je hier het commando postmap voor
  • vmaps bevat sommige emaildressen dubbel.

Acties

  • sudo vi vmaps: Dubbele emailadressen verwijderd met een editor
  • sudo postfix reload: Herbouwt dit relevante databases? Geen idee, maar de foutmeldingen zijn verdwenen.

Casus sep. 2015: Virtuele host verwijderen

  • Hoe verwijder je domeinnamen waarvan de email niet meer hier gehost wordt?
  • De lijst met hosts in vhosts kun je handmatig aanpassen. Maar is dat wijsheid?

Acties

  • vhosts handmatig aangepast
  • sudo postfix reload - Alles lijkt goed te gaan

Vraagstukken

  • Hoe verwijder ik een compleet virtueel domein? Eerst alle emailadressen verwijderen en dan het domein, of in één keer het domein?
  • Hoe zorg ik ervoor dat een Apache virtuele host samenwerkt met de bijbehorende Postmaster virtuele host, of gaat dat niet? In de praktijk wordt email vaak verstuurd uit naam van een webserver, en niet uit naam van een domein dat op die webserver draait
  • Monitoring: Hoe kan ik zien hoe actief er gemailed wordt, en of een domein wordt misbruikt? Bv. een gekraakte website die mail uitstuurt?
  • Hoe vervang ik addmailusetr voor iets niet-interactiefs?
  • Hoe vervang ik deletemailusetr voor iets niet-interactiefs?
  • Hoe doe ik spamfiltering?
  • Hoe doe ik beveiliging?

Bronnen

Appendix: Script addmailuser

Script uit een forum-posting:

#!/bin/sh
if [ ! $# = 1 ]
 then
  echo "Gebruik: $0 gebruikersnaam@domeinnaam"
  exit 1
 else
  user=`echo "$1" | cut -f1 -d "@"`
  domain=`echo "$1" | cut -s -f2 -d "@"`
  if [ -x $domain ]
   then
    echo "Geen domeinnaam opgegeven\nGebruik: $0 gebruikersnaam@domeinnaam"
    exit 2
  fi
  echo "Gebruiker toevoegen $user@$domain in /etc/dovecot/users"
  echo "$user@$domain::5000:5000::/home/vmail/$domain/$user/:/bin/false::" >> /etc/dovecot/users

  echo "Aanmaken van de maildirectory /home/vmail/$domain/$user"

  if [ ! -x /home/vmail/$domain ]
   then
    mkdir /home/vmail/$domain
    chown 5000:5000 /home/vmail/$domain
    chmod 700 /home/vmail/$domain
  fi
  /usr/bin/maildirmake.dovecot /home/vmail/$domain/$user 5000:5000

  /usr/bin/maildirmake.dovecot /home/vmail/$domain/$user/.Drafts 5000:5000
  /usr/bin/maildirmake.dovecot /home/vmail/$domain/$user/.Sent 5000:5000
  /usr/bin/maildirmake.dovecot /home/vmail/$domain/$user/.Junk 5000:5000
  /usr/bin/maildirmake.dovecot /home/vmail/$domain/$user/.Trash 5000:5000

  echo "Gebruiker toevoegen aan /etc/postfix/vmaps"
  echo $1  $domain/$user/ >> /etc/postfix/vmaps
  postmap /etc/postfix/vmaps
  postfix reload
fi
echo "\nVoer een wachtwoord in voor de mailbox"
#SWAP THE FOLLOWING passwd LINES IF USING A UBUNTU VERSION PRIOR TO 12.04
#passwd=`dovecotpw`
passwd=`doveadm pw -u $user`
echo "Wachtwoord instellen voor $user@$domain in /etc/dovecot/passwd"
if [ ! -x /etc/dovecot/passwd ]
 then
  touch /etc/dovecot/passwd
  chmod 640 /etc/dovecot/passwd
fi
echo  "$user@$domain:$passwd" >> /etc/dovecot/passwd

exit 0

En dit is wat dat script doet:

  • Per emailadres wordt een regel toegevoegd aan /etc/dovecot/users - Nix complex
  • Per emailadres wordt een map met submappen aangemaakt onder /home/vmail
  • Wachtwoorden worden CRAM-MD5-gehashed opgeslagen in /etc/dovecot/passwd

Appendix: Script deletemailuser

#!/bin/bash
if [ ! $# = 1 ]
 then
  echo -e "Gebruik het volgende: $0 gebruikersnaam@jouwdomein"
  exit 1
 else
  user=`echo "$1" | cut -f1 -d "@"`
  domain=`echo "$1" | cut -s -f2 -d "@"`
  if [ -x $domain ]
   then
    echo -e "Geen domein ingevoerd\nGebruik: $0 gebruikersnaam@jouwdomein: "
    exit 2
  fi
fi
read -n 1 -p "Verwijder $user@$domain van de server? [Y/N]? "
echo
case $REPLY in
 y | Y)
  new_users=`grep -v $user@$domain /etc/dovecot/users`
  new_passwd=`grep -v $user@$domain /etc/dovecot/passwd`
  new_vmaps=`grep -v $user@$domain /etc/postfix/vmaps`
  echo "Verwijder $user@$domain van /etc/dovecot/users"
  echo "$new_users" > /etc/dovecot/users
  echo "Verwijder $user@$domain van /etc/dovecot/passwd"
  echo "$new_passwd" > /etc/dovecot/passwd
  echo "Verwijder $user@$domain van /etc/postfix/vmaps"
  echo "$new_vmaps" > /etc/postfix/vmaps
  postmap /etc/postfix/vmaps
  postfix reload
  read -n1 -p "Verwijder alle bestanden in /home/vmail/$domain/$user? [Y/N]? " DELETE
  echo
  case $DELETE in
   y | Y)
    echo "Verwijder bestanden in /home/vmail/$domain/$user"
    rm -fr /home/vmail/$domain/$user
   ;;
   * )
    echo "Bestanden niet verwijderd in /home/vmail/$domain/$user"
   ;;
  esac
 ;;
 * )
  echo "Afsluiten..."
 ;;
esac