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
# 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
# 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.
Als erstes betrachten wir den ganzen Konfogurationsaufwand, wenn beide Server auf einem Host betrieben werden.
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} ...
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 ...
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.
Für die individuelle Weiterleitung unserer Nachrichten benutzen wir die beiden Lookup-Tabellen:
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.
# 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
# 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
# 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
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.
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.
# pluginviewer -a
Installed auxprop mechanisms are: sasldb List of auxprop plugins follows Plugin "sasldb" , API version: 4 supports store: yes
# 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
# 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.
# 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
# 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:
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.
# 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
# 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.
Der Einfachheit halber wollen wir hierzu folgenden User in unserem DIT6) hinterlegen:
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
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
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 ]
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
# vim /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"
# vim /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=*))
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
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
Wir liefern nun unsere erste Nachricht auf dem Port 24 (LMTP Mail Delivery) ein. Unsere eMail wird dabei folgende Daten umfassen:
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.
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.
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.