Nicht IP-basierte Relaymethoden

SMTP AUTH und Client Zertifikat basiertes relayen

Patrick Ben Koetter

12.04.2004


Inhaltsverzeichnis

SMTP AUTH
SMTP AUTH Server
SMTP AUTH client
TLS Server
Zertifikate erstellen und signieren
TLS Server aktivieren
TLS Server testen
Plaintext Mechanismen durch TLS schützen
Client Zertifikat basiertes relayen

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.

Belorussian translation

SMTP AUTH

SMTP AUTH Server

SMTP AUTH Server bedeutet, Postfix bietet SMTP AUTH für client an. Dazu mußt Du folgendes konfigurieren:

  1. Authentication Backend für SASL

  2. Password verification service in SASL

  3. Authentication frontend in Postfix

  4. SMTP AUTH Optionen in Postfix konfigurieren

Postfix - SASL Interaktion

Dieser Abschnitt erklärt die Konfigurationsschritte 1. bis 3.

Authentication backend: shadow

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
Authentication backend: sasldb2

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
Authentication backend: MySQL

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
SMTP AUTH Optionen in Postfix konfigurieren

In main.cf folgende Parameter und Optionen aktivieren:

## SMTP AUTH Server

smtpd_sasl_auth_enable = yes 1
smtpd_sasl_local_domain = mail.example.com 2
broken_sasl_auth_clients = yes 3
smtpd_sasl_security_options = noanonymous 4


smtpd_recipient_restrictions = 
    ...
    permit_sasl_authenticated 5
    ...
1

SMTP AUTH aktivieren

2

smtpd_sasl_local_domain konfiguriert den realm. Wenn Du saslauthd nutzt, dann mußt Du den Parameter setzen, aber leer (!) lassen.

3

Unterstützung für client, die SMTP AUTH nicht RFC konform erkennen wie z.B. Outlook (Express).

4

Welche Mechanismen darf Postfix anbieten. Immer mindestens noanonymous lassen, weil sonst jeder der irgendeinen String als AUTH schickt relayen darf...

5

In die smtpd_recipient_restrictions mußt Du als Option permit_sasl_authenticated eintragen, damit authentisierte clients relayen dürfen.

Danach Postfix mit postfix reload zum Einlesen der neuen Konfiguration bewegen.

Testen

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 client

SMTP AUTH Server bedeutet, Postfix eigener smtp daemon nutzt SMTP AUTH, um sich bei anderen Servern zu authentisieren. Dazu mußt Du folgendes konfigurieren:

  1. Map mit credentials erstellen

  2. Clientseitiges SMTP AUTH in Postfix konfigurieren

Map mit credentials erstellen

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

Clientseitiges SMTP AUTH in Postfix konfigurieren

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 ;)

TLS Server

Für einen Postfix Server der anderen Clients TLS anbietet, mußt Du folgende Schritte unternehmen:

  1. Zertifikate erstellen und signieren

  2. TLS Server aktivieren

  3. TLS Server testen

  4. Plaintext Mechanismen durch TLS schützen

  5. Client Zertifikat basiertes relayen

Zertifikate erstellen und signieren

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

TLS Server aktivieren

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

TLS Server testen

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

Plaintext Mechanismen durch TLS schützen

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

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 1
    ...
1

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 1
1

Die Postfix map Struktur verlangt, dass Du auf der RHS einen Wert angibst, auch der Fingerprint alleine an dieser Stelle völlig ausreichen würde.