~~META:
date created = 2013-01-22 16:41
&date modified = 2013-01-22 16:41
~~
====== EXIM und SMTP Authentication via IMAP ======
Nachdem der externe Zugriff auf die IMAP Boxen [[imaps-proxy-mit-perdition|eingerichtet]] ist, ging es nun darum, wie man den Externen den Mailversand über den öffentlichen Mailserver ermöglichen konnte.
===== Folgende Dinge sollten dabei erreicht werden: =====
- Der Versand (bzw. das Relaying) sollte von überall aus möglich sein, allerdings nur nach vorheriger SMTP Authentication via RFC 4954.
- Die Übertragung der Authentifizierungsinformationen darf nicht im Klartext erfolgen – daher ist TLS Verschlüsselung zu implementieren
- Als Authentifizierungdatenbank soll der bestehende IMAP “Userstore” verwendet werden.
===== Ausgangslage (gleiches Setup wie beim IMAP Proxy Thema) =====
- Debian 6.0 Installation mit konfiguriertem exim4-daemon-light vorhanden (192.168.1.7)
- Debian 3.x Installation mit courier-imap vorhanden (172.16.1.9)
- exim4 verwendet dc_use_split_config
Diese [[https://github.com/Exim/exim/wiki/AuthenticatedSmtpUsingIMAP|Anleitung]] von GitHub (The Perl Solution) war der Ausgangspunkt für das folgende
===== Kochrezept =====
- Tausch der exim-Installation gegen exim4-daemon-heavy wg. der integrierten Perl Unterstützung# aptitude install exim4-daemon-heavy
- Zertifikat erzeugen und installieren
- Variante 1 – komplett neues Zertifikat:
# cd /tmp
# openssl req -new -x509 -newkey rsa:2048 -nodes -out exim.crt -keyout exim.key -days 730
# mv exim.crt /etc/exim4/
# mv exim.key /etc/exim4/
- Variante 2 – vorhandenes Zertifikate verwenden – dann weiß man eh was zu tun ist
- perl.pl aus der Exim-Doku nach /etc/exim4/perl.pl abspeichern
- TLS und Perl Funktionen aktivieren – dazu in /etc/exim4/conf.d/main/000_localmacros folgendes eintragen
MAIN_TLS_ENABLE = yes
perl_startup = do '/etc/exim4/perl.pl'
perl_at_start
- SMTP-Authentication konfigurieren – dazu folgenden Code als /etc/exim4/conf.d/auth/10_exim4-config_imap speichern (auch das ist de-facto eine 1:1.5 Kopie von GitHub)
imap_plain:
driver = plaintext
public_name = PLAIN
server_condition = ${perl{imapLogin}{172.16.1.9}{$2}{$3}}
server_set_id = $2
imap_login:
driver = plaintext
public_name = LOGIN
server_prompts = "Username:: : Password::"
server_condition = ${perl{imapLogin}{172.16.1.9}{$1}{$2}}
server_set_id = $1
- exim4 Config aktualisieren und exim neustarten
# update-exim4.conf
# /etc/init.d/exim4 restart
- Testen, ob das alles funktioniert
- Generelles Setup
# telnet 192.168.1.7 25
Trying 192.168.1.7...
Connected to 192.168.1.7.
Escape character is '^]'.
220 psserver1.as1ext.local ESMTP Exim 4.72 Tue, 22 Jan 2013 17:04:03 +0100
EHLO .
250-psserver1.as1ext.local Hello . [192.168.1.254]
250-SIZE 52428800
250-PIPELINING
250-AUTH PLAIN LOGIN
250-STARTTLS
250 HELP
QUIT
Es müssen die STARTTLS und die AUTH extensions als Antwort auf den extendend HELO (EHLO) angeboten werden.
- TLS
# telnet 192.168.1.7 25
Trying 192.168.1.7...
Connected to 192.168.1.7.
Escape character is '^]'.
220 psserver1.as1ext.local ESMTP Exim 4.72 Tue, 22 Jan 2013 17:08:13 +0100
EHLO .
250-psserver1.as1ext.local Hello . [192.168.1.254]
250-SIZE 52428800
250-PIPELINING
250-AUTH PLAIN LOGIN
250-STARTTLS
250 HELP
STARTTLS
220 TLS go ahead
Wenn auf “220 TLS go ahead” keine komischen Meldungen in /var/log/exim4/mainlog auftauchen, ist auch dieses Teilziel geschafft
- Authentication – das ist ein wenig diffiziler, denn UserID und Passwort werden als base64 string erwartet – printf und openssl helfen, diese Strings zu erhalten:
# printf 'user' | openssl base64 -e
dXNlcg==
# printf 'password' | openssl base64 -e
cGFzc3dvcmQ=
Dann kann getestet werden:
# telnet 192.168.1.7 25
Trying 192.168.1.7...
Connected to 192.168.1.7.
Escape character is '^]'.
220 psserver1.as1ext.local ESMTP Exim 4.72 Tue, 22 Jan 2013 17:15:00 +0100
EHLO .
250-psserver1.as1ext.local Hello . [192.168.1.254]
250-SIZE 52428800
250-PIPELINING
250-AUTH PLAIN LOGIN
250-STARTTLS
250 HELP
AUTH LOGIN
334 VXNlcm5hbWU6
dXNlcg==
334 UGFzc3dvcmQ6
cGFzc3dvcmQ=
235 Authentication succeeded
QUIT
221 psserver1.as1ext.local closing connection
Connection closed by foreign host.
Auf die erste kryptische 334er-Aufforderung reagiert man mit dem User, die zweite wird mit dem Passwort beantwortet und wenn alles klappt wird der Test mit der Meldung “235 Authentication succeeded” belohnt.
{{tag>kb linux exim4 smtp imap mailserver}}