Table of Contents

Dovecot - POP3/IMAP {#Dovecot - POP3/IMAP}

Wir setzen dovecot ein. Dovecot verwendet hier den \'\'\'Maildir\'\'\'-Format in /srv/vmail/USER.

Dieser Speicherformat eignet sich auch gut für Backups, denn:

\'\'Maildir is designed to work without locks. Most required operations are atomic on modern file systems. This means that you do not have to care much about race conditions like inconsistent read. But there are still some issues if you want to backup a Maildir while the mail-server is running.\'\'

Doku dazu in der Dovecot-Wiki/Maildir und auch Diskussion dazu in diesem ServerFault-Thread.

Debugging mit Telnet {#Debugging mit Telnet}

Zum testen ob mailboxen existieren und funktionieren:

telnet efeu.mur.at 25
mail from:<djamil@mur.at>
rcpt to:<noc@mur.at>
quit

Debugging TLS auf der Commandline IMAP/SMTP {#Debugging TLS auf der Commandline IMAP/SMTP}

Für den TLS-Verbindungsaufbau zuerst openssl verwenden, und dann die IMAP/SMTP-Kommandos zum einloggen:

IMAP {#IMAP}
jogi@pc5 ~ % openssl s_client -connect imap.mur.at:143 -quiet -starttls imap
depth=3 C = SE, O = AddTrust AB, OU = AddTrust External TTP Network, CN = AddTrust External CA Root
verify error:num=19:self signed certificate in certificate chain
verify return:0
. OK Pre-login capabilities listed, post-login capabilities have more.
a1 login fischer PASSWORD
* CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS SPECIAL-USE BINARY MOVE QUOTA ACL RIGHTS=texk
a1 OK Logged in
a2 LIST "" "*"
* LIST (\HasChildren) "." INBOX
* LIST (\HasNoChildren \Drafts) "." INBOX.Drafts
* LIST (\HasNoChildren \Trash) "." INBOX.Trash
* LIST (\HasNoChildren \Junk) "." INBOX.Junk
* LIST (\HasNoChildren \Sent) "." INBOX.Sent
* LIST (\HasNoChildren) "." INBOX.Queue
* LIST (\Noselect \HasChildren) "." shared
* LIST (\HasChildren) "." shared.fischer-office
* LIST (\HasNoChildren) "." shared.fischer-office.Trash
a2 OK List completed.
a3 logout
* BYE Logging out
a3 OK Logout completed.
jogi@pc5 ~ %
SMTP {#SMTP}
murmin@polynom ~ » openssl s_client -connect efeu.mur.at:25 -quiet -starttls smtp
depth=2 O = Digital Signature Trust Co., CN = DST Root CA X3
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
verify return:1
depth=0 CN = efeu.mur.at
verify return:1
250 DSN
EHLO polynome.mur.at
250-efeu.mur.at
250-PIPELINING
250-SIZE 30720000
250-VRFY
250-ETRN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
MAIL FROM:<rwoz@mur.at>
250 2.1.0 Ok
RCPT TO:<rwoz+test@mur.at>
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
Subject: Testmessage

This is a Test :-)

.
250 2.0.0 from MTA(smtp:[172.16.16.42]:10042): 250 2.0.0 Ok: queued as 82D613FF49
QUIT
221 2.0.0 Bye
murmin@polynom ~ » 

shared Mailboxen {#shared Mailboxen}

Nach der Anleitung im Dovecot Wiki konfiguriert.

  • Für jede shared Mailbox braucht es eine Gruppe mit dem Namen der Mailbox (zb forum-info, gr-camp,..). Bitte \“sprechende\” Namen verwenden, zb tib- fuer therater im bahnhof. Ausserdem muss unter den Maileinstellungen keine \@mur.at als primäre mailadresse stehen.

<!– –

>

  • Die Rechte für USER in der Mailbox SHARED sind in der Datei \'\'\'/srv/vmail/SHARED/Maildir/dovecot-acl\'\'\' zu sehen: user=USER akxeilprwts

    Details dazu im Dovecot Wiki.

<

!– –

>

  • Zur Anzeige/Manipulation von ACLs sollte \'\'\'doveadm acl\'\'\' verwendet werden.

<

!– –

>

  • Komplettes Beispiel für eine shared Mailbox: # Anlegen der shared Mailbox und gleichzeitiges setzen der ACLs root@klee:~# doveadm acl set -u jogi shared.verein user=jogi all

    # einen (weiteren) User hinzufügen root@klee:~# doveadm acl add -u jogi shared.verein user=jogi all

    # Kontrolle root@klee:~# doveadm acl get -u verein shared.verein ID Global Rights user=almutb admin create delete expunge insert lookup post read write write-deleted write-seen user=jogi admin create delete expunge insert lookup post read write write-deleted write-seen user=renatn admin create delete expunge insert lookup post read write write-deleted write-seen

    # debug-Mode root@klee:~# doveadm acl debug -u almutb shared.verein doveadm(almutb): Info: Mailbox 'INBOX' is in namespace 'shared.verein.' doveadm(almutb): Info: Mailbox path: /srv/vmail/verein/Maildir doveadm(almutb): Info: Per-user private flags in mailbox: \Seen doveadm(almutb): Info: User almutb has rights: lookup read write write-seen write-deleted insert post expunge create delete admin doveadm(almutb): Info: Mailbox found from dovecot-acl-list doveadm(almutb): Info: User verein found from ACL shared dict doveadm(almutb): Info: Mailbox shared.verein is visible in LIST

#

## Bugs {#Bugs}

  • Das Setzen von Rechten auf shared Mailboxen reicht nicht aus, wenn User_innen auch Unterordner anlegen möchten. Dazu ist zusätzlich ein Eintrag in \'\'\'/etc/dovecot/global-acls\'\'\' nötig: shared.MAILBOXNAME user=USER akxeilprwts

Kopieren/moven von Mails & erstellen/löschen von Subfoldern {#Kopieren/moven von Mails & erstellen/löschen von Subfoldern}

Es gibt die Kommandos

doveadm import
doveadm move
doveadm copy
doveadm mailbox list|create|rename|delete 

Es gibt für alles die man-pages, ich fand die Beispiele dort nur leider nicht besonders verständlich...

man doveadm-search-query
man doveadm-move
man doveadm-mailbox

doveadm -D -v copy -u almutb  <FolderName> user fischer mailbox INBOX
        ^^^^^       ^^^^^^^   ^^^^^^^^   ^^^^^^^^^^   ^^^^^^^^^^^
       verbose      zieluser    ziel     quelluser  filterkriterium

doveadm mailbox list -u danielaz
doveadm mailbox create -u danielaz -s inbox-jangroos
doveadm mailbox create -u danielaz -s inbox-jangroos.spam
doveadm mailbox create -u danielaz -s prints.sent-jangroos
doveadm -v copy -u danielaz prints user jang MAILBOX INBOX \( TO prints@six OR CC prints@six OR BCC prints@six \) 
doveadm -v move -u danielaz prints.sent-jangroos user jang MAILBOX INBOX.Sent all
doveadm -v move -u danielaz inbox-jangroos.spam  user jang MAILBOX INBOX SUBJECT "****SPAM****"

Wiederherstellen von Mails aus Backups/ZFS-Snapshots {#Wiederherstellen von Mails aus Backups/ZFS-Snapshots}

Die Backups bestehen als ZFS-Snapshots des ZFS-Volumes \“banane/vmail\”.

Am Hamster reichen die täglichen ZFS-Snapshots 60 Tage in die Vergangenheit. Auf der Banane selbst liegen umfangreichere ZFS-Snapshots:

murmin@banane ~ » sudo zfs list -t snapshot                                                                                        
NAME                       USED  AVAIL  REFER  MOUNTPOINT
mailspool/banane@6months  23.9G      -  1.29T  -
mailspool/banane@5months  9.84G      -  1.31T  -
mailspool/banane@4months  8.91G      -  1.33T  -
mailspool/banane@3months  8.31G      -  1.35T  -
mailspool/banane@2months  9.57G      -  1.37T  -
mailspool/banane@1month   4.01G      -  1.38T  -
mailspool/banane@14days    774M      -  1.38T  -
mailspool/banane@13days    522M      -  1.38T  -
mailspool/banane@12days    750M      -  1.38T  -
mailspool/banane@11days    949M      -  1.38T  -
mailspool/banane@10days    833M      -  1.39T  -
mailspool/banane@9days     824M      -  1.39T  -
mailspool/banane@8days     764M      -  1.39T  -
mailspool/banane@7days     557M      -  1.39T  -
mailspool/banane@6days     474M      -  1.39T  -
mailspool/banane@5days     614M      -  1.39T  -
mailspool/banane@4days    1.20G      -  1.39T  -
mailspool/banane@3days     704M      -  1.39T  -
mailspool/banane@48hours   248M      -  1.39T  -
mailspool/banane@47hours   159M      -  1.39T  -
mailspool/banane@46hours   147M      -  1.39T  -
mailspool/banane@45hours   146M      -  1.39T  -
mailspool/banane@44hours   122M      -  1.39T  -
mailspool/banane@43hours   108M      -  1.39T  -
mailspool/banane@42hours  97.0M      -  1.39T  -
mailspool/banane@41hours  78.9M      -  1.39T  -
mailspool/banane@40hours  66.4M      -  1.39T  -
mailspool/banane@39hours  60.4M      -  1.39T  -
mailspool/banane@38hours  50.5M      -  1.39T  -
mailspool/banane@37hours  42.1M      -  1.39T  -
mailspool/banane@36hours  33.9M      -  1.39T  -
mailspool/banane@35hours  33.7M      -  1.39T  -
mailspool/banane@34hours  45.2M      -  1.39T  -
mailspool/banane@2days     133K      -  1.39T  -
mailspool/banane@33hours   133K      -  1.39T  -
mailspool/banane@32hours  74.3M      -  1.39T  -
mailspool/banane@31hours   106M      -  1.39T  -
mailspool/banane@30hours   136M      -  1.39T  -
mailspool/banane@29hours   198M      -  1.39T  -
mailspool/banane@28hours   214M      -  1.39T  -
mailspool/banane@27hours   268M      -  1.39T  -
mailspool/banane@26hours   239M      -  1.39T  -
mailspool/banane@25hours   206M      -  1.39T  -
mailspool/banane@24hours   221M      -  1.39T  -
mailspool/banane@23hours   156M      -  1.39T  -
mailspool/banane@22hours   144M      -  1.39T  -
mailspool/banane@21hours   143M      -  1.39T  -
mailspool/banane@20hours   171M      -  1.39T  -
mailspool/banane@19hours   168M      -  1.39T  -
mailspool/banane@18hours   122M      -  1.39T  -
mailspool/banane@17hours  86.4M      -  1.39T  -
mailspool/banane@16hours  81.8M      -  1.39T  -
mailspool/banane@15hours  96.0M      -  1.39T  -
mailspool/banane@14hours  53.2M      -  1.39T  -
mailspool/banane@13hours  34.9M      -  1.39T  -
mailspool/banane@12hours  38.4M      -  1.39T  -
mailspool/banane@11hours  39.7M      -  1.39T  -
mailspool/banane@10hours  41.0M      -  1.39T  -
mailspool/banane@1day     4.27M      -  1.39T  -
mailspool/banane@9hours   3.83M      -  1.39T  -
mailspool/banane@8hours   64.0M      -  1.39T  -
mailspool/banane@7hours   98.2M      -  1.39T  -
mailspool/banane@6hours    143M      -  1.39T  -
mailspool/banane@5hours    194M      -  1.39T  -
mailspool/banane@4hours    226M      -  1.40T  -
mailspool/banane@3hours    157M      -  1.40T  -
mailspool/banane@2hours    144M      -  1.40T  -
mailspool/banane@1hour     139M      -  1.40T  -

Mounten eines ZFS-Snapshots und kopieren von Emails einer Mailbox {#Mounten eines ZFS-Snapshots und kopieren von Emails einer Mailbox}

mkdir ~/mailspool.snapshot
sudo mount -t zfs banane@4months ~/mailspool.snapshot
sudo su
ls -al ~/mailspool.snapshot/jang/Maildir/cur/
cp -av ~/mailspool.snapshot/jang/Maildir/cur/* /srv/vmail/jang/Maildir/cur
cp -av ~/mailspool.snapshot/jang/Maildir/new/* /srv/vmail/jang/Maildir/new
sudo umount ~/mailspool.snapshot

Dovecot authentification {#Dovecot authentification}

dovecot AUTH:  das geht über pam (/etc/pam.d/dovcot)
dovecot userdb:  das geht direkt über LDAP
und nsswitch zeigt weitere Account Info an (z.B. wenn das Passwort
abzulaufen beginnt).

Das wir das aufteilen hat schon seinen Grund.  AUTH direkt gegen LDAP
lässt abgelaufene Passwörter zu.  Daher AUTH über pam.  Pam wiederum
reicht für die userdb Settings nicht aus, daher direkt via LDAP.

Und zu allem Überfluss authentifiziert postfix auf efeu die User auch
gegen dovecot.

Konfiguration von Email-Adressen im GOsa {#Konfiguration von Email-Adressen im GOsa}

Der LDAP-Zweig \'\'\'Aliases\'\'\' ist mehr oder weniger Geschichte! Neue Adressen ab sofort in GOsa konfigurieren!

Persönliche Adressen {#Persönliche Adressen}

Persönliche Adressen sind einer/einem Benutzer_in zugeordnet. Die passende Konfiguration erfolgt im Tab \'\'\'Mail\'\'\' im Bereich \'\'\'Benutzer\'\'\' im GOsa-Webinterface.

Jede Person hat eine primäre Adresse, die bei uns prinzipiell \'\'\' USERNAME@mur.at \'\'\' lautet.

Aliases, weitere Adressen {#Aliases, weitere Adressen}

Wenn es sich um persönliche Aliases handelt, dann empfiehlt sich die Verwendung des Feldes \'\'\'Alternative Adressen\'\'\'. Eine Adresse einfach dort eintragen und sie ist sofort verwendbar.

Damit der Alias funktioniert, auf efeu die Datei /etc/postfix/virtual_mailbox_domains editieren:

cd /etc/postfix/
sudo nano virtual_mailbox_domains
sudo postmap virtual_mailbox_domains

Mailbox oder Forward {#Mailbox oder Forward}

Was mit Email einer Person oder Gruppe passieren soll wird unter \'\'\'Nachrichten weiterleiten an\'\'\' konfiguriert.

  1. Ein leeres Feld bedeutet, nichts passiert mit Email für die Person. Der Mailserver antwortet mit \'\'\'550 5.1.1 \< address@example.com >: Recipient address rejected: User unknown in virtual alias table;\'\'\'
  2. Ein einziger Eintrag in der Form \'\'\' USERNAME@mailbox.mur.at \'\'\' bedeutet, der Mailserver stellt Email via LMTP zu.
  3. Ein Eintrag in der Form \'\'\' address@example.com \'\'\' ist eine Weiterleitung.

Bei 2. und 3. können auch mehrere Adressen stehen.

Mailverteiler {#Mailverteiler}

Mailverteiler können mittels der Mail-Einstellungen für eine Gruppe konfiguriert werden. Die Gruppe unbedingt korrekt in die LDAP-Hierarchie einordnen, dann haben auch etwaige Admins die Chance, die Gruppe selber (weiter) zu bearbeiten. Bei der Namensgebung sollten folgende Dinge beachtet werden:

  1. Ein eindeutig einer Person/einem Projekt zuzuordnender Name kann als Gruppenname verwendet werden (Beispiel: die Gruppe \'\'\'hofos\'\'\' gehört Reni und Jogi, sonst geht das keine_n was an).
  2. Bei Namen von allgemeinem Interesse muss ein Präfix vorangestellt werden, der auf die/den Eigentümer_in verweist. (Beispiel: forum-info für die Gruppe über die info@forumstadtpark.at konfiguriert ist).

Weiters emfpiehlt es sich, im Feld \'\'\'Beschreibung\'\'\' einer Gruppe, die für Email verwendet wird, einen Hinweis auf die Verwendung zu geben:

  1. Mailverteiler address@example.com
  2. Weiterleitung address@example.com
  3. Shared Mailbox address@example.com

Bei Gruppen kann die primäre Adresse sofort die eigentlich gewünschte sein (Besipiel: technik@helsinki.at ).

Shared Mailbox {#Shared Mailbox}

Auch eine Shared Mailbox sollte als Gruppe konfiguriert sein. \'\'\'Achtung! Hier ist noch zusätzliche Konfiguration (Permissions) am IMAP-Server notwendig!\'\'\'

Mailinglisten/Mailman {#Mailinglisten/Mailman}

Seit September 2017 sind sämtliche Listen über LISTE@lists.mur.at (bzw. einen lists.example.com Eintrag bei Domains von Mitgliedern) erreichbar! Alle Listen, die schon zuvor existierten, und daher als LISTE@mur.at erreichbar waren, werden noch bis 30. September 2018 so funktionieren, aber auch eine automatische Antwort an die/den Absender_in schicken.

Neue Liste werden daher nur mehr auf der birke (aka lists.mur.at) angelegt, und zwar wie folgt:

birke:/var/lib/mailman/bin# ./newlist LISTE
...

Dann das, was mailman ausspuckt in /etc/aliases eintragen und newaliases

} ausführen. Fertig.

Email in Listen finden und aus der Liste entfernen {#Email in Listen finden und aus der Liste entfernen}

auf birke, am besten root werden

cd /var/lib/mailman/bin/
./find_member <email>

zum löschen

echo <email> |./remove_members --fromall -f -

Eigene lists.example.com Domain {#Eigene lists.example.com Domain}

Damit lists.mur.at auch Emails für \'\'\'lists.example.com\'\'\' annimmt, muss letztes in /etc/postfix/main.cf als zusätzliche Zeile bei \'\'\'mydestination\'\'\' hinzugefügt werden. Danach empfiehlt sich ein service_postfix_reload

}.

Mails für example.com entgegennehmen {#Mails für example.com entgegennehmen}

Wir spielen ja für viele Domains (außer mur.at) MX. Damit eine Domain einmal funktioniert, muss sie auf efeu in die Datei \'\'\'/etc/postfix/virtual_mailbox_domains\'\'\' eingetragen werden. Danach den Befehl postmap_virtual_mailbox_domains

} ausführen, damit die passende Hashmap erzeugt wird.

Migration von Cyrus 2.1 nach Dovecot (obsolet; bleibt noch zu Dokumentationszwecken) {#Migration von Cyrus 2.1 nach Dovecot (obsolet; bleibt noch zu Dokumentationszwecken)}

  • Geplant ist Migration mittels dsync

Benchmarks {#Benchmarks}

Im Postfixbuch wird eine Benchmarkwerkzeug erwähnt, das \'\'\'postmark\'\'\' heißt. Das ist in Debian vefügbar, und so habe ich es am klee installiert. Folgende Konfigurationsdatei (klee:/home/jogi/postmark-02.config) habe ich angelegt, und damit BTRFS und EXT4 getestet:

set size 3072 102400
set report verbose
set number 200000
set transactions 500000
set location /srv/vmail/postmark
set subdirectories 1000

Damit wird das Verhalten eines Mailservers simuliert, der Dateien zwischen 3KB und 1MB in 1.000 Unterverzeichnissen verarbeitet. Insgesamt werden 200.000 Dateien verarbeitet und 500.000 Transaktionen simuliert. Hier sind die Resultate:

BTRFS mit LZO Kompression {#BTRFS mit LZO Kompression}

Time:
        498 seconds total
        454 seconds of transactions (1101 per second)

Files:
        450001 created (903 per second)
                Creation alone: 200000 files (6666 per second)
                Mixed with transactions: 250001 files (550 per second)
        250007 read (550 per second)
        249940 appended (550 per second)
        450001 deleted (903 per second)
                Deletion alone: 200002 files (14285 per second)
                Mixed with transactions: 249999 files (550 per second)

Data:
        14705.82 megabytes read (29.53 megabytes per second)
        27453.33 megabytes written (55.13 megabytes per second)

EXT4 {#EXT4}

Time:
        1268 seconds total
        1183 seconds of transactions (422 per second)

Files:
        450001 created (354 per second)
                Creation alone: 200000 files (3508 per second)
                Mixed with transactions: 250001 files (211 per second)
        250007 read (211 per second)
        249940 appended (211 per second)
        450001 deleted (354 per second)
                Deletion alone: 200002 files (7142 per second)
                Mixed with transactions: 249999 files (211 per second)

Data:
        14705.82 megabytes read (11.60 megabytes per second)
        27453.33 megabytes written (21.65 megabytes per second)

Aufgrund von Anmerkungen aus der Mailinglist, das virtuelle Maschinen nicht für Benchmarks geeignet sind, hab ich die halt nochmal, dirkt auf der wiese gemacht. Hier die Resultate (mit der selben Konfigurationsdatei):

BTRFS mit LZO {#BTRFS mit LZO}

Time:
        1100 seconds total
        1021 seconds of transactions (489 per second)

Files:
        450001 created (409 per second)
                Creation alone: 200000 files (3030 per second)
                Mixed with transactions: 250001 files (244 per second)
        250007 read (244 per second)
        249940 appended (244 per second)
        450001 deleted (409 per second)
                Deletion alone: 200002 files (15384 per second)
                Mixed with transactions: 249999 files (244 per second)

Data:
        14705.82 megabytes read (13.37 megabytes per second)
        27453.33 megabytes written (24.96 megabytes per second)

EXT4 mit data=ordered,noatime {#EXT4 mit data=ordered,noatime}

Time:
        2588 seconds total
        1367 seconds of transactions (365 per second)

Files:
        450001 created (173 per second)
                Creation alone: 200000 files (884 per second)
                Mixed with transactions: 250001 files (182 per second)
        250007 read (182 per second)
        249940 appended (182 per second)
        450001 deleted (173 per second)
                Deletion alone: 200002 files (201 per second)
                Mixed with transactions: 249999 files (182 per second)

Data:
        14705.82 megabytes read (5.68 megabytes per second)
        27453.33 megabytes written (10.61 megabytes per second)

Proxy {#Proxy}

Während der Migrationszeit wird dovecot als Proxy fungieren. User*innen, deren E-Mail noch auf hornet liegt werden vom dovecot an diesen weitergeleitet. Dasselbe gilt auch für lmtp.

IMAP {#IMAP}

In \'\'\'/etc/dovecot/dovecot-ldap.auth\'\'\' die Variable \'\'\'pass_attrs\'\'\' erweitern. Zumindest für IMAP funktioniert das so ganz passabel.

LMTP {#LMTP}

Damit lmtp-proxy funktioniert wurde hornet angepasst, weil wir keine passende dovecot-config fuer authentifiziertes lmtp gefunden haben. Folgende 3 configs am hornet wurden angepasst:

/etc/services: lmtpo       2002/tcp

/etc/hosts.allow: lmtpo: 172.16.16.78: ALLOW

/etc/cyrus.conf: lmtpo       cmd="lmtpd -a" proto=tcp listen="imap.admin.mur.at:lmtpo" prefork=0 maxchild=100

Fuers proxy gibts die dovecot-ldap_for_lmtp.conf.ext.

Im LDAP wurden 2 neue Attribute eingefuehrt: ou=imap.admin.mur.at, departmentNumber=y

# ohne proxy
pass_attrs = uid=user,userPassword=password

# mit proxy
pass_attrs = uid=user,userPassword=password,=proxy=y,=host=imap.admin.mur.at,=starttls=any-cert

Preflight TODOs {#Preflight TODOs}

  • Dovecot korrekt installieren und konfigurieren

<!– –

>

  • shared Mailboxen am Cyrus in den shared Namespace übertragen
    • Temporär braucht es dazu einen murMailForwardTo=sharedboxmngr+shared.MAILBOX Alias
    • Die bestehenden Mailboxen einfach per rsync kopieren rsync -auvi user/MAILBOX/ shared/MAILBOX/
    • Danach Mailbox rekonstruieren: sudo su - cyrus /usr/sbin/cyrreconstruct -C /etc/imapd.conf -rf shared.MAILBOX
    • Rechte überprüfen!
convert.txt · Last modified: 2022/11/03 14:53 by 127.0.0.1