Der Cyrus Hochleistungs-Mailserver mit Unterstützung für IMAP und SIEVE unter CentOS 6.x

Cyrus-Logo Der eMail-Server Cyrus ist ein Open-Source-Projekt der Carnegie Mellon University, welches ursprünglich für das Campus-Mail-System der Universität entwickelt wurde. In der Zwischenzeit ist er jedoch ein anerkannter und auch im professionellen Bereich eingesetzter MDA1). Er unterstützt neben dem POP32) auch das Protokoll IMAP3), auf welches wir in der weiteren Dokumentation weiter eingehen werden. Cyrus arbeitet mit diversen SMTP-Servern unter Linux/Unix zusammen und ist für das Zusammenspiel mit unserem Mailserver Postfix bestens gerüstet. Cyrus benutzt die Cyrus SASL Library - eine Implementierung von SASL - um mehrere Authentifizierungsmethoden zur Verfügung stellen zu können, wie z.B. Plain, CRAM-MD5, Digest-MD5, oder PAM.

Über das Anwendungsprotokoll IMAP erlaubt der Cyrus-Server den Benutzern die Verwaltung von empfangenen E-Mails, die sich in einem Postfach auf dem Mailserver befinden. IMAP wurde im Jahr 1986 entworfen, um den Zugriff auf Mailboxen und Nachrichten so bereitzustellen, als befänden sich diese auf dem lokalen Rechner. Im Gegensatz zu POP3 verbleiben die eMails aber auf dem Mailserver und werden dort verwaltet. Für das Versenden der Nachrichten wird das Protokoll SMTP verwendet. Zur Kommunikation mit dem IMAP-Server horcht der Server auf dem Port 143. Die Definition von IMAP ist im RFC 3501 definiert worden.

Die Installation unseres MDA4) nehmen wir mit Hilfe unseres Paketmanagers yum vor. Neben dem eigentlichen Programmpaket cyrus-imapd kommt noch das Paket cyrus-imapd-utils zum Einsatz.

 # yum install cyrus-imapd cyrus-imapd-utils -y

Was uns die beiden Programmpakete mitbringen können wir bei Bedarf den Angaben im jeweiligen RPM entnehmen.

 # rpm -qil cyrus-imapd
Name        : cyrus-imapd                  Relocations: (not relocatable)
Version     : 2.3.16                            Vendor: CentOS
Release     : 6.el6_1.4                     Build Date: Thu 01 Dec 2011 06:24:38 PM CET
Install Date: Mon 26 Dec 2011 10:27:26 PM CET      Build Host: c6b5.bsys.dev.centos.org
Group       : System Environment/Daemons    Source RPM: cyrus-imapd-2.3.16-6.el6_1.4.src.rpm
Size        : 45641427                         License: BSD
Signature   : RSA/SHA1, Wed 07 Dec 2011 06:51:07 PM CET, Key ID 0946fca2c105b9de
Packager    : CentOS BuildSystem <http://bugs.centos.org>
URL         : http://cyrusimap.web.cmu.edu/
Summary     : A high-performance mail server with IMAP, POP3, NNTP and SIEVE support
Description :
The cyrus-imapd package contains the core of the Cyrus IMAP server.
It is a scaleable enterprise mail system designed for use from
small to large enterprise environments using standards-based
internet mail technologies.

A full Cyrus IMAP implementation allows a seamless mail and bulletin
board environment to be set up across multiple servers. It differs from
other IMAP server implementations in that it is run on "sealed"
servers, where users are not normally permitted to log in and have no
system account on the server. The mailbox database is stored in parts
of the file system that are private to the Cyrus IMAP server. All user
access to mail is through software using the IMAP, POP3 or KPOP
protocols. It also includes support for virtual domains, NNTP,
mailbox annotations, and much more. The private mailbox database design
gives the server large advantages in efficiency, scalability and
administratability. Multiple concurrent read/write connections to the
same mailbox are permitted. The server supports access control lists on
mailboxes and storage quotas on mailbox hierarchies.

The Cyrus IMAP server supports the IMAP4rev1 protocol described
in RFC 3501. IMAP4rev1 has been approved as a proposed standard.
It supports any authentication mechanism available from the SASL
library, imaps/pop3s/nntps (IMAP/POP3/NNTP encrypted using SSL and
TLSv1) can be used for security. The server supports single instance
store where possible when an email message is addressed to multiple
recipients, SIEVE provides server side email filtering.
/etc/cron.daily/cyrus-imapd
/etc/cyrus.conf
/etc/imapd.conf
/etc/logrotate.d/cyrus-imapd
/etc/pam.d/csync
/etc/pam.d/imap
/etc/pam.d/lmtp
/etc/pam.d/mupdate
/etc/pam.d/nntp
/etc/pam.d/pop
/etc/pam.d/sieve
/etc/pki/cyrus-imapd
/etc/pki/cyrus-imapd/cyrus-imapd.pem
/etc/rc.d/init.d/cyrus-imapd
/etc/sysconfig/cyrus-imapd
/usr/lib/cyrus-imapd
/usr/lib/cyrus-imapd/arbitron
/usr/lib/cyrus-imapd/arbitronsort.pl
/usr/lib/cyrus-imapd/chk_cyrus
/usr/lib/cyrus-imapd/compile_sieve
/usr/lib/cyrus-imapd/convert-sieve.pl
/usr/lib/cyrus-imapd/ctl_cyrusdb
/usr/lib/cyrus-imapd/ctl_deliver
/usr/lib/cyrus-imapd/ctl_mboxlist
/usr/lib/cyrus-imapd/cvt_cyrusdb
/usr/lib/cyrus-imapd/cvt_cyrusdb_all
/usr/lib/cyrus-imapd/cyr_dbtool
/usr/lib/cyrus-imapd/cyr_df
/usr/lib/cyrus-imapd/cyr_expire
/usr/lib/cyrus-imapd/cyr_synclog
/usr/lib/cyrus-imapd/cyrdump
/usr/lib/cyrus-imapd/cyrfetchnews
/usr/lib/cyrus-imapd/cyrus-master
/usr/lib/cyrus-imapd/deliver
/usr/lib/cyrus-imapd/dohash
/usr/lib/cyrus-imapd/fud
/usr/lib/cyrus-imapd/idled
/usr/lib/cyrus-imapd/imapd
/usr/lib/cyrus-imapd/ipurge
/usr/lib/cyrus-imapd/lmtpd
/usr/lib/cyrus-imapd/lmtpproxyd
/usr/lib/cyrus-imapd/make_md5
/usr/lib/cyrus-imapd/make_sha1
/usr/lib/cyrus-imapd/masssievec
/usr/lib/cyrus-imapd/mbexamine
/usr/lib/cyrus-imapd/mbpath
/usr/lib/cyrus-imapd/migrate-metadata
/usr/lib/cyrus-imapd/mkimap
/usr/lib/cyrus-imapd/mknewsgroups
/usr/lib/cyrus-imapd/mupdate
/usr/lib/cyrus-imapd/mupdate-loadgen.pl
/usr/lib/cyrus-imapd/nntpd
/usr/lib/cyrus-imapd/notifyd
/usr/lib/cyrus-imapd/pop3d
/usr/lib/cyrus-imapd/proxyd
/usr/lib/cyrus-imapd/ptdump
/usr/lib/cyrus-imapd/ptexpire
/usr/lib/cyrus-imapd/ptloader
/usr/lib/cyrus-imapd/quota
/usr/lib/cyrus-imapd/reconstruct
/usr/lib/cyrus-imapd/rehash
/usr/lib/cyrus-imapd/sievec
/usr/lib/cyrus-imapd/sieved
/usr/lib/cyrus-imapd/smmapd
/usr/lib/cyrus-imapd/squatter
/usr/lib/cyrus-imapd/sync_client
/usr/lib/cyrus-imapd/sync_reset
/usr/lib/cyrus-imapd/sync_server
/usr/lib/cyrus-imapd/timsieved
/usr/lib/cyrus-imapd/tls_prune
/usr/lib/cyrus-imapd/translatesieve
/usr/lib/cyrus-imapd/undohash
/usr/lib/cyrus-imapd/unexpunge
/usr/lib/cyrus-imapd/upgradesieve
/usr/share/cyrus-imapd
/usr/share/cyrus-imapd/rpm
/usr/share/cyrus-imapd/rpm/db.cfg
/usr/share/cyrus-imapd/rpm/magic
/usr/share/doc/cyrus-imapd-2.3.16
/usr/share/doc/cyrus-imapd-2.3.16/COPYRIGHT
/usr/share/doc/cyrus-imapd-2.3.16/README
/usr/share/doc/cyrus-imapd-2.3.16/README.autocreate-cyrus-2.3
/usr/share/doc/cyrus-imapd-2.3.16/README.autosievefolder
/usr/share/doc/cyrus-imapd-2.3.16/README.rpm
/usr/share/doc/cyrus-imapd-2.3.16/altnamespace.html
/usr/share/doc/cyrus-imapd-2.3.16/anoncvs.html
/usr/share/doc/cyrus-imapd-2.3.16/bugs.html
/usr/share/doc/cyrus-imapd-2.3.16/changes.html
/usr/share/doc/cyrus-imapd-2.3.16/conf
/usr/share/doc/cyrus-imapd-2.3.16/conf/cmu-backend.conf
/usr/share/doc/cyrus-imapd-2.3.16/conf/cmu-frontend.conf
/usr/share/doc/cyrus-imapd-2.3.16/conf/normal.conf
/usr/share/doc/cyrus-imapd-2.3.16/conf/prefork.conf
/usr/share/doc/cyrus-imapd-2.3.16/conf/small.conf
/usr/share/doc/cyrus-imapd-2.3.16/contrib
/usr/share/doc/cyrus-imapd-2.3.16/cyrusv2.mc
/usr/share/doc/cyrus-imapd-2.3.16/faq.html
/usr/share/doc/cyrus-imapd-2.3.16/feedback.html
/usr/share/doc/cyrus-imapd-2.3.16/index.html
/usr/share/doc/cyrus-imapd-2.3.16/install-admin-mb.html
/usr/share/doc/cyrus-imapd-2.3.16/install-auth.html
/usr/share/doc/cyrus-imapd-2.3.16/install-compile.html
/usr/share/doc/cyrus-imapd-2.3.16/install-configure.html
/usr/share/doc/cyrus-imapd-2.3.16/install-murder.html
/usr/share/doc/cyrus-imapd-2.3.16/install-netnews.html
/usr/share/doc/cyrus-imapd-2.3.16/install-perf.html
/usr/share/doc/cyrus-imapd-2.3.16/install-prereq.html
/usr/share/doc/cyrus-imapd-2.3.16/install-replication.html
/usr/share/doc/cyrus-imapd-2.3.16/install-sieve.html
/usr/share/doc/cyrus-imapd-2.3.16/install-snmpmon.html
/usr/share/doc/cyrus-imapd-2.3.16/install-testing.html
/usr/share/doc/cyrus-imapd-2.3.16/install-upgrade.html
/usr/share/doc/cyrus-imapd-2.3.16/install-virtdomains.html
/usr/share/doc/cyrus-imapd-2.3.16/install.html
/usr/share/doc/cyrus-imapd-2.3.16/internal
/usr/share/doc/cyrus-imapd-2.3.16/internal/bytecode
/usr/share/doc/cyrus-imapd-2.3.16/internal/database-formats.html
/usr/share/doc/cyrus-imapd-2.3.16/internal/hacking
/usr/share/doc/cyrus-imapd-2.3.16/internal/internationalization.html
/usr/share/doc/cyrus-imapd-2.3.16/internal/locking
/usr/share/doc/cyrus-imapd-2.3.16/internal/mailbox-format.html
/usr/share/doc/cyrus-imapd-2.3.16/internal/master-state-machine.fig
/usr/share/doc/cyrus-imapd-2.3.16/internal/prot-events
/usr/share/doc/cyrus-imapd-2.3.16/internal/prot.html
/usr/share/doc/cyrus-imapd-2.3.16/internal/replication_examples
/usr/share/doc/cyrus-imapd-2.3.16/internal/replication_protocol
/usr/share/doc/cyrus-imapd-2.3.16/internal/specials
/usr/share/doc/cyrus-imapd-2.3.16/internal/uuid
/usr/share/doc/cyrus-imapd-2.3.16/internal/var_directory_structure
/usr/share/doc/cyrus-imapd-2.3.16/mailing-list.html
/usr/share/doc/cyrus-imapd-2.3.16/man.html
/usr/share/doc/cyrus-imapd-2.3.16/murder.fig
/usr/share/doc/cyrus-imapd-2.3.16/murder.png
/usr/share/doc/cyrus-imapd-2.3.16/netnews.fig
/usr/share/doc/cyrus-imapd-2.3.16/netnews.png
/usr/share/doc/cyrus-imapd-2.3.16/notes.html
/usr/share/doc/cyrus-imapd-2.3.16/os.html
/usr/share/doc/cyrus-imapd-2.3.16/overview.html
/usr/share/doc/cyrus-imapd-2.3.16/questions.html
/usr/share/doc/cyrus-imapd-2.3.16/readme.html
/usr/share/doc/cyrus-imapd-2.3.16/sieve-protocol.html
/usr/share/doc/cyrus-imapd-2.3.16/sieve.html
/usr/share/doc/cyrus-imapd-2.3.16/specs.html
/usr/share/doc/cyrus-imapd-2.3.16/text
/usr/share/doc/cyrus-imapd-2.3.16/text/altnamespace
/usr/share/doc/cyrus-imapd-2.3.16/text/anoncvs
/usr/share/doc/cyrus-imapd-2.3.16/text/bugs
/usr/share/doc/cyrus-imapd-2.3.16/text/changes
/usr/share/doc/cyrus-imapd-2.3.16/text/faq
/usr/share/doc/cyrus-imapd-2.3.16/text/feedback
/usr/share/doc/cyrus-imapd-2.3.16/text/index
/usr/share/doc/cyrus-imapd-2.3.16/text/install
/usr/share/doc/cyrus-imapd-2.3.16/text/install-admin-mb
/usr/share/doc/cyrus-imapd-2.3.16/text/install-auth
/usr/share/doc/cyrus-imapd-2.3.16/text/install-compile
/usr/share/doc/cyrus-imapd-2.3.16/text/install-configure
/usr/share/doc/cyrus-imapd-2.3.16/text/install-murder
/usr/share/doc/cyrus-imapd-2.3.16/text/install-netnews
/usr/share/doc/cyrus-imapd-2.3.16/text/install-perf
/usr/share/doc/cyrus-imapd-2.3.16/text/install-prereq
/usr/share/doc/cyrus-imapd-2.3.16/text/install-replication
/usr/share/doc/cyrus-imapd-2.3.16/text/install-sieve
/usr/share/doc/cyrus-imapd-2.3.16/text/install-snmpmon
/usr/share/doc/cyrus-imapd-2.3.16/text/install-testing
/usr/share/doc/cyrus-imapd-2.3.16/text/install-upgrade
/usr/share/doc/cyrus-imapd-2.3.16/text/install-virtdomains
/usr/share/doc/cyrus-imapd-2.3.16/text/mailing-list
/usr/share/doc/cyrus-imapd-2.3.16/text/man
/usr/share/doc/cyrus-imapd-2.3.16/text/notes
/usr/share/doc/cyrus-imapd-2.3.16/text/os
/usr/share/doc/cyrus-imapd-2.3.16/text/overview
/usr/share/doc/cyrus-imapd-2.3.16/text/questions
/usr/share/doc/cyrus-imapd-2.3.16/text/readme
/usr/share/doc/cyrus-imapd-2.3.16/text/sieve
/usr/share/doc/cyrus-imapd-2.3.16/text/sieve-protocol
/usr/share/doc/cyrus-imapd-2.3.16/text/specs
/usr/share/man/man5/cyrus.conf.5.gz
/usr/share/man/man5/imapd.conf.5.gz
/usr/share/man/man5/krb.equiv.5.gz
/usr/share/man/man8/arbitron.8.gz
/usr/share/man/man8/chk_cyrus.8.gz
/usr/share/man/man8/ctl_cyrusdb.8.gz
/usr/share/man/man8/ctl_deliver.8.gz
/usr/share/man/man8/ctl_mboxlist.8.gz
/usr/share/man/man8/cvt_cyrusdb.8.gz
/usr/share/man/man8/cyr_dbtool.8.gz
/usr/share/man/man8/cyr_df.8.gz
/usr/share/man/man8/cyr_expire.8.gz
/usr/share/man/man8/cyr_synclog.8.gz
/usr/share/man/man8/cyrfetchnews.8.gz
/usr/share/man/man8/cyrus-master.8.gz
/usr/share/man/man8/deliver.8.gz
/usr/share/man/man8/fud.8.gz
/usr/share/man/man8/idled.8.gz
/usr/share/man/man8/imapd.8cyrus.gz
/usr/share/man/man8/ipurge.8.gz
/usr/share/man/man8/lmtpd.8.gz
/usr/share/man/man8/make_md5.8.gz
/usr/share/man/man8/make_sha1.8.gz
/usr/share/man/man8/mbexamine.8.gz
/usr/share/man/man8/mbpath.8.gz
/usr/share/man/man8/nntpd.8.gz
/usr/share/man/man8/notifyd.8.gz
/usr/share/man/man8/pop3d.8cyrus.gz
/usr/share/man/man8/quota.8.gz
/usr/share/man/man8/reconstruct.8.gz
/usr/share/man/man8/rmnews.8.gz
/usr/share/man/man8/smmapd.8.gz
/usr/share/man/man8/squatter.8.gz
/usr/share/man/man8/sync_client.8.gz
/usr/share/man/man8/sync_reset.8.gz
/usr/share/man/man8/sync_server.8.gz
/usr/share/man/man8/timsieved.8.gz
/usr/share/man/man8/tls_prune.8.gz
/usr/share/man/man8/unexpunge.8.gz
/var/lib/imap
/var/lib/imap/backup
/var/lib/imap/db
/var/lib/imap/log
/var/lib/imap/md5
/var/lib/imap/meta
/var/lib/imap/msg
/var/lib/imap/proc
/var/lib/imap/ptclient
/var/lib/imap/quota
/var/lib/imap/rpm
/var/lib/imap/sieve
/var/lib/imap/socket
/var/lib/imap/sync
/var/lib/imap/user
/var/spool/imap
 # rpm -qil cyrus-imapd-utils
Name        : cyrus-imapd-utils            Relocations: (not relocatable)
Version     : 2.3.16                            Vendor: CentOS
Release     : 6.el6_1.4                     Build Date: Thu 01 Dec 2011 06:24:38 PM CET
Install Date: Mon 26 Dec 2011 10:27:06 PM CET      Build Host: c6b5.bsys.dev.centos.org
Group       : Applications/System           Source RPM: cyrus-imapd-2.3.16-6.el6_1.4.src.rpm
Size        : 733204                           License: BSD
Signature   : RSA/SHA1, Wed 07 Dec 2011 06:51:10 PM CET, Key ID 0946fca2c105b9de
Packager    : CentOS BuildSystem <http://bugs.centos.org>
URL         : http://cyrusimap.web.cmu.edu/
Summary     : Cyrus IMAP server administration utilities
Description :
The cyrus-imapd-utils package contains administrative tools for the
Cyrus IMAP server. It can be installed on systems other than the
one running the server.
/usr/bin/cyradm
/usr/bin/imtest
/usr/bin/installsieve
/usr/bin/lmtptest
/usr/bin/mupdatetest
/usr/bin/nntptest
/usr/bin/notifytest
/usr/bin/pop3test
/usr/bin/sieveshell
/usr/bin/sivtest
/usr/bin/smtptest
/usr/bin/synctest
/usr/lib64/perl5/vendor_perl/Cyrus
/usr/lib64/perl5/vendor_perl/Cyrus/IMAP
/usr/lib64/perl5/vendor_perl/Cyrus/IMAP.pm
/usr/lib64/perl5/vendor_perl/Cyrus/IMAP/Admin.pm
/usr/lib64/perl5/vendor_perl/Cyrus/IMAP/IMSP.pm
/usr/lib64/perl5/vendor_perl/Cyrus/IMAP/Shell.pm
/usr/lib64/perl5/vendor_perl/Cyrus/SIEVE
/usr/lib64/perl5/vendor_perl/Cyrus/SIEVE/managesieve.pm
/usr/lib64/perl5/vendor_perl/auto
/usr/lib64/perl5/vendor_perl/auto/Cyrus
/usr/lib64/perl5/vendor_perl/auto/Cyrus/IMAP
/usr/lib64/perl5/vendor_perl/auto/Cyrus/IMAP/IMAP.so
/usr/lib64/perl5/vendor_perl/auto/Cyrus/SIEVE
/usr/lib64/perl5/vendor_perl/auto/Cyrus/SIEVE/managesieve
/usr/lib64/perl5/vendor_perl/auto/Cyrus/SIEVE/managesieve/managesieve.so
/usr/share/doc/cyrus-imapd-utils-2.3.16
/usr/share/doc/cyrus-imapd-utils-2.3.16/Changes
/usr/share/doc/cyrus-imapd-utils-2.3.16/README
/usr/share/doc/cyrus-imapd-utils-2.3.16/examples
/usr/share/doc/cyrus-imapd-utils-2.3.16/examples/auditmbox.pl
/usr/share/doc/cyrus-imapd-utils-2.3.16/examples/imapcollate.pl
/usr/share/doc/cyrus-imapd-utils-2.3.16/examples/imapdu.pl
/usr/share/doc/cyrus-imapd-utils-2.3.16/examples/test-imsp.pl
/usr/share/man/man1/cyradm.1.gz
/usr/share/man/man1/imtest.1.gz
/usr/share/man/man1/installsieve.1.gz
/usr/share/man/man1/lmtptest.1.gz
/usr/share/man/man1/mupdatetest.1.gz
/usr/share/man/man1/nntptest.1.gz
/usr/share/man/man1/pop3test.1.gz
/usr/share/man/man1/sieveshell.1.gz
/usr/share/man/man1/sivtest.1.gz
/usr/share/man/man1/smtptest.1.gz
/usr/share/man/man3/Cyrus::IMAP.3pm.gz
/usr/share/man/man3/Cyrus::IMAP::Admin.3pm.gz
/usr/share/man/man3/Cyrus::IMAP::IMSP.3pm.gz
/usr/share/man/man3/Cyrus::IMAP::Shell.3pm.gz
/usr/share/man/man3/Cyrus::SIEVE::managesieve.3pm.gz

In der Konfigurationsdatei /etc/imapd.conf werden das Verhalten und die Verzeichnis(strukturen) des IMAP-Servers definiert. Mit dem Editor unserer Wahl bearbeiten und ergänzen wir die vom RPM mitgebrachten Defaultwerte.

 # vim /etc/imapd.conf
/etc/imapd.conf
# Defaultkonfigurationsdatei aus dem RPM-Paket cyrus-imapd angepasst an die
# lokalen Rahmenbedingungen und versehen mit Kommentaren
# Django : 2011-12-08
 
# Konfigurationsverzeichnis der IMAP-Servers, in dem die Informationen
# wie die Berechtigungen, Quotas, und Informationen übder die
# Mailboxen gespeichert
configdirectory: /var/lib/imap
 
# Die Default-Partition, in der alle neuen User angelegt werden.
partition-default: /var/spool/imap
 
# postmaster, gibt den Postmaster an, also den E-Mail Administrator. Dies ist auch die
# Absenderadresse, die bei Versenden von Empfangsbestätigungen von sieve verwendet wird.
postmaster: postmaster
 
# Der Benutzer mit den Administratoren-Rechten
admins: cyrus
 
# Sieve ist ein Filter, mit dem Nachrichten automatisch bei der Zustellung in verschiedene
# Postfächer / Ordner einsortiert. In diesem Verzeichnis wird nach den sieve-Scripten gesucht.
sievedir: /var/lib/imap/sieve
 
# Pfadangaben zum Befehl sendmail. Sieve verschickt über den Befehl sendmail 
# Reject-, Redirect- und Vacation-Nachrichten
sendmail: /usr/sbin/sendmail
 
# Definition des Hostnamens der bei der Begrüßungsmeldung des POP, IMAP und LMTP Daemon 
# ausgegeben wird.
servername: imap.nausch.org
 
# Festlegung welche Daten des Servers bei der Begrüßungsmeldung und des Funktionsumfanges
# des Servers ausgegeben werden sollen.
#     "off" = keinerlei Ausgabe
#     "min" = Ausgabe des Servernamens bei der Begrüßung, Keine Angaben zum Funktionsumfang
#             des Servers 
#     "on"  = Ausgabe des Servernamens und der Version bei der Begrüßung; Ausgabe des
#             Cyrus-Version bei der Abfrage der Fähigkeiten
serverinfo: min
 
# Für die IMAP-Verzeichnisstrukturen werden Hash-Werte gebildet, was den Zugriff
# wesentlich beschleunigt. Die Verzeichnisstruktur wird dabei wesentlich fein-
# granularer, so wird aus /var/spool/imap/user/django /var/spool/imap/d/user/django
hashimapspool: yes
 
# anonymen Benutzerzugang sperren, bedeutet, wie der Name schon sagt, 
# dass sich alle Benutzer authentifizieren müssen. 
allowanonymouslogin: no
 
# Plaintexteingabe beim Lpgin erlauben? Nur zum Testen und Spielen von web-cyradm aktiviert.
allowplaintext: no
 
# Virtuellen Domain-Support aktivieren, d.h. Cyrus erzeugt die neuen Nutzerpostfächer
# jeweils unter der betreffenden Domainstruktur
virtdomains: yes
 
# Unqualifizierte Postfächer werden unterhalb des des user-Verzeichnisses der
# default-Domäne angeordnet
# defaultdomain: nausch.org
 
# Nutzung des auxprop-Plugins zur Benutzer-Authentifizierung
sasl_pwcheck_method: auxprop
# Nutzung des ldapdb-Treibers für den Zugriff auf einen OpenLDAP-Server
sasl_auxprop_plugin: ldapdb
 
# Nutzerauthentifizierung mit Hilfe folgender Verfahren:
#                         Klartextpasswörtern
#                         verschlüsselten Passwörtern (CRAM-MD5 oder DIGEST-MD5)
#sasl_mech_list: DIGEST-MD5 CRAM-MD5
sasl_mech_list: DIGEST-MD5 CRAM-MD5 PLAIN LOGIN
 
# Definition der Anbindung an unseren zentralen LDAP-Server
sasl_ldapdb_uri: ldap://ldap.dmz.nausch.org
sasl_ldapdb_id: SASLSystemUser
sasl_ldapdb_pw: klais-is-a-geek!
sasl_ldapdb_mech: DIGEST-MD5
 
# Konvertieren der Usernamen in Kleinbuchstaben vor dem Login/Authentifizierung
username_tolower: yes
 
# lmtpd gibt einen permaneten Fehlercode zurück, wenn die Quota einer User-Mailbox 
# ausgereizt wurde. 
lmtp_overquota_perm_failure: yes
 
# lmtpd konvertiert automatisch Empfängeradressen in Kleinbuchstaben
lmtp_downcase_rcpt: yes
 
# Ein Wert größer als Null setzt einen Quo in kByte. Ein Wert der nicht 0 ist, 
# erlaubt dem Benutzer das anlegen seiner eigenen INBOX
autocreatequota: 2048000
 
# Sobald 90% der Quota erreicht ist, gibt der Server Warnmeldungen aus
quotawarn: 90
 
# Postfach wird angelegt, wenn per lmtpd eine Nachricht angeliefert wird,
# für die noch kein Inbox besteht
createonpost: no
 
# Loggt sich ein User neu an, oder es wird eine Nachricht per lmtpd 
# angeliefert, für das noch kein Account besteht, so wird dieser automatisch 
# mit den definierten Ordnern angelegt
###autocreateinboxfolders: inbox|achive
autocreateinboxfolders: Archives | Drafts | Sent | Trash
 
# Loggt sich ein User neu an, oder es wird eine Nachricht per lmtpd 
# angeliefert, für das noch kein Account besteht, so werden automatisch 
# folgende Ordner abboniert
autosubscribeinboxfolders: Archives | Drafts | Sent | Trash
 
# Ist diese Option auf " yes" gesetzt, würde Cyrus keine E-Mails im 
# 8 Bit Format annehmen. Ist sie auf "no", so wandelt Cyrus die 
# Zeichen in 7 Bit um.
reject8bit: no
 
# Nach 30 Minuten IMAP-Untätigkeit den Benutzer automatisch abmelden
timeout: 30
 
# Normalerweise trennt Cyrus IMAP Ordern mit einem ".". Mit der Option: 
# "unixhierarchysep", kann man die Ordner mit einem "/" trennen lassen. 
# Wichtig wird diese Option sobald Benutzernamen Punkte enthalten. 
unixhierarchysep: yes
 
# TLS-Einstellungen für IMAP over SSL (Port 993)
tls_cert_file: /etc/pki/cyrus-imapd/servercert.pem
tls_key_file: /etc/pki/cyrus-imapd/serverkey.pem
tls_ca_file: /etc/pki/cyrus-imapd/cacert-root.pem
 
# uncomment this if you're operating in a DSCP environment (RFC-4594)
# qosmarking: af13

In der Konfigurationsdatei /etc/cyrus.conf wird der Cyrus-Master-Server konfiguriert und festgelegt, welche Dienste der Server anbieten soll. Mit unserem Standardeditor bearbeiten wir diese Datei und deaktivieren alle ungewollten Dienste.

 # vim /etc/cyrus.conf
/etc/cyrus.conf
# Defaultkonfigurationsdatei aus dem RPM-Paket cyrus-imapd angepasst an die
# lokalen Rahmenbedingungen und versehen mit Kommentaren
# Django : 2011-12-08
 
START {
  # do not delete this entry!
  recover	cmd="ctl_cyrusdb -r"
 
  # this is only necessary if using idled for IMAP IDLE
  idled		cmd="idled"
}
 
# UNIX sockets start with a slash and are put into /var/lib/imap/sockets
SERVICES {
  # add or remove based on preferences
  imap		cmd="imapd" listen="imap" prefork=5
  # Django : 2011-12-08 
  # nachfolgende drei Zeilen deaktiviert, da wir vorerst "nur" die beiden
  # Dienste imap und sieve nutzen wollen und werden
  #  imaps		cmd="imapd -s" listen="imaps" prefork=1
  #  pop3		cmd="pop3d" listen="pop3" prefork=3
  #  pop3s		cmd="pop3d -s" listen="pop3s" prefork=1
  sieve		cmd="timsieved" listen="sieve" prefork=0
 
  # these are only necessary if receiving/exporting usenet via NNTP
  #  nntp		cmd="nntpd" listen="nntp" prefork=3
  #  nntps		cmd="nntpd -s" listen="nntps" prefork=1
 
  # at least one LMTP is required for delivery
  # Django : 2011-12-08 weitergabe des MTA (Postfix) an den MDA (Cyrus) über einen
  # lokalen UNIX-Dateisocket, sofern sich der MTA und MDA auf einem Server befindet.
  # lmtpunix      cmd="lmtpd" listen="/var/lib/imap/socket/lmtp" prefork=1
  #
  # Befindet sich der MTA und MDA auf zwei getrennten Servern, so wird die 
  # Anbindung über eine TCP/IP-Verbindung realisiert.
  lmtp		cmd="lmtpd" listen="lmtp" prefork=0
 
  lmtpunix	cmd="lmtpd" listen="/var/lib/imap/socket/lmtp" prefork=1
 
  # this is only necessary if using notifications
  # Django : 2011-12-08
  # Informationen über eintreffende Nachrichten an ein weiteres Postfach
  # weiterleiten.
  notify	cmd="notifyd" listen="/var/lib/imap/socket/notify" proto="udp" prefork=1
}
 
EVENTS {
  # this is required
  checkpoint	cmd="ctl_cyrusdb -c" period=30
 
  # this is only necessary if using duplicate delivery suppression,
  # Sieve or NNTP
  delprune	cmd="cyr_expire -E 3" at=0400
 
  # this is only necessary if caching TLS sessions
  tlsprune	cmd="tls_prune" at=0400
  # Django : 2011-12-08 
  # Damit bei einer Suche in den Mailboxen von einem Client nicht alle Mails einzeln 
  # aufgerufen werden und durchsucht werden müssen, nutzen wir den Dienst *squatter*,
  # der einen Index der Mailboxen in regelmäßigen Abständen (30 Minuten) erstellt.
  squatter      cmd="squatter -r *" period=30
}

Damit unser Mailserver Postfix, der die Nachrichten von fremden Mailserver annimmt, bewertet und prüft, auch an unser internes Postoffice weiterleiten kann, sind noch Ergänzungen an der Konfiguration des Postfix-Mailservers notwendig.

Hier kommt es nun im Detail darauf an, auf welchen Hosts unser Postfix-SMTP-Server und wo der Cyrus-IMAP-Server betrieben wird.

MTA und MDA auf gleichem Host

Als erstes betrachten wir den ganzen Konfogurationsaufwand, wenn beide Server auf einem Host betrieben werden.

master.conf

In der /etc/postfix/master.cf ist für cyrus mit der Zustellmethode deliver bereits alles vorbereitet.

 # vim /etc/postfix/master.cf
...
# Django : 2009-02-07 Aktiviert für MDA-Support cyrus aktiviert
# Cyrus 2.1.5 (Amos Gouaux)
# Also specify in main.cf: cyrus_destination_recipient_limit=1
cyrus     unix  -       n       n       -       -       pipe
  user=cyrus argv=/usr/lib/cyrus-imapd/deliver -e -r ${sender} -m ${extension} ${user}
...
main.cf

In der /etc/postfix/main.cf ändern wir nunmehr folgende Optionen ab.

 # vim /etc/postfix/main.cf
...
# Django : 2009-02-07 Aktiviert für MDA-Support cyrus aktiviert
mailbox_transport = cyrus
cyrus_destination_recipient_limit=1
...

MTA und MDA auf getrennten Hosts

Laufen die beiden Mailserverkomponenten auf getrennten Hosts, so ist der nötige Konfigurationsaufwand geringfügig größer. Nachfolgend gehen wir nun auf diese Details genauer ein.

main.cf

Für die individuelle Weiterleitung unserer Nachrichten benutzen wir die beiden Lookup-Tabellen:

  1. transport_maps
  2. relay_domains

Im ersten Schritt erweitern wir nun unsere Postfix-Konfigurationsdatei um folgende Zeilen. Hierzu nutzen wir wie immer den Editor unserer Wahl, so z.B. vim.

 # vim /etc/postfix/main.cf
# Django : 2012-02-06
# Zur Weitergabe der angenommenen Nachrichten an das backend-System (Cyrus-IMAP-Server) verwenden wir
# eine separate Tabelle zur individuellen Weiterleitung. 
relay_domains = btree:/etc/postfix/relay_domains
 
# Lookup-Tabelle zum Aktivieren einer alternativen Mailrouting bei der Zustellung an einen weiteren Mailserver
transport_maps = btree:/etc/postfix/transport_maps, btree:/etc/postfix/relay_domains

Die gerade definierten Lookup-Tabellen legen wir nun als nächstes an.

  1. transport_maps: Lookup-Tabelle zum Aktivieren einer alternativen Mailrouting bei der Zustellung an einen weiteren Mailserver
     # vim /etc/postfix/transport_maps
    # Kapitel 5.2.5 transport-Tabelle: Abweichende Zustellung
    # Lookup-Tabelle zum Aktivieren einer alternativen Mailrouting bei der Zustellung an einen weiteren Mailserver
    # Nach dem Ändern und/oder Erweitern der Tabelle, muß noch mittels  $ postmap /etc/postfix/transport_maps
    # die zugehörige Datenbank erzeugt werden.
    #
    # Alle eMails, die an Subdomains von nausch.org gerichtet sind ("." am Anfang der Zeile!)
    # werden an den/die Mailserver von intra.nausch.org (MX-Records) weitergeleitet. (keine "["-Klammern!)
    #.nausch.org                            smtp:intra.nausch.org
     
    # Mails an backup.nausch.org werden an den Mailserver (A-Record) auf Port 25 mit Namen mail.intra.nausch.org geschickt.
    #backup.nausch.org                      smtp:[mail.intra.nausch.org]:25
  2. relay_domains: Lookup-Tabelle zur Definition der Domänen, für die unser Mailserver Nachricht annehmen soll.
     # vim /etc/postfix/relay_domains
    # Kapitel 12.1 Postfix als eingehendes Mailrelay vor einem anderen Server
    # Lookup-Tabelle zur Definition der Domänen, für die unser Mailserver Nachricht annehmen soll.
    # Nach dem Ändern und/oder Erweitern der Tabelle, muß noch mittels  $ postmap /etc/postfix/relay_domains
    # die zugehörige Datenbank erzeugt werden.
    #
    # Relevanz ost erst eimal nur die erste Spalte. Die zweite Spalte dient nur zum Erhalten der Tabellenstruktur und
    # kann daher z.B. als Hinweisfled zum Dokumentieren verwendet werden.
    # Beispiel:
    # omni128.de                    meine eigene Domäne
  3. transport_maps UND relay_domains: Da wir sowieso beide Informationen benötigen können wir auch gleich direkt den jeweiligen Transportweg direkt in der zweiten Spalte der relay_domains-Tabelle hierzu verwenden.
     # vim /etc/postfix/relay_domains
    # Kapitel 12.1 Postfix als eingehendes Mailrelay vor einem anderen Server
    # Lookup-Tabelle zur Definition der Domänenm für die unser Mailserver Nachricht annehmen soll.
    # Nach dem Ändern und/oder Erweitern der Tabelle, muß noch mittels  $ postmap /etc/postfix/relay_domains
    # die zugehörige Datenbank erzeugt werden.
    #
    # Relevanz ost erst eimal nur die erste Spalte. Die zweite Spalte dient nur zum Erhalten der Tabellenstruktur und
    # kann daher z.B. als Hinweisfled zum Dokumentieren verwendet werden.
    # Beispiel:
    # omni128.de                    meine eigene Domäne
    #
    # Da für jede Domäne auch ein Transportweg definiert werden muss, erledigen wir die Definition des selbigen gleich 
    # hier in dieser Tabelle, in dem wir die Spalte zwei hierzu verwenden.
    nausch.org                      lmtp:[imap.intra.nausch.org]:24
    omni128.de                      lmtp:[imap.intra.nausch.org]:24
    wetterstation-pliening.info     lmtp:[imap.intra.nausch.org]:24
    ebersberger-liedersammlung.de   lmtp:[imap.intra.nausch.org]:24
master.conf

In der /etc/postfix/master.cf ist für die Zustellung an unseren Cyrus-IMAP-Server mit dem Zustellprotokoll lmtp bereits alles vorbereitet.

 # vim /etc/postfix/master.cf
...
local     unix  -       n       n       -       -       local
...

In der Regel wird unser IMAP-Hinter einer Firewall stehen und mit Hilfe von iptables abgesichert sein. Damit nun unser IMAP-Mailserver Anfragen auf den beiden Ports 143 und 993 auch annehmen kann, tragen wir in der zentralen Konfigurationsdatei /etc/sysconfig/iptables von iptables am Ende der INPUT-Regeln nachfolgende Zeilen ein.

 vim /etc/sysconfig/iptables
 # Django : 2011-12-08 Port 143 (IMAP2) und 993 (IMAP over SSL) freigeschaltet
 -A INPUT -m state --state NEW -m tcp -p tcp --dport 143 -j ACCEPT
 -A INPUT -m state --state NEW -m tcp -p tcp --dport 993 -j ACCEPT
 # end

Anschließend aktivieren wir die Änderungen an unserem Paketfilter, indem wir den Daemon durchstarten.

 # service iptables restart
 iptables: Flushing firewall rules:                         [  OK  ]
 iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
 iptables: Unloading modules:                               [  OK  ]
 iptables: Applying firewall rules:                         [  OK  ]

Der Cyrus-IMAP-Server unterstützt bei der Authentifizierung der unterschiedlichen Nutzer mehrere Authentifizierungsmethoden.

Für weitergehende und tiefgreifende Erklärungen zu den Authentifizierungsmöglichkeiten mit Cyrus SASL, sei dem geneigtem Leser die überhaus hilfreiche Dokumentation von Authentifizierung mit Cyrus SASL von Peer Heinlein ans Herz gelegt!

Nachfolgend gehen wir auf die wichtigsten drei Varianten ein.

  • cyrus-sasl-plain: Nutzerauthentifizierung mit Hilfe von Klartextpassworten
  • cyrus-sasl-md5: Nutzerauthentifizierung mit Hilfe von verschlüsselten Passwörtern (CRAM-MD5 oder DIGEST-MD5)
  • cyrus-sasl-ldap: Nutzerauthentifizierung mit Anbindung an einen LDAP-Server

Mit Hilfe des Programms pluginviewer aus dem PRM cyrus-sasl können alle zur Verfügung stehenden und ladbaren SASL Plugins und deren Einstellungen angezeigt werden.

  1. Ausgabe der auxprop-plugins
     # pluginviewer -a
    Installed auxprop mechanisms are:
    sasldb
    List of auxprop plugins follows
    Plugin "sasldb" , 	API version: 4
    	supports store: yes
  2. Ausgabe der Serverseitigen Authentifizierungsplugins (SASL)
     # pluginviewer -s
    Installed SASL (server side) mechanisms are:
    PLAIN LOGIN ANONYMOUS EXTERNAL
    List of server plugins follows
    Plugin "plain" [loaded], 	API version: 4
    	SASL mechanism: PLAIN, best SSF: 0, supports setpass: no
    	security flags: NO_ANONYMOUS
    	features: WANT_CLIENT_FIRST|PROXY_AUTHENTICATION
    Plugin "login" [loaded], 	API version: 4
    	SASL mechanism: LOGIN, best SSF: 0, supports setpass: no
    	security flags: NO_ANONYMOUS
    	features:
    Plugin "anonymous" [loaded], 	API version: 4
    	SASL mechanism: ANONYMOUS, best SSF: 0, supports setpass: no
    	security flags: NO_PLAINTEXT
    	features: WANT_CLIENT_FIRST
  3. Ausgabe der Clientseitigen Authentifizierungsplugins (SASL)
     # pluginviewer -c
    Installed SASL (client side) mechanisms are:
    PLAIN LOGIN ANONYMOUS EXTERNAL
    List of client plugins follows
    Plugin "plain" [loaded], 	API version: 4
    	SASL mechanism: PLAIN, best SSF: 0
    	security flags: NO_ANONYMOUS
    	features: WANT_CLIENT_FIRST|PROXY_AUTHENTICATION
    Plugin "login" [loaded], 	API version: 4
    	SASL mechanism: LOGIN, best SSF: 0
    	security flags: NO_ANONYMOUS
    	features: SERVER_FIRST
    Plugin "anonymous" [loaded], 	API version: 4
    	SASL mechanism: ANONYMOUS, best SSF: 0
    	security flags: NO_PLAINTEXT
    	features: WANT_CLIENT_FIRST
    Plugin "EXTERNAL" [loaded], 	API version: 4
    	SASL mechanism: EXTERNAL, best SSF: 0
    	security flags: NO_ANONYMOUS|NO_PLAINTEXT|NO_DICTIONARY
    	features: WANT_CLIENT_FIRST|PROXY_AUTHENTICATION

Sofern noch nicht bei der Grundinstallation erfolgt, installieren wir nun das notwendige RPM mit Hilfe von yum.

 # yum install cyrus-sasl-plain -y

Bei Bedarf verrät uns der Aufruf von rpm -qil die Inhalte, die wir mit Hilfe des RPM-Paketes installiert haben.

 # rpm -qil cyrus-sasl-plain
Name        : cyrus-sasl-plain             Relocations: (not relocatable)
Version     : 2.1.23                            Vendor: CentOS
Release     : 13.el6                        Build Date: Wed 07 Dec 2011 11:02:22 PM CET
Install Date: Wed 21 Dec 2011 09:11:29 AM CET      Build Host: c6b18n3.bsys.dev.centos.org
Group       : System Environment/Libraries   Source RPM: cyrus-sasl-2.1.23-13.el6.src.rpm
Size        : 37616                            License: BSD
Signature   : RSA/SHA1, Thu 08 Dec 2011 08:53:00 PM CET, Key ID 0946fca2c105b9de
Packager    : CentOS BuildSystem <http://bugs.centos.org>
URL         : http://asg.web.cmu.edu/sasl/sasl-library.html
Summary     : PLAIN and LOGIN authentication support for Cyrus SASL
Description :
The cyrus-sasl-plain package contains the Cyrus SASL plugins which support
PLAIN and LOGIN authentication schemes.
/usr/lib64/sasl2/liblogin.so
/usr/lib64/sasl2/liblogin.so.2
/usr/lib64/sasl2/liblogin.so.2.0.23
/usr/lib64/sasl2/libplain.so
/usr/lib64/sasl2/libplain.so.2
/usr/lib64/sasl2/libplain.so.2.0.23

Sofern noch nicht bei der Grundinstallation erfolgt, installieren wir nun das notwendige RPM mit Hilfe von yum.

 # yum install cyrus-sasl-md5 -y

Bei Bedarf verrät uns der Aufruf von rpm -qil die Inhalte, die wir mit Hilfe des RPM-Paketes installiert haben.

 # rpm -qil cyrus-sasl-md5
Name        : cyrus-sasl-md5               Relocations: (not relocatable)
Version     : 2.1.23                            Vendor: CentOS
Release     : 13.el6                        Build Date: Wed 07 Dec 2011 11:02:22 PM CET
Install Date: Wed 18 Jan 2012 11:16:58 PM CET      Build Host: c6b18n3.bsys.dev.centos.org
Group       : System Environment/Libraries   Source RPM: cyrus-sasl-2.1.23-13.el6.src.rpm
Size        : 75024                            License: BSD
Signature   : RSA/SHA1, Thu 08 Dec 2011 08:53:18 PM CET, Key ID 0946fca2c105b9de
Packager    : CentOS BuildSystem <http://bugs.centos.org>
URL         : http://asg.web.cmu.edu/sasl/sasl-library.html
Summary     : CRAM-MD5 and DIGEST-MD5 authentication support for Cyrus SASL
Description :
The cyrus-sasl-md5 package contains the Cyrus SASL plugins which support
CRAM-MD5 and DIGEST-MD5 authentication schemes.
/usr/lib64/sasl2/libcrammd5.so
/usr/lib64/sasl2/libcrammd5.so.2
/usr/lib64/sasl2/libcrammd5.so.2.0.23
/usr/lib64/sasl2/libdigestmd5.so
/usr/lib64/sasl2/libdigestmd5.so.2
/usr/lib64/sasl2/libdigestmd5.so.2.0.23

Sofern noch nicht bei der Grundinstallation erfolgt, installieren wir nun das notwendige RPM mit Hilfe von yum.

 # yum install cyrus-sasl-ldap -y

Bei Bedarf verrät uns der Aufruf von rpm -qil die Inhalte, die wir mit Hilfe des RPM-Paketes installiert haben.

 # rpm -qil cyrus-sasl-ldap
Name        : cyrus-sasl-ldap              Relocations: (not relocatable)
Version     : 2.1.23                            Vendor: CentOS
Release     : 13.el6                        Build Date: Wed 07 Dec 2011 11:02:22 PM CET
Install Date: Wed 18 Jan 2012 11:19:41 PM CET      Build Host: c6b18n3.bsys.dev.centos.org
Group       : System Environment/Libraries   Source RPM: cyrus-sasl-2.1.23-13.el6.src.rpm
Size        : 18784                            License: BSD
Signature   : RSA/SHA1, Thu 08 Dec 2011 08:53:06 PM CET, Key ID 0946fca2c105b9de
Packager    : CentOS BuildSystem <http://bugs.centos.org>
URL         : http://asg.web.cmu.edu/sasl/sasl-library.html
Summary     : LDAP auxprop support for Cyrus SASL
Description :
The cyrus-sasl-ldap package contains the Cyrus SASL plugin which supports using
a directory server, accessed using LDAP, for storing shared secrets.
/usr/lib64/sasl2/libldapdb.so
/usr/lib64/sasl2/libldapdb.so.2
/usr/lib64/sasl2/libldapdb.so.2.0.23

Mit Hilfe des Programms pluginviewer aus dem PRM cyrus-sasl überprüfen wir nun erneut, welche SASL-Plugins nun zur Verfügung stehen und geladen werden können.

SASL Server-Plugins

 # pluginviewer -s
Installed SASL (server side) mechanisms are:
PLAIN LOGIN ANONYMOUS CRAM-MD5 DIGEST-MD5 EXTERNAL
List of server plugins follows
Plugin "plain" [loaded], 	API version: 4
	SASL mechanism: PLAIN, best SSF: 0, supports setpass: no
	security flags: NO_ANONYMOUS
	features: WANT_CLIENT_FIRST|PROXY_AUTHENTICATION
Plugin "login" [loaded], 	API version: 4
	SASL mechanism: LOGIN, best SSF: 0, supports setpass: no
	security flags: NO_ANONYMOUS
	features:
Plugin "anonymous" [loaded], 	API version: 4
	SASL mechanism: ANONYMOUS, best SSF: 0, supports setpass: no
	security flags: NO_PLAINTEXT
	features: WANT_CLIENT_FIRST
Plugin "crammd5" [loaded], 	API version: 4
	SASL mechanism: CRAM-MD5, best SSF: 0, supports setpass: no
	security flags: NO_ANONYMOUS|NO_PLAINTEXT
	features: SERVER_FIRST
Plugin "digestmd5" [loaded], 	API version: 4
	SASL mechanism: DIGEST-MD5, best SSF: 128, supports setpass: no
	security flags: NO_ANONYMOUS|NO_PLAINTEXT|MUTUAL_AUTH
	features: PROXY_AUTHENTICATION

SaSL Client-Plugins

 # pluginviewer -c
Installed SASL (client side) mechanisms are:
PLAIN LOGIN ANONYMOUS CRAM-MD5 DIGEST-MD5 EXTERNAL
List of client plugins follows
Plugin "plain" [loaded], 	API version: 4
	SASL mechanism: PLAIN, best SSF: 0
	security flags: NO_ANONYMOUS
	features: WANT_CLIENT_FIRST|PROXY_AUTHENTICATION
Plugin "login" [loaded], 	API version: 4
	SASL mechanism: LOGIN, best SSF: 0
	security flags: NO_ANONYMOUS
	features: SERVER_FIRST
Plugin "anonymous" [loaded], 	API version: 4
	SASL mechanism: ANONYMOUS, best SSF: 0
	security flags: NO_PLAINTEXT
	features: WANT_CLIENT_FIRST
Plugin "crammd5" [loaded], 	API version: 4
	SASL mechanism: CRAM-MD5, best SSF: 0
	security flags: NO_ANONYMOUS|NO_PLAINTEXT
	features: SERVER_FIRST
Plugin "digestmd5" [loaded], 	API version: 4
	SASL mechanism: DIGEST-MD5, best SSF: 128
	security flags: NO_ANONYMOUS|NO_PLAINTEXT|MUTUAL_AUTH
	features: PROXY_AUTHENTICATION|NEED_SERVER_FQDN
Plugin "EXTERNAL" [loaded], 	API version: 4
	SASL mechanism: EXTERNAL, best SSF: 0
	security flags: NO_ANONYMOUS|NO_PLAINTEXT|NO_DICTIONARY
	features: WANT_CLIENT_FIRST|PROXY_AUTHENTICATION

Bevor wir uns nun an die Konfiguration der SASL-Unterstützung am OpenLDAP-Server machen, wollen wir uns noch kurz überlegen, wie wir die Passworte in der Datenbank ablegen. Die vermutlich vordergründigste, oft geübte und gängige Praxis ist wohl die Passworte nicht direkt in der Datenbank abzulegen, sondern gehashte Speicherungen vorzunehmen. Die Passworte in der /etc/shadow ist eine gängige Variante dieses Vorgehends.

 # grep django /etc/shadow
 django:$6$h6QWOPz5$053ur$Ch1kiS731nV0lLD3pPYQf1p0vk72XgPinPXjn32ZQmlTR0HRfB4aPelNJ1CFYF9pT3qt97bbSVUnxrB1:15187:0:99999:7:::

Will nun der Server bei der Anmeldung überprüfen benötigt er was? Genau das Passwort in Klartext! denn Nur so ist er in der Lage, den Passworthash des übermittelten Klartextpasswortes mit dem Hash in seiner Datenbank zu vergleichen. Ist nun jemand in der Lage die Übertragung zu kompromittieren, hält er unweigerlich die Anmeldedaten in Händen. Und wer will das? Keiner!

Mit Hilfe von CRAM5) haben wir nun ein Authentifizierungsverfahren an der Hand, mit der wir das Vorgenannte Problem mit der Übertragung eines Passwortes elegant umschiffen. Denn beim Anmeldevorgang erzeugt der Server bei der Clientanfrage einen individuellen Sitzungsschlüssel, das Challenge, welches der Server zum Client überträgt. Client und Server führen nun eine mathematische Operation mit dem nur ihnen bekannten Passwort durch. Das Rechenergebnis übermittelt der Client an den Server, der den empfangenen Wert mit seinem errechneten Ergebnis der zuvor angestellten Operation vergleicht. Stimmen die Ergebnisse überein, so kann der Server mit davon ausgehen, dass hat der Client das richtige Passwort kennt und verwendet! Ein Abhören der Leitung bringt nichts, da sich bei jeder Sitzung der Challenge-Wert ändert - ein abgefangenens Challenge ist für künftige Loginversuche daher völlig wertlos!

Damit unser Server auch wirklich sichere Authentifizierungsmethoden anbieten kann, ist es notwendig die Passworte der Nutzer in der Datenbank in Klartext abzulegen.

Nur so ist sichergestellt, dass die Passworte nie über das Internet übertragen werden müssen. Denn dort liegt das größte Bedrohungspotential. Unser Postmaster und Netzwerkadministrator hat auch ohne Passwort jederzeit die Möglichkeit auf Daten der Nutzer zuzugreifen!

Da wir zur Nutzerverwaltung beim Cyrus-IMAP-Server auf unser zentralen Verzeichnisdienst OpenLDAP zurückgreifen wollen, müssen wir noch die Konfiguration am zentralen LDAP-server erweiteren. Ein bereits installieren und funktionsfähigen LDAP-Server wird bei der weiteren Konfiguration vorausgesetzt.

Der Cyrus-IMAP-Mailserver, bietet mehrere Verfahren zur Authentifizierung der einzelnen Benutzer bzw. eMail-Konten an. Bei unserer Installation wollen wir auf die folgenden beiden Methoden zurückgreifen:

  1. Authentifizierung durch „Klartext“-Passwörter
  2. Authentifizierung durch „MD5-Verschlüsselten“-Passwörter (CRAM-MD5 und DIGEST-MD5)

Installation

Für die Realisierung der Authentifizierungsmethode benötigen wir nun die betreffenden RPM-Pakete aus dem Base-Repository von CentOS 6.x, die wir mit Hilfe der Paketmanager yum installieren.

  1. cyrus-sasl-plain
    # yum install cyrus-sasl-plain -y

    Bei Bedarf informieren wir uns mit Hilfe des Aufrufes rpm -qil darüber, was genau nun dieses Paket bei der Installation mitbrachte.

    # rpm -qil cyrus-sasl-plain
    Name        : cyrus-sasl-plain             Relocations: (not relocatable)
    Version     : 2.1.23                            Vendor: CentOS
    Release     : 13.el6                        Build Date: Wed 07 Dec 2011 11:02:22 PM CET
    Install Date: Thu 09 Feb 2012 08:52:57 PM CET      Build Host: c6b18n3.bsys.dev.centos.org
    Group       : System Environment/Libraries   Source RPM: cyrus-sasl-2.1.23-13.el6.src.rpm
    Size        : 37616                            License: BSD
    Signature   : RSA/SHA1, Thu 08 Dec 2011 08:53:00 PM CET, Key ID 0946fca2c105b9de
    Packager    : CentOS BuildSystem <http://bugs.centos.org>
    URL         : http://asg.web.cmu.edu/sasl/sasl-library.html
    Summary     : PLAIN and LOGIN authentication support for Cyrus SASL
    Description :
    The cyrus-sasl-plain package contains the Cyrus SASL plugins which support
    PLAIN and LOGIN authentication schemes.
    /usr/lib64/sasl2/liblogin.so
    /usr/lib64/sasl2/liblogin.so.2
    /usr/lib64/sasl2/liblogin.so.2.0.23
    /usr/lib64/sasl2/libplain.so
    /usr/lib64/sasl2/libplain.so.2
    /usr/lib64/sasl2/libplain.so.2.0.23
  2. cyrus-sasl-md5
    # yum install cyrus-sasl-md5 -y

    Bei Bedarf informieren wir uns mit Hilfe des Aufrufes rpm -qil darüber, was genau nun dieses Paket bei der Installation mitbrachte.

    # rpm -qil cyrus-sasl-md5
    Name        : cyrus-sasl-md5               Relocations: (not relocatable)
    Version     : 2.1.23                            Vendor: CentOS
    Release     : 13.el6                        Build Date: Wed 07 Dec 2011 11:02:22 PM CET
    Install Date: Thu 09 Feb 2012 09:00:51 PM CET      Build Host: c6b18n3.bsys.dev.centos.org
    Group       : System Environment/Libraries   Source RPM: cyrus-sasl-2.1.23-13.el6.src.rpm
    Size        : 75024                            License: BSD
    Signature   : RSA/SHA1, Thu 08 Dec 2011 08:53:18 PM CET, Key ID 0946fca2c105b9de
    Packager    : CentOS BuildSystem <http://bugs.centos.org>
    URL         : http://asg.web.cmu.edu/sasl/sasl-library.html
    Summary     : CRAM-MD5 and DIGEST-MD5 authentication support for Cyrus SASL
    Description :
    The cyrus-sasl-md5 package contains the Cyrus SASL plugins which support
    CRAM-MD5 and DIGEST-MD5 authentication schemes.
    /usr/lib64/sasl2/libcrammd5.so
    /usr/lib64/sasl2/libcrammd5.so.2
    /usr/lib64/sasl2/libcrammd5.so.2.0.23
    /usr/lib64/sasl2/libdigestmd5.so
    /usr/lib64/sasl2/libdigestmd5.so.2
    /usr/lib64/sasl2/libdigestmd5.so.2.0.23

Anschließend starten wir unseren OpenLDAP-Server einmal durch.

 # service slapd restart
 Stopping slapd:                                            [  OK  ]
 Starting slapd:                                            [  OK  ]

Fragen wir nun die unterstützten SASL-Mechanismen ab, so werden uns die beiden gerade installierten Cyrus-SASL-Mechanismen, angeboten. Hierzu verwenden wir folgenden Aufruf:

  # ldapsearch -LLL -ZZ -x -H ldap://ldap.dmz.nausch.org -s "base" -b "" -W -D "cn=Manager,dc=nausch,dc=org" supportedSASLMechanisms
Enter LDAP Password: 
dn:
supportedSASLMechanisms: DIGEST-MD5
supportedSASLMechanisms: PLAIN
supportedSASLMechanisms: CRAM-MD5
supportedSASLMechanisms: LOGIN

Wie schon bei der Konfiguration des OpenLDAP-Servers, wollen wir bei der SASL-Authentifizierung einen technischen User verwenden. Wir legen uns daher im ersten Schritt einen eigenen speziellen technischen User an, mit dem später die Anfragen an unseren OpenLDAP-Server gerichtet werden sollen.

SASLAuthenticationUser

Der Einfachheit halber wollen wir hierzu folgenden User in unserem DIT6) hinterlegen:

  • uid=SASLAuthenticationUser,dc=nausch,dc=org

Zur sicheren Übertragung des Anmeldeschlüssels, speichern wir auch dieses Passwort des technischen Useres in Klartext in der Datenbank ab. Hierzu stellen wir die Verschlüsselung der Passworte von SSHA von CLEARTEXT um. Hierzu legen wir uns eine Konfigurationsdatei im *.LDIF-Format mit nachfolgendem Inhalt an.

 # vim /etc/openldap/ldif/password-hash.ldif
/etc/openldap/ldif/password-hash.ldif
dn: olcDatabase={-1}frontend,cn=config
delete: olcPasswordHash
olcPasswordHash: {SSHA}
-
add: olcPasswordHash
olcPasswordHash: {CLEARTEXT}

Die Daten aus dieser *.LDIF-Datei übetragen wir nun in den DIT7) unseres OpenLDAP-Servers.

 # ldapmodify -W -x -D cn=config -f /etc/openldap/ldif/password-hash.ldif
 Enter LDAP Password: 
 modifying entry "olcDatabase={-1}frontend,cn=config"

Die Konfiguration unseres technischen Users nehmen wir nun auch mit Hilfe einer *.LDIF-Datei vor. Hierzu legen wir uns folgende Datei an.

 # vim /etc/openldap/ldif/SASLAuthenticationUser.ldif
/etc/openldap/ldif/SASLAuthenticationUser.ldif
dn: uid=SASLAuthenticationUser,dc=nausch,dc=org
cn: SASLAuthenticationUser
sn: SASLAuthenticationUser
uid: SASLAuthenticationUser
objectClass: inetOrgPerson
objectClass: simpleSecurityObject
objectClass: top
userPassword: Klausi-is-a-G33k!
structuralObjectClass: inetOrgPerson
authzTo: ldap:///dc=nausch,dc=org??sub?(objectClass=*)

Bevor wir nun die gerade erstellte *.LDIF-Datei in unseren OpenLDAP-server übertragen können, ist es notwendig den Daemon zu stoppen.

 # service slapd stop
 Stopping slapd:                                            [  OK  ]

Anschließend übertragen wir die Daten aus der *.LDIF-Datei in den DIT8) unseres OpenLDAP-Servers.

 # slapadd -v -l /etc/openldap/ldif/SASLAuthenticationUser.ldif 
 added: "uid=SASLAuthenticationUser,dc=nausch,dc=org" (0000000a)
 _#################### 100.00% eta   none elapsed            none fast!         
 Closing DB...

Zum Schluß starten wir unseren OpenLDAP-Server wieder!

 # service slapd start
 Starting slapd:                                            [  OK  ]

SASL-Mappings

Damit der OpenLDAP-Server überhaupt mit SASL Anfragen umgehen kann, müssen noch zwei Erweiterungen vorgenommen werden.

Weiterführend informationen findet man im Kapitel DIGEST-MD5, wie auch im Mapping Authentication Identities des OpenLDAP-admin Guides

  1. olcAuthzRegexp
    Hierzu legen wir uns eine Konfigurationsdatei im *.LDIF-Format mit nachfolgendem Inhalt an.
    # vim /etc/openldap/ldif/authz-regexp.ldif
    /etc/openldap/ldif/authz-regexp.ldif
    dn: cn=config
    changetype: modify
    add: olcAuthzRegexp
    olcAuthzRegexp: uid=([^,@]*) ldap:///dc=nausch,dc=org??sub?(&(uid=$1)(objectClass=*))

    Die Daten aus dieser *.LDIF-Datei übetragen wir nun in den DIT9) unseres OpenLDAP-Servers.

    # ldapmodify -W -x -D cn=config -f /etc/openldap/ldif/authz-regexp.ldif
    Enter LDAP Password: 
    modifying entry "cn=config"
  2. olcAuthzPolicy
    Hierzu legen wir uns eine Konfigurationsdatei im *.LDIF-Format mit nachfolgendem Inhalt an.
    # vim /etc/openldap/ldif/authz-policy.ldif
    /etc/openldap/ldif/authz-policy.ldif
    dn: cn=config
    changetype: modify
    delete: olcAuthzPolicy
    olcAuthzPolicy: none
    -
    add: olcAuthzPolicy
    olcAuthzPolicy: to

    Die Daten aus dieser *.LDIF-Datei übetragen wir nun in den DIT10) unseres OpenLDAP-Servers.

    # ldapmodify -W -x -D cn=config -f /etc/openldap/ldif/authz-policy.ldif
    Enter LDAP Password: 
    modifying entry "cn=config"

Zum Schluß überprüfen wir nun noch, ob die beiden Konfigurationsänderungen von unserem OpenLDAP-Server auch wirklich akzeptiert wurden.

 # ldapsearch -W -x -D cn=config -b cn=config "(objectclass=olcGlobal)" | grep olcAuth

Nach der Eingabe des oben gezeigten Befehles, geben wir noch das Passwort für unseren OpenLDAP-Server ein und erhalten dann als Antwort:

 olcAuthzPolicy: to
 olcAuthzRegexp: {0}uid=([^,@]*) ldap:///dc=nausch,dc=org??sub?(&(uid=$1)(objectClass=*))

SASL-Access-Rights

Bevor wir uns nun daran machen, die Zugriffsrechte auf die Benutzerstrukturen in unserem DIT11) zu erweitern, sehen wir erst noch einmal an, welche Informationen aktuell gespeichert sind.

 # ldapsearch -W -x -D cn=config -b olcDatabase={-1}frontend,cn=config
Enter LDAP Password: 
# extended LDIF
#
# LDAPv3
# base <olcDatabase={-1}frontend,cn=config> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
 
# {-1}frontend, config
dn: olcDatabase={-1}frontend,cn=config
olcPasswordHash: {CLEARTEXT}
objectClass: olcDatabaseConfig
objectClass: olcFrontendConfig
olcDatabase: {-1}frontend
olcAccess: {0}to attrs=userPassword,shadowLastChange,shadowMax,shadowWarning  by self write  by dn="cn=Manager,dc=nausch,dc=org" write  by dn="cn=Technischeruser,dc=nausch,dc=org" read  by anonymous auth  by * none
olcAccess: {1}to dn="cn=Manager,dc=nausch,dc=org"  by self write  by * none
olcAccess: {2}to dn="cn=Technischeruser,dc=nausch,dc=org"  by self write  by dn="cn=Manager,dc=nausch,dc=org" write  by * none
olcAccess: {3}to dn.regex="cn=([^,]+),ou=Group,dc=nausch,dc=org"  by self write  by dn="cn=Manager,dc=nausch,dc=org" write  by dn="cn=Technischeruser,dc=nausch,dc=org" read  by dn.exact,expand="uid=$1,ou=People,dc=nausch,dc=org" read  by * none
olcAccess: {4}to dn.regex="uid=([^,]+),ou=People,dc=nausch,dc=org"  by self write  by dn="cn=Manager,dc=nausch,dc=org" write  by dn="cn=Technischeruser,dc=nausch,dc=org" read  by dn.exact,expand="uid=$1,ou=People,dc=nausch,dc=org" read  by * none
olcAccess:: ezV9dG8gKiAgYnkgc23ursCh1kiS731nV0lLD3pPVsZiB3cml0ZSAgYnkgZG4uYmFz1uYXVzY2gsZGM9b3JnIiB3cml0ZSAgYnkgKiByZWFkIA==
olcAddContentAcl: FALSE
olcLastMod: TRUE
olcMaxDerefDepth: 0
olcReadOnly: FALSE
olcSchemaDN: cn=Subschema
olcMonitoring: FALSE
 
# search result
search: 2
result: 0 Success
 
# numResponses: 2
# numEntries: 1

Da wir die Konfiguration unseres OpenLDAP-Servers nicht mit Hilfe von Konfigurationsdateien vorgenommen haben, sondern die Konfiguration im OpenLDAP-Server selbst vorhalten, importieren wir auch hier unsere neuen SASL-Access-Rights mit Hilfe einer kleinen ldif-Hilfsdatei. Diese Datei legen wir im Verzeichnis /etc/openldap/ldif ab.

 # vim /etc/openldap/ldif/SASL-Access-Rights.ldif
/etc/openldap/ldif/SASL-Access-Rights.ldif
dn: olcDatabase={-1}frontend,cn=config
delete: olcAccess
olcAccess: {0}
olcAccess: {1}
olcAccess: {2}
olcAccess: {3}
olcAccess: {4}
olcAccess: {5}
-
add: olcAccess
olcAccess: to attrs=userPassword,shadowLastChange,shadowMax,shadowWarning  by self write  by dn="cn=Manager,dc=nausch,dc=org" write  by dn="cn=Technischeruser,dc=nausch,dc=org" read  by dn="uid=SASLAuthenticationUser,dc=nausch,dc=org" read  by anonymous auth  by * none
olcAccess: to dn="cn=Manager,dc=nausch,dc=org"  by self write  by * none
olcAccess: to dn="cn=Technischeruser,dc=nausch,dc=org"  by self write  by dn="cn=Manager,dc=nausch,dc=org" write  by * none
olcAccess: to dn="uid=SASLAuthenticationUser,dc=nausch,dc=org"  by self write  by dn="cn=Manager,dc=nausch,dc=org" write  by * auth
olcAccess: to dn.regex="cn=([^,]+),ou=Group,dc=nausch,dc=org"  by self write  by dn="cn=Manager,dc=nausch,dc=org" write  by dn="cn=Technischeruser,dc=nausch,dc=org" read  by dn="uid=SASLAuthenticationUser,dc=nausch,dc=org" read  by dn.exact,expand="uid=$1,ou=People,dc=nausch,dc=org" read  by * none
olcAccess: to dn.regex="uid=([^,]+),ou=People,dc=nausch,dc=org"  by self write  by dn="cn=Manager,dc=nausch,dc=org" write  by dn="cn=Technischeruser,dc=nausch,dc=org" read  by dn="uid=SASLAuthenticationUser,dc=nausch,dc=org" read  by dn.exact,expand="uid=$1,ou=People,dc=nausch,dc=org" read  by * none
olcAccess: to *  by self write  by dn.base="cn=manager,dc=nausch,dc=org" write  by * read

Anschließend ändern und aktivieren wir nun die Konfiguration unseres OpenLDAP-Servers, indem wir die gerade angelegte *.LDIF-Datei einspielen.

 # ldapmodify -W -x -D cn=config -f /etc/openldap/ldif/SASL-Access-Rights.ldif 
 Enter LDAP Password: 
 modifying entry "olcDatabase={-1}frontend,cn=config"

Abschließend überprüfen wir ob unsere Änderungen übernommen wurden.

 # ldapsearch -W -x -D cn=config -b olcDatabase={-1}frontend,cn=config
Enter LDAP Password: 
# extended LDIF
#
# LDAPv3
# base <olcDatabase={-1}frontend,cn=config> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
 
# {-1}frontend, config
dn: olcDatabase={-1}frontend,cn=config
olcPasswordHash: {CLEARTEXT}
objectClass: olcDatabaseConfig
objectClass: olcFrontendConfig
olcDatabase: {-1}frontend
olcAddContentAcl: FALSE
olcLastMod: TRUE
olcMaxDerefDepth: 0
olcReadOnly: FALSE
olcSchemaDN: cn=Subschema
olcMonitoring: FALSE
olcAccess: {0}to attrs=userPassword,shadowLastChange,shadowMax,shadowWarning  by self write  by dn="cn=Manager,dc=nausch,dc=org" write  by dn="cn=Technisch
 eruser,dc=nausch,dc=org" read  by dn="uid=SASLAuthenticationUser,dc=nausch,dc=org" read  by anonymous auth  by * none
olcAccess: {1}to dn="cn=Manager,dc=nausch,dc=org"  by self write  by * none
olcAccess: {2}to dn="cn=Technischeruser,dc=nausch,dc=org"  by self write  by dn="cn=Manager,dc=nausch,dc=org" write  by * none
olcAccess: {3}to dn="uid=SASLAuthenticationUser,dc=nausch,dc=org"  by self write  by dn="cn=Manager,dc=nausch,dc=org" write  by * auth
olcAccess: {4}to dn.regex="cn=([^,]+),ou=Group,dc=nausch,dc=org"  by self write  by dn="cn=Manager,dc=nausch,dc=org" write  by dn="cn=Technischeruser,dc=na
 usch,dc=org" read  by dn="uid=SASLAuthenticationUser,dc=nausch,dc=org" read  by dn.exact,expand="uid=$1,ou=People,dc=nausch,dc=org" read  by * none
olcAccess: {5}to dn.regex="uid=([^,]+),ou=People,dc=nausch,dc=org"  by self write  by dn="cn=Manager,dc=nausch,dc=org" write  by dn="cn=Technischeruser,dc=
 nausch,dc=org" read  by dn="uid=SASLAuthenticationUser,dc=nausch,dc=org" read  by dn.exact,expand="uid=$1,ou=People,dc=nausch,dc=org" read  by * none
olcAccess: {6}to *  by self write  by dn.base="cn=manager,dc=nausch,dc=org" write  by * read
 
# search result
search: 2
result: 0 Success
 
# numResponses: 2
# numEntries: 1

In RPM wird uns ein Startupscript mitgeliefert - über dieses starten wir unseren IMAP-Server.

 # service cyrus-imapd start
 Importing cyrus-imapd databases:                           [  OK  ]
 Starting cyrus-imapd:                                      [  OK  ]

Ob der Server läuft können wir einfach überprüfen.

 # netstat -tulpen | grep 143
 tcp        0      0 0.0.0.0:143                 0.0.0.0:*                   LISTEN      0          122799     14383/cyrus-master  
 tcp        0      0 0.0.0.0:4190                0.0.0.0:*                   LISTEN      0          122805     14383/cyrus-master  

Oder:

 # lsof -i tcp:imap2
 COMMAND     PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
 cyrus-mas 14383 cyrus    5u  IPv4 122799      0t0  TCP *:imap (LISTEN)
 imapd     14390 cyrus    4u  IPv4 122799      0t0  TCP *:imap (LISTEN)
 imapd     14394 cyrus    4u  IPv4 122799      0t0  TCP *:imap (LISTEN)
 imapd     14396 cyrus    4u  IPv4 122799      0t0  TCP *:imap (LISTEN)
 imapd     14398 cyrus    4u  IPv4 122799      0t0  TCP *:imap (LISTEN)
 imapd     14399 cyrus    4u  IPv4 122799      0t0  TCP *:imap (LISTEN)

Als weiteren Test verbinden wir uns einfach mit Hilfe des Befehles telnet auf Port 143. Nach Eingabe einer Sequenz-Nummer, in unserem Beispiel s001 verlassen wir mit dem Befehl logout wieder den IMAP-Server.

 # telnet localhost 143
 Connected to localhost.
 Escape character is '^]'.
 * OK [CAPABILITY IMAP4 IMAP4rev1 LITERAL+ ID LOGINDISABLED COMPRESS=DEFLATE] vml000070.dmz.nausch.org Cyrus IMAP v2.3.16-Fedora-RPM-2.3.16-6.el6_1.4 server ready
 
 s001 logout
 
 * BYE LOGOUT received
 s001 OK Completed
 Connection closed by foreign host.

Damit nun unser IMAP-Mailserver beim Booten automatisch gestartet wird, nehmen wir noch folgende Konfigurationsschritte vor.

 # chkconfig cyrus-imapd on

Anschließend überprüfen wir noch unsere Änderung:

 # chkconfig --list | grep cyrus-imapd
 cyrus-imapd    	0:off	1:off	2:on	3:on	4:on	5:on	6:off

Genauso wie bei SMTP erfolgt bei LMTP12) erfolgt der Kommunikationsablauf mit Hilfe von Befehlen, wie

  • MAIL FROM
  • RCPT TO
  • DATA
  • LHLO bei LMTP und HELO bzw. EHLO bei SMTP

Wir liefern nun unsere erste Nachricht auf dem Port 24 (LMTP Mail Delivery) ein. Unsere eMail wird dabei folgende Daten umfassen:

  • Einliefernder Host: vml000080.dmz.nausch.org
  • Absenderadresse: michael@nausch.org
  • Empfänger: django@nausch.org

Wir bauen also eine Verbindung zu unserem IMAP-Server auf Port 24 auf.

 # telnet localhost 24
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 imap.nausch.org server ready
LHLO vml000080.dmz.nausch.org
250-imap.nausch.org
250-8BITMIME
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-SIZE
250-STARTTLS
250-AUTH EXTERNAL
250 IGNOREQUOTA
mail from:<michael@nausch.org>
250 2.1.0 ok
rcpt to:<django@nausch.org>
250 2.1.5 ok
DATA
354 go ahead
From: michael@nausch.org
To: Django@nausch.org
Subj: Testmail
Date: 2012-02-20 17:15

Ahoi,
das ist eine Testmail, eingeliefert via telnet imap-server auf Port 24
.
250 2.1.5 Ok
quit
221 2.0.0 bye
Connection closed by foreign host.

Mit dem Programm imtest aus dem Paket cyrus-imapd-utils können wir sowohl den Zugriff auf unseren IMAP-Server testen, wie auch die Mailbox abfragen.

Logintest

Im ersten Schritt testen wir nun den Zugriff auf unseren IMAP-Server.

 # imtest -p imap -a Django -m DIGEST-MD5 localhost

Mit der Zeichenfolge S: werden dabei die Meldungen des Servers und mit C: die Meldungen des Clients gekennzeichnet.

S: * OK [CAPABILITY IMAP4 IMAP4rev1 LITERAL+ ID STARTTLS LOGINDISABLED AUTH=CRAM-MD5 AUTH=DIGEST-MD5 SASL-IR COMPRESS=DEFLATE] imap.nausch.org server ready
C: A01 AUTHENTICATE DIGEST-MD5
S: + bm9uY2U9ImpSaFpFSC9ORjBOJ3ur$1Ck1$T31nR1eSs3nAr$eh0L3S2dSaXVaekJIQ2t2OWJ0RW9SbzROUsRTA9IixyZWFsbT0iaW1hcC5uYXVzY2gub3JnIixxb3A9ImF1dGgsYXV0aC1pbnQsYXV0aC1jb25mIixjaXBoZXI9InJjNC00MCxyYzQtNTYscmM0LGRlcywzZGVzIixtYXhidWY9NDA5NixjaGFyc2V0PXV0Zi04LGFsZ29yaXRobT1tZDUtc2Vzcw==
Please enter your password: 
C: dXNlcm5sg54hbWU9ImluZ2UiLHJlYWJpbWFwLm5hdXNjaC5vcmciLG5vbmNlPSJqUmhaRUgvTkYwTlVSQVdgY2cEtnUml1WnpCSENrdjlidEVvUm80TlArbEUwPSIsY25vbmNlPSJMZjkybi9aSU1qVTRLdTUvb29hSzJJcjRVTFhhKzFBRFM5azF2QVB4d1BJPSIsbmM9MDAwMDAwMDEscW9wPWF1dGgtY29uZixjaXBoZXI9cmM0LG1heGJ1Zj0xMDI0LGRpZ2VzdC11cmk9ImltYXAvbG9jYWxob3N0IixyZXNwb25zZT00NGIwNWU4MGFkNWNhNTUzYTM3NmI5NjM5Nzg3NzU0ZA==
S: + cnNwYXV0a$Up3Rg31leDAxYiN2U0ZWViZGMzZTNhZDZlMWE3YmZhODQ5NGRhODBlMw==
C: 
S: A01 OK Success (privacy protection)
Authenticated.
Security strength factor: 128
C: C01 CAPABILITY
S: * CAPABILITY IMAP4 IMAP4rev1 LITERAL+ ID LOGINDISABLED AUTH=CRAM-MD5 AUTH=DIGEST-MD5 COMPRESS=DEFLATE ACL RIGHTS=kxte QUOTA MAILBOX-REFERRALS NAMESPACE UIDPLUS NO_ATOMIC_RENAME UNSELECT CHILDREN MULTIAPPEND BINARY SORT SORT=MODSEQ THREAD=ORDEREDSUBJECT THREAD=REFERENCES ANNOTATEMORE CATENATE CONDSTORE SCAN IDLE LISTEXT LIST-SUBSCRIBED X-NETSCAPE URLAUTH
S: C01 OK Completed

Das Beispiel zeigt einen erfolgreichen LOGIN bei unserem IMAP-Server. Mit der Sequenznummer 01 und dem Befehl LOGOUT melden wir uns vom IMAP-server wieder ab.

01 LOGOUT
* BYE LOGOUT received
01 OK Completed
Connection closed.

Mailboxabfrage

Im nächsten Schritt fragen wir die Mailbox ab. Hierzu melden wir uns wieder mit Hilfe von imtest an unserem IMAP-Server an.

 # imtest -p imap -a Django -m DIGEST-MD5 localhost

Anschließend fragen wir unsere Testmailbox ab. Hierzu verwenden wir immer die folgende Notation:
Sequenz-Nummer BEFEHL Als erstes lassen wir uns den Inhalt unserer Mailbox anzeigen:

01 LIST "" *
* LIST (\HasChildren) "/" "INBOX"
* LIST (\HasNoChildren) "/" "INBOX/achive"
* LIST (\HasNoChildren) "/" "INBOX/inbox"
01 OK Completed (0.000 secs 4 calls)

Dann fragen wir den Status unserer Mailbox ab:

02 SELECT INBOX
* FLAGS (\Answered \Flagged \Draft \Deleted \Seen)
* OK [PERMANENTFLAGS (\Answered \Flagged \Draft \Deleted \Seen \*)]  
* 1 EXISTS
* 1 RECENT
* OK [UNSEEN 1]  
* OK [UIDVALIDITY 1329754509]  
* OK [UIDNEXT 2]  
* OK [NOMODSEQ] Sorry, modsequences have not been enabled on this mailbox
* OK [URLMECH INTERNAL]
02 OK [READ-WRITE] Completed

Im nächsten Schritt fragen wir den Status der Inbox ab, da wir wissen wollen, ob unsere Testnachricht auch erfolgreich eingestellt wurde.

03 STATUS INBOX (MESSAGES)
* STATUS INBOX (MESSAGES 1)
03 OK Completed

Unsere testnachricht befindet sich also in unserer Inbox und wir holen diese Nachricht ab und lassen uns diese somit am Bildschirm ausgeben.

04 UID fetch 1:1 (UID RFC822.SIZE FLAGS BODY.PEEK[])
* 1 FETCH (FLAGS (\Recent) UID 1 RFC822.SIZE 330 BODY[] {330}
Return-Path: <michael@nausch.org>
Received: from vml000080.dmz.nausch.org (localhost [127.0.0.1])
	 by imap.nausch.org with LMTPA;
	 Mon, 20 Feb 2012 18:28:19 +0100
X-Sieve: CMU Sieve 2.3
From: michael@nausch.org
To: django@nausch.org
Subj: Testmail
Date: 2012-02-20 17:15
Message-ID: <cmu-lmtpd-31727-1329758899-0@imap.nausch.org>

Ahoi,
das ist eine Testmail, eingeliefert via telnet imap-server auf Port 24
)
04 OK Completed (0.000 sec)

Zum Schluß melden wir uns wieder von unserem IMAP-Server ab.

05 LOGOUT
* BYE LOGOUT received
05 OK Completed
Connection closed.

Links


1) , 4)
Mail Delivery Agent
2)
Post Office Protokoll 3
3)
Internet Message Access Protokoll
5)
ChallengeResponseAuthenticationMethod
6) , 7) , 8) , 9) , 10) , 11)
Directory Information Tree
12)
Local Mail Transfer Protocol
Diese Website verwendet Cookies. Durch die Nutzung der Website stimmen Sie dem Speichern von Cookies auf Ihrem Computer zu. Außerdem bestätigen Sie, dass Sie unsere Datenschutzbestimmungen gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information
  • centos/mail_c6/cyrus_c6.txt
  • Zuletzt geändert: 20.04.2018 10:50.
  • von 127.0.0.1