Cyrus IMAP mit SSL ausstatten

by Michi on März 4, 2008

Achtung. Nerd-Content. Wer nicht explizit hieran interessiert ist, sollte lieber nicht weiterlesen 😉 Aus diversesten Gründen musste der bisher bei mir im Einsatz befindliche Mailserver auf dem ein Cyrus-IMAPd mit Procmail, ClamAV und Spamassassin läuft und den namen „minerva“ trägt durch eine neue, schnellere virtuelle Maschine basierend auf JeOS ausgetauscht werden. Der Neue in der Serverfamilie wurde „filch“ getauft. Da Sicherheit auch immer weiter (zu Recht) ein Thema ist, habe ich mit entschlossen, den Zugriff nur noch SSL-Verschlüsselt zu ermöglichen. Wie das geht will ich hier einmal beschreiben.
Die Anleitung habe ich für Ubuntu JeOS 7.10 geschrieben, das sollte aber so auch für so ziemlich alle gängigen Debian-Systeme ähnlich funktionieren. Zunächst muss, sofern nicht schon vorhanden, openssl installiert werden.
sudo apt-get install openssl
Während der Installation wird zwar bereits ein Zertifikat + passendem Key erzeugt, dass ist für unsere Zwecke aber nicht gebräuchlich, warum sehen wir später. Wir müssen also manuell ein weiteres Zertifikat erzeugen. Das geht mit diesem Monsterbefehl
sudo openssl req -new -x509 -nodes -out /etc/ssl/certs/imap.pem -keyout /etc/ssl/private/imap.key -days 365
Es erscheint ein Dialog, indem wir verschiedene Daten zu unserem Zertifikat eintragen können. Was genau wir dort eintragen, ist recht egal. Es erscheint wenn man sich die Informationen zu dem SSL-Zertifikat zB im Mail-Client anzeigt. Achtung: Ausnahme! lediglich das Feld „Common Name“, muss nicht wie die Beschreibung vermuten lässt dein Name sein, sondern der Hostname des Servers, unter dem er später im Netz erreichbar ist. Also zb gryffindor.hogwarts.dyndns.org. Trägt man hier etwas anderes ein, gibt es später im Client bei jeder Verbindung zum Server eine Fehlermeldung, die auf den Host „mismatch“ hinweist. Zwar ist eine Verbindung zum Server möglich, die Meldung nervt aber schon derbe. In dem Standardzertifikat wird als Common Name immer „localhost“ oder der lokale hostname des Rechners angegeben und führt damit ebenfalls zu der Fehlermeldung.

Nachdem das Zertifikat erstellt wurde, kann es im Cyrus konfiguriert werden. Dazu öffnen wir die Datei /etc/imapd.conf und editieren folgende Zeilen wie folgt:
# File containing the global certificate used for ALL services (imap, pop3,
# lmtp, sieve)
tls_cert_file: /etc/ssl/certs/imap.pem

# File containing the private key belonging to the global server certificate.
tls_key_file: /etc/ssl/private/imap.key

Wir haben nun dem IMAP-Dienst gesagt, dass er die von uns angelegten Dateien mit dem Zertifikat und dem dazugehörigen Schlüssel verwenden soll. Jetzt müssen wir noch in der Cyrus Konfiguration IMAP über SSL aktivieren. Da wir die Verbindung über ungesicherte Sockets nicht mehr zulassen wollen, deaktivieren wir auch den normalen Zugriff. Dazu müssen wir in die Datei /etc/cyrus.conf. Unter dem Bereich SERVICES ändern wir zwei Zeilen
SERVICES {
# --- Normal cyrus spool, or Murder backends ---
# add or remove based on preferences
#imap cmd="imapd -U 30" listen="imap" prefork=0 maxchild=100
imaps cmd="imapd -s -U 30" listen="imaps" prefork=0 maxchild=100

Das Auskommentieren von imap verbietet den Zugriff über nicht-SSL Schnittstellen, das entfernen der Raut vor imaps dagegen ermöglicht die Kommunikation über SSL.

Nun haben wir alle nötigen Einstellungen am Server vorgenommen und können den Cyrus jetzt neu starten
sudo /etc/init.d/cyrus2.2 restart
Nun sollte das Abfragen über SSL aus jedem Mailclient möglich sein. Falls was schiefgeht, sollte man das logfile unter /var/log/mail.err konsultieren.

Hoffe, dass Tutorial kann jemand gebrauchen. Fragen, Anregungen, Kritik gerne in den Kommentaren

4 comments

Hallo Michi

Zuerst mal: Super Beitrag! Genau in dem Umfang wie man es braucht …

Evt. kennst du gerade auch die Lösung für mein Problem:
Ich habe auf Debian Lenny den Cyrus 2.2 installiert, inkl. openssl 0.9.8g.

Leider bekomme ich im mail.err nur:
Dec 16 21:20:17 srv07 cyrus/imaps[8250]: unable to get private key from ‚/etc/ssl/private/imap.key‘
Dec 16 21:20:17 srv07 cyrus/imaps[8250]: TLS server engine: cannot load cert/key data, may be a cert/key mismatch?
Dec 16 21:20:17 srv07 cyrus/imaps[8250]: error initializing TLS
Dec 16 21:20:17 srv07 cyrus/imaps[8250]: Fatal error: tls_init() failed
Dec 16 21:20:17 srv07 cyrus/imaps[8250]: DBERROR: error exiting application: Invalid argument

Vieleicht wurdest du ja mit diesem Problem ebenfalls konfrontiert.

Gruss & Danke
lousek

by lousek on 16. Dezember 2010 at 21:36. #

Hi,

so auf anhieb hab ich da keine Idee. Schau mal, ob der key tatsächlich an der Stelle (/etc/ssl/private/imap.key) existiert und ob er lesbar ist für den user, der cyrus ausführt (sollte cyrus heißen).

Vielleicht hilft das ja schon!

by Michi on 31. Dezember 2010 at 12:38. #

Versuch mal
# sudo chmod g+x /etc/ssl/private
# sudo chgrp mail /etc/ssl/private

by HoodAl on 4. Januar 2011 at 22:13. #

adduser cyrus ssl-cert

ist unter squeeze der beste Weg, das Problem loszuwerden

Gruß,
Joachim

by Joachim Zobel on 27. April 2013 at 23:15. #

Leave your comment

Required.

Required. Not published.

If you have one.



Piwik encoutered an error: Uncaught exception 'Exception' with message 'Piwik and/or some plugins have been upgraded to a new version. --> Please run the update process first. See documentation: http://piwik.org/docs/update/ ' in /var/www/stats.mail.feinbier.net/html/plugins/CoreUpdater/CoreUpdater.php:73 Stack trace: #0 [internal function]: Piwik\Plugins\CoreUpdater\CoreUpdater->dispatch() #1 /var/www/stats.mail.feinbier.net/html/core/EventDispatcher.php(141): call_user_func_array(Array, Array) #2 /var/www/stats.mail.feinbier.net/html/core/Piwik.php(701): Piwik\EventDispatcher->postEvent('Request.dispatc...', Array, false, NULL) #3 /var/www/stats.mail.feinbier.net/html/core/FrontController.php(306): Piwik\Piwik::postEvent('Request.dispatc...') #4 /var/www/denkweite.de/html/wp-content/plugins/wp-piwik/classes/WP_Piwik/Request/Php.php(38): Piwik\FrontController->init() #5 /var/www/denkweite.de/html/wp-content/plugins/wp-piwik/classes/WP_Piwik/Request/Php.php(16): WP_Piwik\Request\Php->call('method=SitesMan...', 'http://stats.ma...', ' (which lead to: Session must be started before any output has been sent to the browser; output started in /var/www/denkweite.de/html/wp-includes/formatting.php/5081)