Het gebruik van mobiel internet wordt steeds groter. Als je altijd en overal mail wilt versturen is het makkelijk om dit via een eigen SMTP server te doen. In de volgende handleiding zal ik een SMTP server opzetten, welke de gebruikersnaam en wachtwoord opzoekt in een MySQL database.

Ik ben begonnen met het installeren van een minimale Ubuntu 10.04 server. Hierbij installeer ik vim en openssh-server als extra programma’s, zoals ik eigenlijk altijd doe.

Na de installatie installeer ik de pakketten postfix, sasl2-bin en libpam-mysql.

apt-get intall postfix sasl2-bin libpam-mysql

Postfix is het mailprogramma. Via libpam-mysql kan ik PAM (Pluggable Authentication Modules) laten communiceren met een MySQL database. Het programma sasl2-bin zorgt voor de communicatie tussen postfix en PAM.

Binnen postfix zullen er een aantal aanpassingen gedaan moeten worden.

In main.cf moeten er twee regels toegevoegd worden.

main.cf:
smtpd_sender_restrictions = permit_sasl_authenticated,reject
smtpd_recipient_restrictions = permit_sasl_authenticated,reject

Verder verander ik ook altijd de regel mydestination, zodat daar alleen localhost staat.

mydestination = localhost, localhost.localdomain

In master.cf zorg ik ervoor dat postfix niet luistert op poort 25 en wel op poort 587. Over poort 25 wordt meestal email verstuurd, maar deze poort wordt steeds vaker geblokkeerd door providers. Ook vind ik dat alle inkomende email via poort 25 moet en verder niets. Aangezien we geen inkomende email hebben, heb ik deze poort uitgeschakeld.

master.cf:
#smtp      inet  n       -       -       -        -       smtpd
submission inet  n       -       -       -        -       smtpd
#  -o smtpd_tls_security_level=encrypt
   -o smtpd_sasl_auth_enable=yes
   -o smtpd_client_restrictions=permit_sasl_authenticated,reject
   -o milter_macro_daemon_name=ORIGINATING

submission wordt gebruikt voor poort 587. Verder geef ik als optie mee dat sasl gebruikt moet worden voor de authenticatie.

In de configuratie moet ik nog 1 bestand toevoegen, zodat authenticatie ook echt via sasl gaat. Dit is het bestand /etc/postfix/sasl/smtpd.conf.

smtpd.conf:
pwcheck_method: saslauthd
mech_list: plain login cram-md5 digest-md5
allow_plaintext: true

Verder moet het configuratie bestand voor sasl aangepast moeten worden, zodat deze gestart wordt.
Postfix wordt normaal gesproken in een chrooted omgeving gedraaid. Hierdoor is het voor postfix niet mogelijk om de socket van de sasl daemon te benaderen. Hiervoor zullen we de locatie van de socket moeten aanpassen, zodat deze in de chrooted omgeving van postfix uitkomt. Het configuratie bestand voor sasl staat in de /etc/default map en heeft de naam saslauthd.

saslauthd:
START=yes
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd"

De sasl daemon moet ook gestart worden en postfix moet nog toegang krijgen tot de sasl daemon.

service saslauthd start
adduser postfix sasl

Zoals gezegd stuurt sasl de authenticatie door naar PAM. De configuratie bestanden hiervoor staan in de map /etc/pam.d. Voor postfix maken we een nieuw bestand aan met de naam ‘smtp’ en de volgende 2 regels (ik heb een \ toegevoegd omdat ze hier niet op 1 regel konden).

smtp:
auth required pam_mysql.so user=<database gebruikersnaam> \
passwd=<database wachtwoord> host=<database server> \
db=<database naam> table=mailbox usercolumn=username \
passwdcolumn=password crypt=1
account sufficient pam_mysql.so user=<database gebruikersnaam> \
passwd=<database wachtwoord> host=<database server> \
db=<database naam> table=mailbox usercolumn=username \
passwdcolumn=password crypt=1

Als de server nu opnieuw opgestart is, kan er via telnet een verbinding naar toe gemaakt worden.

Om via telnet een email te sturen, is het mogelijk om dezelfde commando’s te geven als bij een normale SMTP verbinding, dus zonder authenticatie.
Wel zul je na het HELO of EHLO commando eerst de gebruikersnaam en het wachtwoord moeten sturen.

AUTH PLAIN <encypted string>

De gebruikersnaam en het wachtwoord worden in 1 string geëncrypt, dit is handmatig mogelijk via één van de volgende commandos.

perl -MMIME::Base64 -e 'print encode_base64("\0<gebruikersnaam>\0<wachtwoord>")'
php -r 'echo base64_encode("\0<gebruikersnaam>\0<wachtwoord>");'

Als er in de gebruikernaam een @ zit, dan moet deze geëscaped worden met een \.