Inhaltsverzeichnis
Zusammenfassung
In diesem kleinen Artikel findest Du eine Zusammenfassung meines Vortrags über „Nicht IP-basierte Relaymethoden in Postfix“ auf der EasterHegg 2004 in München.
SMTP AUTH Server bedeutet, Postfix bietet SMTP AUTH für client an. Dazu mußt Du folgendes konfigurieren:
Authentication Backend für SASL
Password verification service in SASL
Authentication frontend in Postfix
SMTP AUTH Optionen in Postfix konfigurieren
Dieser Abschnitt erklärt die Konfigurationsschritte 1. bis 3.
Dafür mußt Du nichts vorbereiten. Du mußt saslauthd, den standalone daemon, so starten, dass er auf /etc/shadow als authentication backend zugreift:
# saslauthd -a shadow
Dann mit testsaslauthd prüfen, ob saslauthd einen User authentifizieren kann:
# testsaslauthd -u test -p testpass
Damit Postfix weis, dass er mit saslauthd zu tun hat und der nur plaintext Mechanismen beherrscht, erstellst Du folgende Konfiguration in /usr/lib/sasl2/smtpd.conf (debian: /etc/postfix/sasl/smtpd.conf):
pwcheck_method: saslauthd mech_list: PLAIN LOGIN log_level: 3
Den Zugriff auf die sasldb regelt Postfix direkt. Zuerst mußt Du die sasldb2 erstellen. Dazu nützt Du saslpasswd2:
saslpasswd2 -c -u mail.example.com test
Das generiert /etc/sasldb2; die sollte nur für root und die Gruppe postfix lesbar sein!
Dann mußt Du in der /usr/lib/sasl2/smtpd.conf (debian: /etc/postfix/sasl/smtpd.conf) folgende Parameter setzen:
pwcheck_method: auxprop mech_list: PLAIN LOGIN CRAM-MD5 DIGEST-MD5 log_level: 3 auxprop_plugin: sasldb
Seit SASL 2.1.17 ist gibt es kein eigenes MySQL auxprop plugin mehr; es ist jetzt Bestandteil eines generischen sql auxprop plugins. Ein Tabellen layout für Mysql könnte so aussehen:
-- MySQL dump 9.10 -- -- Host: localhost Database: mail -- ------------------------------------------------------ -- Server version 4.0.18-log -- -- Table structure for table `users` -- CREATE TABLE users ( id int(11) unsigned NOT NULL auto_increment, username varchar(255) NOT NULL default '0', userrealm varchar(255) NOT NULL default 'mail.example.com', userpassword varchar(255) NOT NULL default '1stP@ss', auth tinyint(1) default '1', PRIMARY KEY (id), UNIQUE KEY id (id) ) TYPE=MyISAM COMMENT='SMTP AUTH relay users'; -- -- Dumping data for table `users` -- INSERT INTO users VALUES (1,'test','mail.example.com','testpass',1);
Auch hier regelt Postfix smtpd daemon den Zugriff direkt. Was genau er zu tun hat, regelst Du wieder in der smtpd.conf:
pwcheck_method: auxprop auxprop_plugin: sql mech_list: PLAIN LOGIN CRAM-MD5 DIGEST-MD5 log_level: 3 sql_engine: mysql sql_hostnames: localhost sql_database: mail sql_user: postfix sql_passwd: Yanggt! sql_select: SELECT %p FROM users WHERE username = '%u' AND userrealm = '%r' AND auth = '1' sql_usessl: no
In main.cf folgende Parameter und Optionen aktivieren:
## SMTP AUTH Server smtpd_sasl_auth_enable = yessmtpd_sasl_local_domain = mail.example.com
broken_sasl_auth_clients = yes
smtpd_sasl_security_options = noanonymous
smtpd_recipient_restrictions = ... permit_sasl_authenticated
...
Danach Postfix mit postfix reload zum Einlesen der neuen Konfiguration bewegen.
Mit den folgenden Kommandozeilen kannst Du plaintext Teststrings zum Authentisieren für den User test mit dem Passwort testpass generieren:
#encrypt
perl -MMIME::Base64 -e 'print encode_base64("test\0test\0testpass");'
dGVzdAB0ZXN0AHRlc3RwYXNz
# decrypt
perl -MMIME::Base64 -e 'print decode_base64("dGVzdAB0ZXN0AHRlc3RwYXNz"); print "\n";'Jetzt kannst Du für alle drei oben genannten Konfigurationsszenarien SMTP AUTH in Postfix testen. Dazu telnettest Du einfach zu Postfix:
220 mail.example.com ESMTP Postfix EHLO example.com 250-mail.example.com 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-AUTH DIGEST-MD5 CRAM-MD5 GSSAPI PLAIN LOGIN 250-AUTH=DIGEST-MD5 CRAM-MD5 GSSAPI PLAIN LOGIN 250-XVERP 250 8BITMIME AUTH PLAIN dGVzdAB0ZXN0AHRlc3RwYXNz 235 Authentication successful QUIT 221 Bye
SMTP AUTH Server bedeutet, Postfix eigener smtp daemon nutzt SMTP AUTH, um sich bei anderen Servern zu authentisieren. Dazu mußt Du folgendes konfigurieren:
Map mit credentials erstellen
Clientseitiges SMTP AUTH in Postfix konfigurieren
Als erstes mußt Du eine map z.B. /etc/postfix/sasl_passwd erstellen in der Postfix den host, bei dem er SMTP AUTH nutzen soll, findet und welche credentials er dazu nutzen soll:
mail.foo.com username:password smtp.bar.com username:password
Die Datei /etc/postfix/sasl_passwd sollte nur von root lesbar sein...
Danach mußt Du die Datei mit postmap eine map generieren:
postmap hash:/etc/postfix/sasl_passwd
Dann mußt Du clientseitiges SMTP AUTH in Postfix konfigurieren:
## SMTP AUTH Client smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd smtp_sasl_security_options = noanonymous, noplaintext
Danach Postfix mit postfix reload zum Einlesen der neuen Konfiguration bewegen und es sollte gleich gehen ;)
Für einen Postfix Server der anderen Clients TLS anbietet, mußt Du folgende Schritte unternehmen:
Zertifikate erstellen und signieren
TLS Server aktivieren
TLS Server testen
Plaintext Mechanismen durch TLS schützen
Client Zertifikat basiertes relayen
Als erstes mußt Du Dir ein Server Zertifikat generieren. Danach mußt Du es von einer CA, Certification Authority, signieren lassen oder wenn Du selber die CA bist, es halt selber signieren. Das CA Cert, den private key und das signierte server Zertifikat legst Du dann in z.B. /etc/postfix/certs ab:
/etc/postfix/certs$ ls -all total 24 drwxr-xr-x 2 root root 4096 Apr 10 11:09 . drwxr-xr-x 5 root root 4096 Apr 10 14:20 .. lrwxr-xr-x 1 root root 23 Apr 10 11:09 ba2647d8.0 -> postfix_public_cert.pem -rw-r--r-- 1 root root 1322 Apr 9 23:43 cacert.pem lrwxr-xr-x 1 root root 10 Apr 10 11:09 e8346ee7.0 -> cacert.pem -rw------- 1 root root 1599 Apr 9 23:43 postfix_private_key.pem -rw-r--r-- 1 root root 3713 Apr 9 23:43 postfix_public_cert.pem
Dann mußt Du serverseitiges TLS in Postfix aktivieren:
## TLS Server smtpd_use_tls = yes smtpd_tls_loglevel = 2 tls_random_source = dev:/dev/urandom smtpd_tls_key_file = /etc/postfix/certs/postfix_private_key.pem smtpd_tls_cert_file = /etc/postfix/certs/postfix_public_cert.pem
Mit dem folgenden Kommando kannst Du auf Deinem Server testen, ob Postfix die Zertifikate richtig eingebunden hat und ob die Zertifikate verifiziert werden können:
openssl s_client -starttls smtp -CApath /etc/postfix/certs/ -connect localhost:25
Mit den folgenden Optionen in main.cf kannst Du SMTP AUTH so einstellen, dass Plaintext Mechanisnmen Clients erst dann angeboten werden, wenn diese vorher eine TLS session mit dem Server etabliert haben:
smtpd_sasl_security_options = noanonymous, noplaintext smtpd_sasl_tls_security_options = noanonymous
Client Zertifikat basiertes relayen setzt voraus, dass der Client über ein eigenes Zertifikat verfügt, dass er dem Server auf Anfrage übermitteln kann. Der Server vergleicht dann den MD5 Fingerprint des Clientzertifikates mit einer lokalen Liste von Fingerprints. Ist der Fingerprint dort aufgeführt, kann Postfix dem Client identifizierien und im z.B. relayen gestatten. In main.cf fügst Du Folgendes ein:
# Clients nach Zertifikat fragen
smtpd_tls_ask_ccert = yes
# Liste von Client Zertifikaten
relay_clientcerts = hash:/etc/postfix/relay_clientcerts
# TLS received header in mit TLS geschickte Mails einfuegen
smtpd_tls_received_header = yes
smtpd_recipient_restrictions =
...
permit_tls_clientcerts
... | In die smtpd_recipient_restrictions mußt Du als Option permit_tls_clientcerts eintragen, damit authentisierte clients relayen dürfen. |
Dann mußt Du noch die map mit den Fingerprints erstellen. Mit folgendem Kommando kannst Du den Fingerprint aus dem Client Zertifikat holen:
openssl x509 -noout -fingerprint -in client_public_cert.pem
Den Fingerprint legst Du dann in /etc/postfix/relay_clientcerts ab und erstellst mit postmap hash:/etc/postfix/relay_clientcerts die eigentliche map für Postfix:
#LHS RHS E0:AC:69:B8:23:3F:8F:3F:FB:BB:31:D2:34:64:F0:30 mail.example.com