Benutzer-Werkzeuge

Webseiten-Werkzeuge


mailserver

Dies ist eine alte Version des Dokuments!


Mailserver

MTA (Postfix):

  Nimmt E-Mails vom Client entgegen und leitet sie an andere Mailserver weiter
  Nimmt E-Mails von anderen Servern entgegen und leitet diese E-Mails an den MDA weiter
  => Transportaufgaben
Typ Beschreibung Einsatzszenarien
"Internet Site" Standard. Mail wird empfangen und verschickt. Echter Mailserver mit fester IP-Adresse, z.B. Root-Server
"Internet mit Smarthost" Wie Internet Site, aber Mail wird nicht direkt an den entfernten Server zugestellt, sondern über einen anderen Server (etwa beim ISP) geleitet. Mailserver mit dynamischer IP-Adresse, die sonst sehr oft als potentielle Spam- oder Virenversender blockiert werden.
"Satellite System" Keine Mail wird empfangen, alle ausgehende Mail über einen Smarthost (s.o.) verschickt. Mail durch Admin-Skripte oder Webapplikationen verschicken lassen.
"Local only" Mail wird lokal auf dem Rechner zugestellt, es wird keine Mail von außen empfangen bzw. nach außen geschickt. Wie "Satellite System", aber die Mail soll direkt auf demselben System gelesen werden.

MDA (Dovecot):

  „Einsortierung“ der ankommenden E-Mails in die korrekten Postfächer
  => „Logistik“

IMAP Server (Dovecot):

  Gibt auf Anfrage den Inhalt der Mailbox zurück
  Abgleich der Mailbox über mehrere Geräte hinweg
  => Speicher-/Mailboxverwaltung

Sieve

S/MIME-Mail-Verschlüsselung

mit openssl

E-Mail-Text (Body) mit openssl verschlüsseln:

> openssl smime -encrypt -des3 -out message_encrypted.txt zertifikat.cer < message.txt

so wird auch gleich noch der Header ("From:", "To:" und das "Subject:") mit angebaut und es entsteht eine vollwertige E-Mail, die einen verschlüsselten Body

> openssl smime -encrypt -des3 -out message_encrypted.eml -from absender@domain1.tld -to empfaenger@domain2.tld -subject "Eine geheime Nachricht" zertifikat.cer < message.txt

mit Content-Filter im Postfix

Postfix bietet verschiedene Möglichkeiten, externe Content-Filter zu implementieren. Eine relativ einfache Variante ist, das Postfix Kommando "pipe" zu verwenden, und damit ein beliebiges Skript mit den Daten der Email auf der Standardeingabe zu versehen.

Angenommen, es existiert ein Skript /usr/local/bin/mein_filter.sh, dass Emails (Header+Body) auf der Standardeingabe akzeptiert und dann - wie auch immer - weiter verarbeitet und zurück in das Mailsystem gibt.

Um dieses Skript als Filter zu verwenden, muss zuerst in /etc/postfix/master.cf ein entsprechender Transport-Mechanismus definiert werden:

> vi /etc/postfix/master.cf
...
meinfilter unix - n n - 2 pipe
    flags=Rq user=filter null_sender=
    argv=/usr/local/bin/mein_filter.sh -f ${sender} -- ${recipient}
...

Dadurch existiert ein neuer Transport-Mechanismus mit dem Namen "meinfilter", der bei Verwendung unter dem Benutzeraccount "filter" das Skript /usr/local/bin/mein_filter.sh aufruft und mit der Email auf der Standardeingabe versorgt.

Die Parameter für das Skript ( "-f ${sender} -- ${recipient}") sind so gewählt, dass Sie später 1:1 an das Kommando sendmail übergeben werden können.

Zusätzlich wird in der Postfix-Konfiguration für den neuen Transportmechanismus festgelegt, dass er für jeden einzelnen Empfänger einer Email separat aufgerufen werden muss. Das kostet zwar Performance, spart aber etwas Intelligenz im Filter-Skript:

> vi /etc/postfix/main.cf
...
# meinfilter benötigt alle recipients einzeln
meinfilter_destination_recipient_limit = 1
...

Das Filter-Skript

Das Filter-Skript soll die Email auf der Standard-Eingabe entgegennehmen, verarbeiten (also verschlüsseln) und wieder an den MTA übergeben:

/usr/local/bin/mein_filter.sh
#!/bin/bash
 
WORKDIR="/tmp"
SENDMAIL="/usr/sbin/sendmail -G -i"
CERTS="/etc/mailcerts"
EX_UNAVAILABLE=69
SENDER="$2"
RECIPIENT="$4"
 
if test -f "$CERTS/$RECIPIENT.crt" ; then
 
        MESSAGEFILE="$WORKDIR/message.$$"
 
        trap "rm -f $MESSAGEFILE; rm -f $MESSAGEFILE.encrypted" 0 1 2 3 15
 
        umask 077
 
        cat > $MESSAGEFILE || { echo Cannot save mail to file; exit $EX_UNAVAILABLE;}
 
        SUBJECT="$(reformail -x "Subject:" < $MESSAGEFILE)"
 
        openssl smime -encrypt -des3 -out $MESSAGEFILE.encrypted -from $SENDER -to $RECIPIENT -subject "$SUBJECT" $CERTS/$RECIPIENT.crt < $MESSAGEFILE || { echo Problem encrypting message; exit $EX_UNAVAILABLE; }
 
        $SENDMAIL "$@" < $MESSAGEFILE.encrypted
        exit $?
else
        cat | $SENDMAIL "$@"
        exit $?
fi

Falls ein Email-Empfänger mit der Adresse benutzername@domain.tld verschlüsselte Emails erhalten soll, muss dessen Benutzerzertifikat in das Verzeichnis "/etc/mailcerts" unter dem Dateinamen benutzername@domain.tld.crt abgelegt werden. Wird im Skript eine entsprechende Datei gefunden, wird die Email per openssl verschlüsselt. Ist kein Zertifikat hinterlegt, wird die Email ungefiltert an das sendmail-Kommando übergeben.

Verschlüsselung aktivieren

> vi /etc/postfix/master.cf
...
smtp inet n - - - - smtpd -o content_filter=meinfilter:dummy
meinfilter unix - n n - 2 pipe
  flags=Rq user=filter null_sender=
  argv=/usr/local/bin/mein_filter.sh -f ${sender} -- ${recipient}
...

Für genauere Infos siehe "man 5 master".

Mailserver mit FreeBSD

Dovecot-Sieve muss vor Postfix installiert werden, sonst wird Dovecot ohne Sieve-Unterstützung als Abhängigkeit automatisch installiert!

SSL-Schlüssel

Sowohl Dovecot als auch Postfix sollte man ein SSL-Schlüssel/Zertifikat spendieren.

  • Dovecot für
    • POP3S
    • IMAPS
  • Postfix für
    • TLS

Wie das geht, steht hier: SSL-Schlüssel generieren


Mail (Ubuntu 20.04 LTS)

Installation:

root@linux:~# apt install mailutils

E-Mail-Test:

fritz@linux:~$ echo Test001 | mail -s Test001 fritz@linux.lan

Ob eine E-Mail angekommen ist, kann man an diesen beiden Dateien sehen:

fritz@linux:~$ ls -lha /var/mail/fritz /home/fritz/mbox
-rw------- 1 fritz fritz   0 Dec 28 17:21 /home/fritz/mbox
-rw------- 1 fritz mail  464 Dec 28 17:22 /var/mail/fritz

E-Mail lesen:

fritz@linux:~$ mail
"/var/mail/fritz": 1 message 1 new
>N   1 fritz@linux.lan Mon Dec 28 17:22  13/413   Test001
? 

Mit einem Druck auf "[Enter]" öffnen sie die Mail…

Return-Path: <fritz@linux.lan>
X-Original-To: fritz@linux.lan
Delivered-To: fritz@linux.lan
Received: by linux.lan (Postfix, from userid 1001)
        id 6BDCA10064B; Mon, 28 Dec 2020 17:22:06 +0100 (CET)
Subject: Test001
To: <fritz@linux.lan>
X-Mailer: mail (GNU Mailutils 3.7)
Message-Id: <20201228162206.6BDCA10064B@linux.lan>
Date: Mon, 28 Dec 2020 17:22:06 +0100 (CET)
From: fritz@linux.lan

Test001
?

Mit "[Q]" beendet man das Programm:

? q

Fehlermeldungen

bei dieser Meldung im Log, ist das Limit für die maximale Mail-Größe (beim Postfix message_size_limit) anzuheben oder die zu versendende Mail muss verkleinert werden:

... smtp: Failed: 452 4.3.1 Insufficient system storage

oder die Anzahl der Mails in der Warteschlange ist zu groß:

# ls /var/spool/nullmailer/queue/* | wc -l
bash: /bin/ls: Die Argumentliste ist zu lang
0

# for i in /var/spool/nullmailer/queue/* ; do ls ${i} ; done | wc -l
63538
/home/http/wiki/data/attic/mailserver.1712327455.txt · Zuletzt geändert: von manfred