Cyrus SASL
Op deze pagina ga ik proberen uit te leggen hoe ik Postfix (2.2.10) aan de praat heb gekregen met Cyrus SASL (de Cyrus SASL versie komt uit het default slackware package. Deze heeft standaard geen ondersteuning voor MySQL en dit is ook niet het doel van deze howto)
Postfix opnieuw Compilen
Om TLS en SASL ondersteuning in Postfix te krijgen moeten we deze opnieuw compilen. Omdat mijn postfix configuratie gebruik maakt van MySQL voor de user accounts ga ik ook mysql support inbakken:
make clean make -f Makefile.init makefiles \ 'CCARGS=-DUSE_TLS -DHAS_MYSQL -I/usr/include/mysql -DUSE_SASL_AUTH -I/usr/include/sasl -DUSE_CYRUS_SASL' \ 'AUXLIBS=-L/usr/lib/mysql -lmysqlclient -lz -lm -L/usr/lib/sasl2 -lsasl2 -lssl -lcrypto' make install
Ik ga er vanuit dat je reeds een werkende postfix installatie hebt en dus ga ik niet in op de verdere details van de postfix installatie
Configuratie Postfix
Ook hier ga ik ervanuit dat je reeds een werkende config hebt en dus alleen de aanvulling voor TLS en SASL nodig hebt.
De aanvulling van main.cf voor SASL:
smtpd_sasl_auth_enable = yes smtpd_sasl2_auth_enable = yes smtpd_sasl_security_options = noanonymous broken_sasl_auth_clients = yes smtpd_sasl_local_domain = smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination
Het is belangrijk dat de smtpd_sasl_local_domain leeg is! We zullen straks in moeten loggen met username@servername. Ik heb getest om dan servername als local_domain op te geven maar dit werkte niet. Als iemand hier een antwoord op heeft dan hoor ik het graag!
SASL zonder TLS heeft weinig nut en dus moet je ook onderstaand stuk toevoegen aan je config (doe je dat niet dan kan je toch SASL gebruiken maar dan zonder de encryptie).
De aanvulling voor main.cf voor TLS:
smtpd_use_tls = yes #smtpd_tls_auth_only = yes smtpd_tls_key_file = /etc/postfix/server.key smtpd_tls_cert_file = /etc/postfix/server.crt smtpd_tls_CAfile = /etc/postfix/cacert.pem smtpd_tls_loglevel = 3 smtpd_tls_received_header = yes smtpd_tls_session_cache_timeout = 3600s tls_random_source = dev:/dev/urandom
De certificaten moeten dan uiteraard wel in orde zijn. Deze kunnen we kopieren van de apache certificaten.
Config van SASL2
SASL moet ook geconfigureerd worden, in de configfile moet worden aangegeven waar de authorisatie gecontroleerd kan worden. In dit geval kiezen we voor saslauth-daemon.
Config /usr/local/lib/sasl2/smtpd.conf:
pwcheck_method: saslauthd mech_list: LOGIN PLAIN
Deze daemon moeten we dan starten met:
chmod +x /etc/rc.d/rc.saslauthd /etc/rc.d/rc.saslauthd start
Pas op: Op sommige installaties staat de sasl2 map in /usr/lib ipv /usr/local/lib, maak in dat geval een link aan:
ln -s /usr/lib/sasl2 /usr/local/lib/sasl2
Configuratie testen
Nu moeten we met telnet kunnen zien dat TLS en AUTH enabled zijn:
root@testbak:/# Telnet testserver 25
220 testserver ESMTP Postfix on testserver EHLO test 250-testserver 250-PIPELINING 250-SIZE 51200000 250-VRFY 250-ETRN 250-STARTTLS 250-AUTH CRAM-MD5 DIGEST-MD5 LOGIN PLAIN OTP 250-AUTH=CRAM-MD5 DIGEST-MD5 LOGIN PLAIN OTP 250 8BITMIME
Aanmaken users
Omdat we geen mysql kunnen gebruiken bij de standaard SASL moeten we even een aparte sasl user file maken, de commando's hiervoor zijn:
- saslpasswd2
- sasldblistusers2
Aanmaken testuser:
root@testserver:/# saslpasswd2 -c test Password: Again (for verification):
Zorgen dat postfix ook de db file kan lezen:
root@testserver:/# chmod 666 /etc/sasldb2
En tenslotte kunnen we kijken welke user er nu is aangemaakt:
root@testserver:/# sasldblistusers2 test@testserver: userPassword test@testserver: cmusaslsecretOTP
We moeten nu dus ook test@testserver als username gebruiken!!
Testen
TLS is een beetje lastig om na te bootsen dus zullen we dit niet gebruiken bij de telnet test. De AUTH PLAIN functie is wel vrij gemakkelijk na te bootsen door de username en password samen met base64 te encoderen:
<?php echo base64_encode("test@testserver\0test@testserver\0testpass"); ?>
leert ons dat de login string
dGVzdEB0ZXN0c2VydmVyAHRlc3RAdGVzdHNlcnZlcgB0ZXN0cGFzcw==
is
Het bash-commando:
echo "<?php=base64_encode(\"test@testserver\\0test@testserver\\0testpass\"); ?>" | php
Test mail:
220 testserver ESMTP Postfix on testserver EHLO LOCALHOST 250-testserver 250-PIPELINING 250-SIZE 51200000 250-VRFY 250-ETRN 250-STARTTLS 250-AUTH CRAM-MD5 DIGEST-MD5 LOGIN PLAIN OTP 250-AUTH=CRAM-MD5 DIGEST-MD5 LOGIN PLAIN OTP 250 8BITMIME AUTH PLAIN dGVzdEB0ZXN0c2VydmVyAHRlc3RAdGVzdHNlcnZlcgB0ZXN0cGFzcw== 235 Authentication successful MAIL FROM: <test@testserver> 250 Ok RCPT TO: <test@otherdomain.tld> 250 Ok DATA 354 End data with <CR><LF>.<CR><LF> Test . 250 Ok: queued as 7A984BD635
http://www.gentoo.org/doc/nl/virt-mail-howto.xml
http://ben.franske.com/blogs/bensbits.php/2005/09/06/postfix_smtp_auth_support_for_relayhost