~~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 QUITEs 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 aheadWenn 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}}