Mailserver-Komplett

Aus xinux.net
Zur Navigation springen Zur Suche springen


Die “Internet text messages” waren eine der ersten Anwendungen des Internet. Es war damals eine fantastische Vorstellung, Textnachrichten innerhalb von Sekunden von einem Rechner zu einem anderen über Tausende von Kilometern hinweg zuzustellen. Heute werden diese text messages E-Mails genannt. Für deren Transport haben sich zwei verschiedene Protokolle herauskristallisiert. Simple Mail Transfer Protocol (SMTP) Unix to Unix Copy (UUCP) SMTP wird heute für fast alle E-Mails verwendet. Es definiert die Kommunikation von Start- und Zielrechner per TCP/IP zur Übermittlung der Nachrichten. Das UUCP-Protokoll dient eigentlich dazu, Dateien von einem Unixrechner zu einem anderen zu kopieren. Hierbei werden im ersten Schritt Dateien zum Kopieren vorgemerkt (gespoolt). Dann wird im zweiten Schritt eine Verbind­ung zum anderen Rechner aufgebaut, wobei es mehrere Arten der Kontaktaufnahme gibt, z.B. direkte Modemverbindung oder TCP/IP. Danach werden über diese Verbindung die Dateien zum Zielrechner kopiert. Da die mit UUCP zu kopierenden Dateien vor der Übertragung komprimiert werden können, eignet es sich gut für Systeme mit langsamen Netzverbindungen oder Wählleitungen. Da UUCP keine TCP/IP-Verbindung erfordert, eignet es sich ideal zur E-Mail-Anbindungvon Hochsicherheitssystemen Die Konfiguration von UUCP wird nur noch in Einzelfällen benötigt, so dass sich dieses Skript auf SMTP beschränkt.

Arbeitsweise des Protokolls SMTP

Die Aufgabe von SMTP ist der zuverlässige und effiziente Transport von Mail (Senden und Emp­fangen). SMTP ist unabhängig von dem unterliegenden Netzprotokoll, normalerweise wird jedoch TCP verwendet und die Kommunikation geht über den TCP-Port 25. Der Sender erhält vom Benutzer den Auftrag, eine Mail zuzustellen. Dieser baut nun eine bidirek­tionale Verbindung zum Empfänger auf, der entweder das direkte Ziel der Nachricht oder ein Nachrichtenübermittler auf der Strecke zum Ziel ist. Im letzteren Falle sorgt dieser für die weitere Verbindung zum Zielrechner. Der Sender schickt Kommandos, die vom Empfänger akzeptiert oder abgelehnt werden können. Dieser ist nun für die Zustellung beim Benutzer verantwortlich. Anders als bei UUCP werden die Mails sofort zugestellt, sofern der Empfänger erreichbar ist

SMTP-Versand per telnet

Diese Kommunikation erfolgt in einzelnen Schritten, die alle nacheinander auszuführen sind: Angabe des Absenders Syntax MAIL FROM: <Absender> Zuerst ist anzugeben, wer die E-Mail verschickt. MAIL FROM: thomas@xinux.de

Angabe des Empfängers Syntax RCPT TO: <Empfänger> Danach folgt der Empfänger der Nachricht; um sie an mehrere Empfänger zu verschicken, verwendet man dieses Kommando einfach mehrmals.

RCPT TO: martin@tuxmen.de Übertragung des E-Mailtextes Syntax DATA <Text> . Nach dem DATA-Kommando werden alle folgenden Zeilen als Nachrichtentext interpretiert, bis ein einzelner Punkt am Zeilenanfang eingegeben wird.Als Subject geben wir “testmail von thomas” an.

DATA Subject: testmail von thomas

Hallo Martin! Dies ist eine Testmail per SMTP. . Beenden der Übertragung Syntax QUIT Man kann über eine Verbindung mehrere E-Mails verschicken; am Ende muss man QUIT eingeben, um die Verbindung ordentlich zu trennen. QUIT Und hier nochmal komplett:

pate:/etc/postfix# telnet neelix.talaxia.de 25
Trying 85.10.194.199...
Connected to neelix.talaxia.de.
Escape character is '^]'.
220 neelix.talaxia.de ESMTP Postfix (Debian/GNU)
MAIL FROM: thomas@xinux.de
250 Ok
RCPT TO: martin@tuxmen.de
250 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
Subject: testmail von thomas

Hallo Martin!
Dies ist eine Testmail per SMTP.

gruss

Thomas
.
250 Ok: queued as D44DF99009B
QUIT
221 Bye

Voraussetzungen für den Versand über SMTP

Damit ein Rechner E-Mail empfangen kann, muss er ständig eingeschaltet sein. Da dies für die meisten Client-Rechner nicht der Fall ist, gibt es so genannte Mailserver, die ständig aktiv sind und E-Mails für eine ganze Reihe von Benutzern empfangen und zwischenspeichern können Die ständige Verfügbarkeit oder der passende MX-Eintrag des zuständigen DNS-Servers sind allgemein Voraussetzung für den Empfang von E-Mail

Weitere Möglichkeiten für den Versand von E-Mail

Wir wissen nun, wie E-Mail zum zuständigen SMTP-Server des Empfängers übermittelt wird. Es stellt jedoch häufig für den Sender ein Problem dar, den SMTP-Server direkt zu erreichen. So kann es sein, dass unter Umständen der SMTP-Server vorübergehend nicht erreichbar ist. Das kann vorkommen, wenn der Sender nur über eine Wählverbindung mit dem Internet verbunden ist oder wenn der SMTP-Server ausgefallen ist. Der Client müsste also beim Versenden jeder Mail eine Verbindung ins Internet aufbauen oder ggf. zu einem späteren Zeitpunkt probieren, die Mail zu versenden. Die Verbindung ins Internet ist in vielen Fällen auch durch eine Firewall gesperrt. Um diesen Problemen aus dem Weg zu gehen, haben SMTP-Server noch eine weitere Funktion: Der Sender benutzt häufig seinen eigenen SMTP-Server, um ausgehende Mail zu versenden. Dieser kann sich dann darum kümmern, dass die Mail zum SMTP-Server des Empfängers transportiert wird. Somit kann die Mail - ohne Zutun des Senders - auch erst ausgeliefert werden, wenn der SMTP-Server des Empfängers erreichbar ist. Die Einrichtung des Clients ist recht einfach, da nur der eigene Mail-Server einzutragen ist. Früher war es üblich, dass E-Mails über mehrere SMTP-Server transportiert wurden, bis sie den Empfänger erreichte (Mail Relaying), heute stellt der sendende Mailserver dem Mailserver des Empfängers die Mail in der Regel direkt zu.

Sendmail

Sendmail war lange Zeit Standardprogramm zum E-Mail-Transport im Internet . Seine Popularität verdankt es nicht zuletzt seiner Flexibilität, die eine Konfiguration allerdings erschwert. Leider ist der monolithische Sendmail alles andere als leicht zu pflegen. In solch ein "Multifunktions-Tool" schleichen sich zwangsläufig Fehler ein - eine neue Sicherheitslücke in Sendmail gehörte in der Vergangenheit zu den Treppenwitzen der Internet-Geschichte schlechthin.

Alternativen

Die beiden am häufigsten eingesetzten (freien) Alternativen zu Sendmail sind Dan Bernsteins Qmail und Postfix von Wietse Venema. Beide sind wie Sendmail im Quelltext frei verfügbar - Qmail unter der GPL, Postfix unter einer von der Mozilla Public License abgeleiteten Lizenz von IBM - und beide sind einfacher zu handhaben als das altehrwürdige Sendmail.


Postfix

Wieste's Ziel bei der Entwicklung von Postfix war, ein schnelles, einfach zu administrierendes und sicheres Programm(paket) zu entwickeln, das so weit wie möglich zu Sendmail kompatibel sein soll. Das Interessanteste an Postfix ist sein innerer Aufbau (siehe Grafik): es besteht aus mehreren kleinen Programmen, die über UNIX-Domain-Sockets kommunizieren. Auf diese Weise ist es viel einfacher, Probleme, Fehler oder Sicherheitsmängel in den Griff zu bekommen. Beispielsweise kommt Postfix ganz ohne setuid-M©chanismen aus. Deshalb ist es für einen potenziellen Angreifer unmöglich, Superuser-Rechte zu bekommen - selbst wenn er ein Sicherheitsloch von Postfix gefunden hätte. Sendmail hingegen muß unter UID 0 (root) laufen, zumindest in einer Standardinstallation und ohne größere Klimmzüge. Ebenfalls aus Sicherheitsgründen arbeitet Postfix mit vier verschiedenen Queues: "maildrop", "incoming", "active" und "deferred". Lokal gesendete Mails landen in "maildrop" und werden von dort in die "incoming"-Queue kopiert, nachdem sie regelbasiert auf Größe, Inhalt und anderes überprüft wurden. In der "active" Queue landen die Mails, die der Queue-Manager gerade bearbeitet und ausliefert (lokal oder remote). Nachrichten, die Postfix nicht ausliefern kann (Dienst des Zielmailservers reagiert nicht, keine Route, keine Netzverbindung, ...), landen in der "deferred" Queue. Da Postfix immer nur eine Mail gleichzeitig bearbeitet und die "active" Queue klein hält, ist es unempfindlich gegen Ressourcenknappheit. Das Bearbeiten/Ausliefern von Mails kann also in keinem Fall, beispielsweise wegen eines vollen Dateisystems, blockiert werden.


Die Grafik zeigt den modularen Aufbau von Postfix. Hierbei bedeuten: gelbe Ellipsen Programme gelbe Kästen Mail-Queues oder -Dateien blaue Kästen (Nachschlage-) Tabellen Programme in der umrandeten Box laufen unter der Kontrolle des Postfix master Daemons. Dateien in diesem Kasten gehören dem Postfix-Mail-System.

Queue.jpg


Installation von Postfix

Vobereitung: Im Verzeichniss /etc/skel sollte folgende Verzeichnisstruktur angelegt werden:

pate:/etc/skel# tree . . `-- Maildir

   |-- cur
   |-- new
   `-- tmp

4 directories, 0 files

oder Maildir Vorlage anlegen

mkdir -p /etc/skel/Maildir/new
mkdir -p /etc/skel/Maildir/cur
mkdir -p /etc/skel/Maildir/tmp

Wir brauchen das für den courier imap Server (kommt weiter unten)


Installiert wird Postfix mit dem Befehl

apt-get install postfix

Da auf einem Debiansyste meistens exim vorinstalliert ist und es sich bei Mailservern um Highländerpakete handelt wird vorgeschlagen exim zu entfernen.Dieses kann man bejahren.Danach gehts los mit der Debian-Konfiguration:

Mail1.jpg
Mail2.jpg
Mail3.jpg
Mail4.jpg

Dateien und Verzeichnisse

postfix startet oder stoppt das Postfix-System

postalias erzeugt die aliases-table für Postfix aus /etc/aliases, das Pendant zu postmap

postcat zeigt den Inhalt der Queues an

postconf listet alle Variablen aus der Postfix-Konfiguration auf,kann aber auch gleichzeitig Einstellungen in der main. cf verändern! So kann man bequem aus Skripten heraus die Postfix-Konfiguration anpassen.

postdrop nimmt e-Mails auf der Kommandozeile an und speist sie in die Queues ein

postkick sendet an einzelne Postfix-Module Steuerbefehle

postlock lockt für Postfix Mailboxen, kann in Skripten eingesetzt werden

postlog erzeugt eine Logmeldung für syslogd

postmap wandelt alle Tables von Postfix vom Text-Format in das hash-Format (. db). Neben mailq das wohl wichtigste Tool

postqueue listet die Mailqueue oder startet die Auslieferung daraus (flush); wird von mailq aufgerufen.

postsuper verwaltet die Postfix-Queue

mailq listet den Inhalt der Mailqueues auf und zeigt den aktuellen Versandstatus oder Versandprobleme; ersetzt mailq von Sendmail.

newaliases ersetzt das Sendmail-Programm newaliases und ist im Prinzip postalias nur unter einem anderen Namen.

sendmail Sendmail-kompatibles Interface für lokal erzeugte Mails. Es verhält sich exakt so, wie sich auch das Original verhalten würde, übergibt die e-Mails dann aber sofort an postdrop.

Dateien und Verzeichnisse

Da sich die Konfiguration von Postfix über mehrere Dateien erstreckt, ist es von Bedeutung, dass man die wichtigsten davon kennt, bevor man mit der Konfiguration beginnt

Konfigurationdateien

Postfixmaster Programm /usr/sbin/postfix

Startdatei von postfix /etc/init.d/postfix start|stop|restart

Module und Unterprogramme /usr/lib/postfix

Dokumentation /usr/share/doc/postfix

Mailqueue Ordner /var/spool/postfix

Konfigurationverzeichnis /etc/postfix

master.cf - Prozess Masterkonfigurationsdatei

Aufbau der Datei master.cf

Das Postfix Paket selbst bringt ausführlich kommentierte Konfigurationsdateien mit. Der größte Teil der master.cf besteht aus Erläuterungen. Die Konfiguration erfolgt zeilenweise in einer Tabellenähnlichen Datenstruktur. Jede Zeile definiert hier eine Komponente des Postfixsystems, die vom Masterprozess gestartet werden kann. Die einzelnen Spalten steuern wie und wann der zentrale Daemon die jeweiligen Prozesse startet oder stoppt.

Eine Konfigurationszeile der Konfigurationsdatei beginnt immer in der ersten Spalte. Nach einem Zeilenumbruch wird sie nach einem Whitespace fortgesetzt. Es werden also keine \ benötigt um Zeilenumbrüche zu maskieren. Bedeutung der einzelnen "Spalten" Jede Konfigurationszeile ist in maximal 8 Spalten unterteilt. Die Spalten werden durch Whitespaces voneinander getrennt. In jeder Zeile haben die einzelnen Spalten dieselbe Bedeutung für die jeweilige Teilkomponente. Einige der Spalten sind mit einem Defaultwert vorbelegt. Wenn in dieser Spalte ein "-" eingetragen wird kommt der Defaultwert zum tragen.

  • service

Hier wird der Service-Typ eingetragen, der zur folgenden Typ-Spalte passen muß. Jeder Bezeichner in dieser Spalte muss eindeutig sein. Services, die in der zweiten Spalte als inet definiert werden, müssen auf eine Portnummer aufgelöst werden können. Das heisst, das dem hier eingetragenen Service in der Datei /etc/services eine Portnummer zugeordnet sein muss. Alternativ zum Eintrag in /etc/services kann auch direkt eine Portnummer angegeben werden. Der Portnummer oder dem Dienstbezeichner kann noch ein Hostname oder eine IP-Adresse vorangestellt werden. Der Master Daemon bindet sich dann nur an das konfigurierte Interface. Ein Eintrag hier kann also im Format [host|ip:]<service|port> (z.B: localhost:smtp) eingetragen werden Ein hier angegebener Bezeichner für einen Service kann in einem transport adressiert werden. Dieses ist z.B. die empfohlene Vorgehensweise um die E-Mail an Cyrus Mailboxen auszuliefern.

  • type

Dieses Feld bietet die Möglichkeit den Typ des in Spalte 1 definierten Services festzulegen. Mögliche Typen sind inet für Internet Sockets, unix für Unix-Domain Sockets und fifo für Named Pipes. Falls eine E-Mail an ein Programm übergeben werden soll, wird in der master.cf ein Service des Typs unix eingestellt. In der "command" Spalte wird das Kommando pipe eingestellt, das eine E-Mail an ein externes Programm übergibt.

  • private (Default ja)

Ein als privat gekennzeichneter Dienst darf nur vom Postfix-Mailsystem selbst angesprochen werden. Dieses ist auch die Defaulteinstellung. Dienste die als Internet Sockets definiert sind müssen als öffentlich ("n") deklariert werden.

  • unpriv (Default ja)

Der Parameter unpriv legt fest, ob der Dienst mit mit der Userid eines unprivilegierten Accounts gestartet werden soll oder als root. Die Benutzer ID des unprivilegierten Accounts wird in main.cf mit dem Parameter mail_owner bestimmt. Wenn der Dienst mit den Rechten von root gestartet werden soll, wird hier ein "n" eingetragen.

  • chroot

Mit chroot wird bestimmt, ob der Prozess in einer chroot Umgebung laufen soll. Die Basis dieser Umgebung ist das Verzeichnis in dem die Mail Queues von Postfix installiert sind. Dieses Verzeichnis wird mit Hilfe des Parameters queue_directory in der main.cf bestimmt. Alle Prozesse mit Ausnahme der als PIPE definierten und den Daemons die die virtuelle oder lokale Auslieferung von E-Mail übernehmen, können chroot gestartet werden.

  • wakeup

Hier wird eingestellt, ob der in der "command" Spalte eingestellte Prozess in regelmässigen Abständen Aktionen durchführen soll, wie z.B. das Leeren die Queue.

  • maxproc

Die maximale Anzahl Prozesse, die von diesem Service gestartet werden können.

  • command

Das zu startende Kommando. Der Pfad ist relativ zum Postfix Kommandoverzeichnis (kann mit dem Parameter program_directory in main.cf eingestellt werden).

  • args

Die Argumente, die dem Kommando der Spalte "command" übergeben werden. Für die von Postfix selbst bereitgestellten Kommandos kann hier mit Hilfe eines oder mehreren -v Schaltern ein umfangreicheres Logging eingestellt werden. Das Pipe Kommando bietet die umfangreichste Liste von möglichen Argumenten. Die Bedeutung der einzelnen Parameter ist in der Manpage pipe(8) dokumentiert.

#======================================================================
# service	 type  private unpriv  chroot  wakeup  maxproc command + args
#               		(yes)   (yes)   (yes)   (never) (100)
#======================================================================
smtp		inet  	n       -       -       -       -       smtpd
pickup		fifo  	n       -       -       60      1       pickup
cleanup	unix  	n      -       -       -       0       cleanup
qmgr		fifo  	n       -       -       300     1       qmgr
rewrite		unix  	-       -       -       -       -       trivial-rewrite
bounce		unix  	-       -       -       -       0       bounce
defer		unix  	-       -       -       -       0       bounce
trace		unix  	-       -       -       -       0       bounce
verify		unix  	-       -       -       -       1       verify
flush		unix  	n       -       -       1000?   0       flush
proxymap	unix  	-       -       n       -       -       proxymap
smtp		unix  	-       -       -       -       -       smtp
relay		unix  	-       -       -       -       -       smtp
showq		unix  	n       -       -       -       -       showq
error		unix  	-       -       -       -       -       error
local		unix  	-       n       n       -       -       local
virtual		unix  	-       n       n       -       -       virtual
lmtp		unix  	-       -       n       -       -       lmtp
anvil		unix  	-       -       n       -       1       anvil
maildrop	unix  	-       n       n       -       -       pipe
  flags=DRhu user=vmail argv=/usr/local/bin/maildrop -d ${recipient}
uucp      	unix  	-       n       n       -       -       pipe
  flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)
ifmail    	unix  	-       n       n       -       -       pipe
  flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
bsmtp     	unix  	-       n       n       -       -       pipe
  flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -d -t$nexthop -f$sender $recipient
scalemail-backend unix  -       n       n       -       2       pipe
  flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} ${user} ${extension}

main.cf - Hauptkonfigurationsdatei

wird angezeigt wenn man ein telnet hostname 25 macht

smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)

aktiviert die zusammenarbeit mit dem biff daemon dieser zeigt auf de konsole an das mails eingegangen sind

biff = no

wenn ein name kein fqdn ist ,wird der domainname angehaengt

append_dot_mydomain = no

der fqdn der mailservers

myhostname = pate.provider.int

die domain des mailservers

mydomain   = provider.int

hostname der bei der lokalen erzeigung von emails benutzt wird

myorigin = /etc/mailname

tabelle der mailaliasen

alias_maps = hash:/etc/aliases

canonical tabelle der sender adressen

sender_canonical_maps = hash:/etc/postfix/canonical

transport tabelle => mailertable bei sendmail

transport_maps = hash:/etc/postfix/transport

virtuall tabelle

virtual_maps = hash:/etc/postfix/virtual
relocated_maps = hash:/etc/postfix/relocated
header_check = rexexp:/etc/postifx/header_check

domain fuer die postfix "final destination ist" ist. sie werden local zugestellt

mydestination = $myhostname, $mydomain, /etc/postfix/mydestination

ip nummern, die bei permit_mynetworks, permit_auth_destination und reject_unauth_destination relayen duerfen

 mynetworks = 127.0.0.0/8, 192.168.86.0/24, 192.168.254.22


host ueber den alle ausgehenden mails geschickt werden, der mx record wird ignoriert

relayhost = neelix.talaxia.de

restrictions nach dem "RCPT TO:" abgesetzt wurde

smtpd_recipient_restrictions     =	check_recipient_access hash:/etc/postfix/access
                              			permit_mx_backup
                              			permit_mynetwork
                              			check_relay_domains

das programm das die mails an die localen postfaechern zustellt

mailbox_command = procmail -a "$EXTENSION"

maximal groesse der userpostfaecher danach wird gebounced

mailbox_size_limit = 0

trennzeichen um in der empfaenger adresse die maibox extention abzutrennen

recipient_delimiter = +

ip nummern auf denen postfix einen port oeffnet

inet_interface = all

nicht fqdn-namen in der mailadresse wird die §mydomain angehängt

append_dot_mydomain = yes

Die Tabellen

Die Tabellen bei Postfix werden als normale ASCII-Textdateien angelegt. Sie müssen danach noch in ein Datenbankformat umgewandelt werden. Dazu stehen zwei Tools zur verfügung.

  • postalias für die aliases-tabelle
  • postmap für den rest


alias_maps = hash:/etc/aliases

Die aliases-table definiert Mailaliase. Damit lassen sich lokale Adressen umschreiben und Mails in andere Postfächer umleiten. Sie liegt historischen Gründen im gegensatz zu den anderen Tabellen nicht unter /etc/postfix.

#/etc/aliases
mailer-daemon: postmaster
postmaster: root
nobody: root
hostmaster: root
usenet: root
news: root
webmaster: root
www: root
ftp: root
abuse: root
noc: root
security: root
technik:	thomas,martin,tina        

Danach wird in das Datenbankformat umgewandelt: postalias /etc/aliases

virtual_maps = hash:/etc/postfix/virtual

Damit lassen sich alle Adressen umschreiben. Folgende Kriterien gelten hierbei:

user@domain.de 		genau diese Mailadresse
@domain.de			alle Adressen dieser Domain
user				dieser User bei beliebigen Domains 
domain.de			definiert diese Domain als virtuelle Domain


#allgemeines freischalten der virtuellen domains. das blabla dient nur als platzhalter. 

apfel.int                       	blabla
birne.int                       	blabla
delicius.int                    	blabla

#vertrieb@apfel.int wird hier dem lokalen konto apfel-vertieb zu geordnet. 
vertrieb@apfel.int	     	apfel-vertrieb
#webmaster@apfel.int wird hier dem lokalen apfel-webmaster zu geordnet.
webmaster@apfel.int             apfel-webmaster

#alles an die domain delicius.int wird hier dem lokalen apfel-sammel zu geordnet.
@delicius.int                   	apfel-sammel

vertrieb@birne.int              	birne-vertrieb
webmaster@birne.int             birne-webmaster

vertrieb@provider.int           	provider-vertrieb
webmaster@provider.int       provider-webmaster

Danach wird in das Datenbankformat umgewandelt: postmap /etc/postfix/virtual

sender_canonical_maps = hash:/etc/postfix/canonical

Auch die canonical-Tabellen können Mailadressen umschreiben. Sie sind jedoch in der lage auch Absendeadressen umzuschreiben so ist es möglich. unschöner Absendeadressen durch schönere zuersetzen. Es gibt drei Arten von canonical-Tabellen

  • canonical_maps -> Umwandlung bei Absende und Empfängeradressen
  • sender_canonical_maps-> Umwandlung bei Absendeadressen
  • recipient_canonical_maps -> Umwandlung bei Empfängeradressen
#wandelt eine localen absender adresse in eine offizielle adresse um
root            technik@provider.int
#wandelt fuer alle konten absender in dies domain um
@pate.provider.int      @provider.int

Danach wird in das Datenbankformat umgewandelt postmap /etc/postfix/virtual

transport_maps = hash:/etc/postfix/transport

Postfix kennt verschiedene Transport-Methodem e-Mails zuzustellen. Über den Parameter default_transport kann man Postfix eine Standardmethode zuweisen. Beispielsweise

  • SMTP -> Sendmail Transport Protokoll
  • UUCP -> Unix 2 Unix Copy
  • LMTP -> lokale Mail auslieferung

Man kann in der transport-Tabelle nun diesen Vorgabe ändern. Es wird dann unabhängig vom MX-Record eine Mail über einen bestimmten Mailserver geschickt.

pate:/etc/postfix# dig  -t mx sympatel.de | grep -A 3 ";; ANSWER"
;; ANSWER SECTION:
sympatel.de.            86255   IN      MX      10 mail.sympatel.de.
sympatel.de.            86255   IN      MX      20 mforward.dtag.de.
# Mails für sympatel.de werden trotz der anderslautenten MX Records über neelix.talaxia.de
geschickt.
sympatel.de             esmtp:neelix.talaxia.de
Danach wird in das Datenbankformat umgewandelt   postmap /etc/postfix/transport



relocated_maps = hash:/etc/postfix/relocated

relocated bounct unzustellbare Mails unter Angabe der neuen Mailadresse des verzogenen Accounts

#neue Adresse von bauer ist jetzt martin.bold@xinux.de
bauer@apfel.int         martin.bold@xinux.de

Danach wird in das Datenbankformat umgewandelt postmap /etc/postfix/relocated



Schutz durch Restrictions

Der entscheidende Stelle, um Spam abzuwehren, ist der Einliefungszeitpunkt auf dem Mailserver. Es soll also daum gehen, die Annahme von vorneherein abblocken zu können. Ob eine Mail angenommen werden darf, entscheidendet sich aus einem zusammenspiel von


  • IP-Adresse des einliefernden Mailservers
  • Empfänger der Mail
  • Mailadresse des Absenders (unsicher)
  • Password Authentifizierung (sicher)

Formale Kritierien (fehlerhafte SMTP Befehle)


Wann wird geprüft?

Die Prüfung kann jetzt zu verschiedenen Zeitpunkten durch geführt werden wobei hier gilt je später der Zeitpunkt desto mehr informationen können ausgewertert werden. Es gibt hier 4 Möglichkeiten:

								Zeitpunkt	
smtp_recipient_restrictions	->		nach  RCPT TO:ziel@provider.int 
check_sender_access typ:mapname
reject_unknown_recipient
permit_mx_backup
check_relay_domains
permit_auth_destination

smtp_sender_restrictions	->		nach  MAIL FROM:quelle@provider.int
check_sender_access typ:mapname
reject_unknown_senderdomain
reject_non_fqdn_sender

smtp_helo_restrictions		->		nach  HELO domain.de FROM:quelle@provider.int
check_helo_access
reject_unknown_hostname
reject_non_fqdn_hostname
reject_invalid_hostname
permit_naked_ip_adresse

smtp_client_restrictions		->		nach dem CONNECT	
reject_unauth_pipelining
permit
reject
warn_in_reject
check_client_access typ:mapname
reject_unknown_client
reject_maps_rbl
permit_mynetworks


check_sender_access hash:/etc/postfix/access

Die Tabelle access erlaubt es, einzelne Adressen ,Nutzer oder Hosts für bestimmte Aktionen freizugeben oder zu blocken. Die access-Tabelle trifft dabei immer Ja/Nein-Aussagen : OK oder REJECT

#restrictions nach dem "RCPT TO:" abgesetzt wurde
smtpd_recipient_restrictions       = 	check_recipient_access hash:/etc/postfix/access,
					permit_mx_backup,
					permit_mynetwork,
					check_relay_domains

#/etc/postfix/access 
provider.int OK
apfel.int OK
birne.int OK
delicius.int OK
tuxmen.int OK

Danach wird in das Datenbankformat umgewandelt postmap /etc/postfix/access

Problem bei virtuellem Server mit anderen IPS

# postconf | grep smtp_host_lookup
smtp_host_lookup = dns
#


Variable host_lookup auf native setzen (kann auch direkt in /etc/postfix/main.cf gemacht werden)

# postconf -e smtp_host_lookup=native
# /etc/init.d/postfix restart

Protokolle zum Abruf von E-Mail

Nachdem die Mail im Postfach des Benutzers angekommen ist, muss sie irgendwie zum Mail-Client des Benutzers gelangen. In den seltensten Fällen hat der Mail-Empfänger einen direkten Zugang (login-Shell) zum Unix-Rechner. Somit muss der Benutzer sich die E-Mail vom Unix-Rechner ”abholen”. Es haben sich hier zwei Protokolle herauskristallisiert: Post Office Protokoll - Version 3 (POP3) Internet Message Access Protokoll - Version 4 (IMAP4) Von den beiden Protokollen ist IMAP4 das deutlich komplexere und flexiblere. Trotzdem ist POP3 noch sehr weit verbreitet, da es weniger Server-Ressourcen verbraucht.

POP3

Das POP3-Protokoll bietet nicht viele Möglichkeiten; man kann sich am Server authentifizieren, erfährt, wie viele Nachrichten vorhanden und wie viele ungelesen sind und kann diese Nachrichten dann herunterladen und vom Server löschen. Dies bedeutet, dass bei Verwendung eines POP3-Servers immer alle Nachrichten vor dem Lesen heruntergeladen werden müssen und es nicht möglich ist, die Nachrichten von zwei oder mehreren Rechnern aus abzurufen, da sie nur auf einem Rechner vorhanden sein werden Es gibt bei vielen Mailprogrammen auch die Option “Nachrichten auf dem Server belassen”. Hierbei werden die Nachrichten einfach nur nicht gelöscht, so dass man sie beim nächsten Mal wieder herunterladen muss und somit nichts gewonnen hat Beschreibung des Protokolls POP3 Ähnlich wie bei anderen Protokollen ist es auch hier möglich, die Verbindung zu einem POP3-Server ”von Hand” aufzubauen. Wir verwenden das Programm telnet, um den Abruf von E-Mail zu simulieren. Die Befehle von POP3 sind sehr einfach: Authentifizierung Syntax

USER <benutzername> PASS <passwort>
Hier entspricht das Protokoll dem FTP-Protokoll, aber warum sollte man sich etwas Neues ausdenken müssen?

USER martin
PASS suxer
Übersicht
Syntax
LIST
Dieses Kommando gibt einem eine Liste von Nachrichtennummern und Längen der Nachrichten aus.
Nachricht lesen
Syntax
RETR <Nachrichtennummern>
Die Nachrichtennummer muss eine der Nummern aus der Ausgabe des LIST-Kommandos sein.
RETR 10
Nachricht löschen
Syntax
DELE <Nachrichtennummern>
Die entsprechende Nachricht wird unwiderruflich gelöscht.
DELE 10
Alles in allem ziemlich unspektakulär, deshalb hier das ganze nochmal zusammen:
pate:/etc/skel# telnet pate.provider.int 110
Trying 192.168.86.10...
Connected to pate.provider.int.
Escape character is '^]'.
+OK Qpopper (version 4.0.5) at localhost.localdomain starting.  <8228.1131614979@localhost.localdomain>
user martin
+OK Password required for martin.
pass suxer
+OK martin has 1 visible message (0 hidden) in 444 octets.
list
+OK 1 visible messages (444 octets)
1 444
.
retr 1
+OK 444 octets
Return-Path: <technik@provider.int>
X-Original-To: martin
Delivered-To: martin@pate.provider.int
Received: by pate.provider.int (Postfix, from userid 0)
        id 9F0A56A210; Thu, 10 Nov 2005 10:29:36 +0100 (CET)
To: martin@pate.provider.int
Message-Id: <20051110092936.9F0A56A210@pate.provider.int>
Date: Thu, 10 Nov 2005 10:29:36 +0100 (CET)
From: technik@provider.int (root)
X-UIDL: =/e!!#X)#!dbh"!@lp!!

Do Nov 10 10:29:36 CET 2005
.
dele 1
+OK Message 1 has been deleted.
list
+OK 0 visible messages (0 octets)
.
quit
+OK Pop server at localhost.localdomain signing off.
Connection closed by foreign host.
Die Installation einer POP3 Server ist unter Debian wie immer sehr einfach:

apt-get install qpopper


Und zur Kontrolle:

pate:/etc/skel# netstat -ltp | grep pop3
tcp        0      0 *:pop3                  *:*                     LISTEN     759/inetd

IMAP4

Bei IMAP4 handelt es sich um ein deutlich komplexeres Protokoll, das alle Funktionen von POP3 unterstützt und über weitere Funktionen verfügt. So kann man die Kopfzeilen der Nachrichten, also Datum, Absender, Empfänger, Betreff usw. getrennt herunterladen, um eine Übersicht der Nachrichten zu erhalten. Nachrichten können direkt auf dem Server verschoben und gelöscht werden; die Authentifizierung kann verschlüsselt erfolgen, uvm. Aus diesem Grund kann IMAP4 sehr gut in Intranets eingesetzt werden, in denen von mehreren Rechnern aus (z.B. Laptop und Arbeitsplatz) die gleiche E-Mail gelesen werden soll. Da die E-Mail zentral auf dem Server verbleibt, kann sie in das Backup-Konzept eingebunden werden, so dass der Ausfall eines Arbeitsplatzes keinen Verluste der E-Mail bedeutet. Hierzu ist allerdings auf eine entsprechende Leistungsfähigkeit des Servers zu achten.

Courier-IMAP

Courier-IMAP ist eine sehr große und mächtige Lösung, um Mails auf einem System zu verwalten. Die Installation und Konfiguration von Courier-IMAP ist aber gar nicht so schwer und aufwendig, wie es auf den ersten Blick erscheinen mag. Ein Grundsystem für einen oder mehrere User ist schnell zusammengestellt. Da Courier-IMAP auf das Maildir-Format aufsetzt, muss jedoch gewährleistet sein, dass diese Mails bereits vorm Zugriff mit Courier in diesem Format vorhanden sind. Anders als im mbox-Format liegen die einzelnen Mails dabei jeweils in Unterverzeichnissen. Pro Folder (IMAP-Ordner) gibt es drei Unterverzeichnisse, nämlich new, cur und tmp. Das haben wir oben schon erledigt :)

Installation von courier-imap

apt-get install courier-imap
Kontrolle
pate:~# netstat -lntp | grep 143
tcp        0      0 0.0.0.0:143             0.0.0.0:*               LISTEN     3665/couriertcpd

Es gibt dann Zwei Konfigurationsdateien die in der Regel nicht angepasst werden müssen

pate:/etc/courier# cat authdaemonrc
#authmodulelist und authmodulelistorig legen die Art der Userauthentifizierung fest. daemons legt #die Anzahl der gleichzeitig laufenden Authentifizierungs-Daemons fest. Wenn nicht mehr als #ungefähr 20 Mailboxen gleichzeitig angesteuert werden sollen, reicht einer. Ansonsten ist die #Anzahl dementsprechend zu erhöhen.
authmodulelist="authpam"
authmodulelistorig="authcustom authcram authuserdb authldap authpgsql authmysql authpam"
daemons=5
version=""
authdaemonvar=/var/run/courier/authdaemon
pate:/etc/courier# cat imapd
# Adresse wo der imap server lauschen soll
ADDRESS=0
# der Port der imap verwenden soll 
PORT=143
#maxiamleAanzahl der imap daemons
MAXDAEMONS=40

#Maixmale Verbindungen per IP
MAXPERIP=20

#Datei der die Prozess id enthält Prozess ID
PIDFILE=/var/run/courier/imapd.pid
# Optionen der couriertcpd sollten nicht geändert werden
TCPDOPTS="-nodnslookup -noidentlookup"
#Wenn  AUTHMODULES="authdaemon", gesetzt ist “DO NOT CHANGE IT”
#Ändere den Parameter in der /etc/courier/autdaemon
AUTHMODULES="authdaemon"
#fuer das webminmodul
AUTHMODULES_ORIG="authdaemon"

#Debuglevel
DEBUG_LOGIN=0
# antwort auf das CAPABILITY-Kommando
IMAP_CAPABILITY="IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE"
# custom keywords freischalten
IMAP_KEYWORDS=1
# für webadmin
IMAP_CAPABILITY_ORIG="IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA AUTH=CRAM-MD5 AUTH=CRAM-SHA1 IDLE"
# Idle-Timeout des IMAP-Servers
IMAP_IDLE_TIMEOUT=60
#SASL PLAIN authentifizierung nach STARTTLS erlauben
IMAP_CAPABILITY_TLS="$IMAP_CAPABILITY AUTH=PLAIN"
# wird von webadmin benutzt
IMAP_CAPABILITY_TLS_ORIG="$IMAP_CAPABILITY_ORIG AUTH=PLAIN"
# darf der Client auf dem Server Thread und SORT Kommandos ausführen? (erhöht die Serverlast!)
IMAP_DISABLETHREADSORT=0
# In allen Ordnern nach neuer Mail suchen (nur sinnvoll, wenn Mails auf dem Server in die
# Unterordner sortiert werden). Erhöht die Last auf dem Server!
IMAP_CHECK_ALL_FOLDERS=0
# Workaround für Fehlerhafte Clients
IMAP_OBSOLETE_CLIENT=0
# Maximale größe des Serverprozesses (64MB) – kann gegen DoS-Attacken schützen 
IMAP_ULIMITD=65536
# sollte bei der benutzung von “shared folders” unbedingt aktiv sein!
IMAP_USELOCKS=1
# Index aller zugänglichen Ordner
IMAP_SHAREDINDEXFILE=/etc/courier/shared/index
#Idle-Modus (für Konkurrierende Updates)
IMAP_ENHANCEDIDLE=0
# Name des Trash-Folders (für Outlook-Kompatibilität sollte hier “Deleted Items” stehen)
IMAP_TRASHFOLDERNAME=Trash
# Trash-Folder nach 7Tagen, Sent-Folder nach 30Tagen löschen (bezieht sich auf CTIME-Stamp)
IMAP_EMPTYTRASH=Trash:7,Sent:30
# Mails löschen oder in den Mülleimer werfen?
IMAP_MOVE_EXPUNGE_TO_TRASH=0

#Zusatzfeature: Mails verschicken durch ablegen in diesem Ordner
OUTBOX=.Outbox
# dazu wird das folgende sendmail aufgerufen
SENDMAIL=/usr/sbin/sendmail
# Headerfeld in dem der Absender nochmals hinterlegt wird, wenn eine Mail wie oben verschickt
# wird
HEADERFROM=X-IMAP-Sender
# IMAPD starten? (wird von manchen Distributionen in Init-Skripten abgefragt)
IMAPDSTART=YES
# Pfad zum Maildir
MAILDIRPATH=Maildir

Sicherheit mit SSL

Secure Socket Layer (SSL v2/3) bzw. der Nachfolger Transport Layer Security (TLS vl) stellen ein Verfahren dar, mit dem sich beliebige TCP/IP-Verbindungen ver­schlüsseln lassen. Sie setzen dabei auf sehr niedriger TCP/IP-Ebene in der Übertragung an (für Pro­fis: OSI-Schicht 3). Anders als als PGP, das auf Applikationsebene arbeitet (z. B. in der Mailsoftware), sichert SSL/TLS unmittelbar die TCP/IP-Verbindung zwi­schen zwei Hosts. Das macht es so flexibel, denn nahezu jedes Protokoll, das mit einem einzelnen Verbindungskanal auskommt, lässt sich damit über SSL/TLS absichern. Bekannte Vertreter sind z. B. HTTPs, POPSs, IMAPs oder SMTPs. SSL/TLS funktioniert dabei grundsätzlich wieder nach dem von PGP bekannten Double-Key-Verfahren, d. h., es können auch zwei Hosts eine abhörsichere Verbin­dung aufbauen, die sich vorher noch gar nicht kannten. Durch das Double-Key-Verfahren ist es unnötig, über einen zweiten gesicherten Kanal zu verfügen, über den ein Schlüssel transportiert werden kann. Auch ein von vornherein mitlau­schender Angreifer bekommt die Secret Keys nie in die Hände - und ist damit nicht in der Lage, die mitgeschnittene Kommunikation zu dekodieren. Eine verschlüsselte Verbindung zu einem unbekannten Host aufzubauen ist also kein Problem - etwas anders sieht es bei der Frage der Authentifizierung aus. Es könnte ein Angreifer in der Mitte sitzen und die übertragenen Schlüssel durch eigene ausgetauscht haben. Nur durch das Double-Key-Verfahren allein können wir Verschlüsselung einsetzen, können aber nicht garantieren, dass wir auch tat­sächlich mit demjenigen Daten austauschen, von dem wir glauben, er sei unser Partner. Dieses Problem löst eine Signierung eines Public Keys. Dabei steht eine so genann­te Certification Authority (CA) durch eine digitale Unterschrift dafür ein, dass sie sich höchstselbst davon überzeugt hat, dass dieser Schlüssel einer bestimmten Person oder Organisation gehört. CAs sind dabei nicht vorbestimmt: Praktisch jeder kann seine eigene CA aufma­chen und seine eigenen oder die Schlüssel Dritter signieren. Nur stellt sich die Frage, ob der Rest der Welt diese selbstgemachten CAs kennt und ihnen vertraut. Große professionelle CAs haben dafür gesorgt, dass ihre CA-Schlüssel in den üb­lichen Mail- und Webclients bereits fest eingebunden sind. Jeder dieser Clients kann die von diesen CAs signierten Schlüssel sofort als gesichert und vertrau­enswürdig übernehmen. Bei selbtgebauten CAs fällt das weg: Die Schlüssel sind zwar signiert - aber eben­falls von einer dem Client unbekannten CA. Der Client muss also den Benutzer fragen, ob er dieser CA vertraut. In der Praxis ist das ein einmaliger Vorgang. An der Qualität der Verschlüsselung ändert das rein gar nichts - nur die Frage, ob dieser Schlüssel dem gehört, von dem er zu sein scheint, lässt sich nicht hundert­prozentig klären. Deshalb werden sich auch viele Firmen weiterhin ihre Schlüssel teuer von be­kannten, etablierten CAs signieren lassen: http://www.verisign.com http://www.thawte.com Wichtig sind absolut sicher authentifizierte Schlüssel vor allem bei Web-Servern: Hier wird garantiert, dass ein HTTPs-Schlüssel tatsächlich zur angesprochenen Webseite einer Bank gehört, und nicht etwa einem Man-in-the-Middle, der den Schlüssel ausgetauscht hat und so unsere Daten und PIN-Nummern zum Online-Banking ausspionieren möchte. Weitere zentrale Einsatzgebiete sind z. B. das Über­tragen von Konto- oder Kreditkartendaten beim Online-Shopping - aber auch die Abfrage von e-Mail Postfächern per e-Mail oder dergleichen. Auch Mailserver lassen sich über SSL/TLS sichern: POPSs, IMAPs und SMTPs sind sehr sinnvoll und wünschenswert, aber bislang leider kaum vertreten. Die eigentlichen Verfahren POPS, IMAP und SMTP kommen dabei wie gewohnt zum Einsatz, an ihnen ändert sich nichts! SSL/TLS ist ja gerade eine Verschlüsselung auf Transportebene, d. h., die gesamte Verbindung wird gesichert, und darüber läuft dann „normales" POPS ab. Genauer könnte man sagen: HTTP, POPS, IMAP, SMTP über SSL/TLS. So gut wie alle heutigen Mailclients unterstützen das. Manchmal ist es direkt als POPSs oder IMAPs benannt, manchmal ist es etwas verklausuliert in der Konfi­guration zu finden: „Server erfordert sichere Verbindung." Auf jeden Fall sollten Sie Ihre Nutzer grundsätzlich anhalten, diese Verfahren zu benutzen - es gibt eigentlich keine Nachteile, außer etwas CPU-Last. Auch hausintern sollten Sie grundsätzlich Verschlüsseltes POPS und IMAP einsetzen: Ausgespähte Passwör­ter sind ein vollkommen überflüssiges Sicherheitsrisiko. Die Frage der Authentifizierung des Mailservers spielt dabei eine unwichtigere Rolle als bei Web-Servern. Häufig werden deshalb selbstsignierte Schlüssel ein­gesetzt, denn das spart die Signierungsskosten einer kommerziellen CA. Der An­wender kann dann darauf vertrauen, dass der Schlüssel tatsächlich zu seinem Mailserver gehört. Denn anders als beim Web hat es der Nutzer i. d. R. nicht mit völlig fremden, wechselnden Webservern unbekannter Anbieter zu tun, sondern stets mit „seinem" Mailserver, auf dem sein Postfach liegt. Mailclients warnen teilweise beim Aufbau von POP3s oder IMAPs-Verbindungen zu Servern mit selbstsignierten Schlüsseln. Doch da der Nutzer diese Schlüssel lokal akzeptieren und abspeichern kann, ist man für die Zukunft trotzdem ge­sichert und kann Authentizität garantieren: Würde ein Angreifer den Schlüssel austauschen, so würde das der Mailclient merken, denn der übertragene Schlüs­sel stimmt nicht mehr mit dem gespeicherten überein. Nicht unbedingt die Authentifizierung ist es also, die uns treibt, sondern die Verschlüsselung der Mailverbindungen! Sowohl die e-Mails als auch der POP3/ IMAP-Dialog wird kodiert. Und dadurch gehen auch Zugangsdaten zum Post­fach nie im Klartext über das Netz. SSL/TLS macht jedoch Systeme wie PGP keinesfalls überflüssig. Denn SSL/TLS sichert nur den Moment des Transports. In der Sekunde des Abrufs gehen alle Daten unlesbar über die Leitung. Auf dem Server selbst und auch auf dem Client liegen sie hingegen im Klartext vor, wie immer. Ein Angreifer könnte die Mails dort problemlos lesen. Auch sonst kann man nie sicherstellen, wie eine e-Mail an das Ziel gelangt. Die wenigsten Mailserver versuchen untereinander eine SMTPs-Verbindung aufzubauen, i. d. R. wird Klartext-SMTP verwendet. Wollen wir also den elektronischen Briefumschlag zukleben, brauchen wir PGP. Und wollen wir unsere Login-Daten geheim halten, brauchen wir SSL/TLS. Es ist keine Frage des „entweder-oder", sondern eine Frage des „sowohl-als auch"!


Mails abholen mit IMAP-SSL

Trotz seiner zusätzlichen Funktionalitäten überträgt IMAP sowohl Authentifizierung als auch die eigentlichen E-Mails unverschlüsselt. Hier hilft das Zusatzpaket courier-imap-ssl. Installiert wird es durch den Aufruf voneinander

apt-get install courier-imap-ssl

Nach dem Download, vor der Installation erscheint ein Textfenster welches darauf hinweist, dass das Paket während der Installation ein selbstsigniertes Zertifikat generieren wird. Dieses ist zu demonstrationszwecken ausreichend. Für den Produktivbetrieb ist es jedoch unter Umständen angebracht das Zertfikat von einer offiziellen Zertifizierungsstelle unterschreiben zu lassen, so dass die Gültigkeit von jedem E-Mail-Client überprüft werden kann.

Imap1.jpg

Nachdem das Paket installiert und das Zertifikat generiert ist sollte der imap-ssl Daemon starten. Dies kann mit

pate:~# netstat -lntp | grep 993
tcp        0      0 0.0.0.0:993             0.0.0.0:*               LISTEN     16786/couriertcpd

überprüft werden. Die Konfiguration ähnelt der des normalen IMAPd. Tatsächlich ist es sogar so, daß zuerst dessen Konfiguration eingelesen und dann durch den Inhalt von imapd-ssl ergänzt. Dadurch wird der Konfigurationsaufwand merklich verringert, da nicht alle Defaults noch einmal gesetzt werden müssen.

pate:~# cat /etc/courier/imapd-ssl
#Port an dem imap-ssl lauschen soll
SSLPORT=993
#IP-Adresse (falls nich alle)
SSLADDRESS=0
#PID-Files
SSLPIDFILE=/var/run/courier/imapd-ssl.pid
IMAPDSSLSTART=YES
#IMAP-StartTLS-Funktionalität
IMAPDSTARTTLS=YES
#Login nur mit TLS, wenn Wert=1
IMAP_TLS_REQUIRED=0
COURIERTLS=/usr/bin/couriertls
TLS_PROTOCOL=SSL3
TLS_STARTTLS_PROTOCOL=TLS1
#Nur bestimmte Verschlüsselungsalgorithmen zulassen
# TLS_CIPHER_LIST="ALL:!ADH:RC4+RSA:+SSLv2:@STRENGTH"
#Pfad zur Zertifikatsdatei
TLS_CERTFILE=/etc/courier/imapd.pem
#Soll das Clientzertifikat überprüft werden (NONE=nein, PEER=wenn der Client ein Zertifikat
# vorlegt, REQUIREPEER=Fehler, wenn der Client kein Zertifikat vorlegt)
TLS_VERIFYPEER=NONE
#Sessioncache (experimentell)
TLS_CACHEFILE=/var/lib/courier/couriersslcache
TLS_CACHESIZE=524288
#Pfad zum Maildir
MAILDIRPATH=Maildir

Mails sicher verschicken: Postfix-mit TLS

Um auch den Mailversand über Postfix sicher zu machen brauchen wir noch einige Pakete:

apt-get install postfix-tls libsasl2-modules-gssapi-heimdal libsasl2-modules sasl2-bin 

Anders als bei Courier müssen wir das Zertifikat hier jedoch selbst generieren. Dabei hilft uns OpenSSL. Die Befehle

/usr/lib/ssl/misc/CA.sh -newreq	# zum erstellen einer Zertifizierungsanfrage
/usr/lib/ssl/misc/CA.sh -sign	# zum unterschreiben der selben

und

openssl rsa < newreq.pem > key.pem 	# um einen Key ohne Passwort zu erhalten

sollten ausreichen, wenn schon eine CA existiert. Ansonsten kann eine solche vorher mit

/usr/lib/ssl/misc/CA.sh -newca

einfach erstellt werden.

Aschließend müssen die Zertifikate an die richtigen stellen kopiert werden:

cp newcert.pem /etc/postfix/cert.pem
cp key.pem /etc/postfix/key.pem
cp demoCA/cacert.pem /etc/postfix/CAcert.pem
chmod 400 /etc/postfix/*.pem

Damit ist Postfix vorbereitet. Nun muß TLS noch aktiviert werden. Hierzu werden folgende Einträge in der main.cf benötigt:

# aktiviert STARTTLS wenn Postfix Server ist:
smptd_use_tls = yes

# Loggt (nicht) in den Received-Zeilen:
smtpd_tls_received_header = no

smtpd_tls_key_file = /etc/postfix/key.pem
smtpd_tls_cert_file = /etc/postfix/cert.pem
smtpd_tls_CAfile = /etc/postfix/CAcert.pem

# Aktiviert STARTTLS wenn Postfix ausliefert:
smtp_use_tls = yes

smtp_tls_key_file = /etc/postfix/key.pem
smtp_tls_cert_file = /etc/postfix/cert.pem
smtp_tls_CAfile = /etc/postfix/CAcert.pem


Auch die master.cf muß angepasst werden:

smtps     inet  n       -       n       -       -       smtpd -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes
submission     inet  n       -       n       -       -       smtpd -o smtpd_enforce_tls=yes -o smtpd_sasl_auth_enable=yes

(Diese beiden Zeilen sind dort wahrscheinlich schon vorhanden und müssen lediglich durch entfernen des Kommentarzeichens aktiviert werden)

Beispiel mit sasl

Pakete

  • Postfix
  • Courier-imap-ssl
  • sasl2-bin

Installation

apt-get install postfix
apt-get install courier-imap-ssl
apt-get install sasl2-bin

Konfiguration

  • Maildir Vorlage anlegen
mkdir -p /etc/skel/Maildir/new
mkdir -p /etc/skel/Maildir/cur
mkdir -p /etc/skel/Maildir/tmp
In /etc/postfix/main.cf
ändern
mydestination = echt-jetzt.de, smtp.echt-jetzt.de, mail.echt-jetzt.de, localhost.echt-jetzt.de, localhost
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 ${externeip adresse}
hinzufügen
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_mynetworks,
                               permit_sasl_authenticated,
                               reject_unauth_destination

smtpd_helo_restrictions = permit_sasl_authenticated,
                          permit_mynetworks,
                          reject_invalid_hostname,
                          reject_unauth_pipelining,
                          reject_non_fqdn_hostname

smtpd_sasl_path = smtpd
home_mailbox=Maildir/

broken_sasl_auth_clients = yes
In /etc/postfix/master.cf
unkommentieren
smtps     inet  n       -       -       -       -       smtpd
 -o smtpd_tls_wrappermode=yes
 -o smtpd_sasl_auth_enable=yes
 -o smtpd_client_restrictions=permit_sasl_authenticated,reject


/etc/postfix/sasl/smtpd.conf erstellen
echo "pwcheck_method: saslauthd" >> /etc/postfix/sasl/smtpd.conf
echo "mech_list: PLAIN LOGIN" >> /etc/postfix/sasl/smtpd.conf
echo "saslauthd_path: /var/run/saslauthd/mux" >>/etc/postfix/sasl/smtpd.conf
gruppenberechtigung für SASL setzen
adduser postfix sasl

SASL Socket in den chroot legen


In /etc/default/saslauthd
ändern
START=yes
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd"
daemons neu starten
/etc/init.d/saslauthd restart
/etc/init.d/postfix restart
sasl testen
testsaslauthd -f  /var/spool/postfix/var/run/saslauthd/mux   -s smtp -u user -p userpasswd

Courier Zertifikat einrichten

cat example.com.key example.com.crt > /etc/courier/imapd.pem
cp ca.pem  /etc/ssl/certs/
/etc/init.d/courier-imap-ssl restart

Open-Relay Test

  • Von aussen

http://www.mailradar.com/openrelay/

http://www.abuse.net/relay.html

  • Telnet auf localhost
telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 echt-jetzt.de ESMTP Postfix (Ubuntu)
HELO whitehouse.com
250 echt-jetzt.de
MAIL From:<goerge.w@whitehouse.com>
250 2.1.0 Ok
RCPT TO:<hutze@echt-jetzt.de>
250 2.1.5 Ok
Subject:Matter of national security!
221 2.7.0 Error: I can break rules, too. Goodbye.

Roundcube einfach

sudo apt-get install roundcube roundcube-mysql
sudo gedit /etc/roundcube/apache.conf
sudo /etc/init/d/apache2 restart
sudo gedit /usr/share/roundcube/program/include/iniset.php
PHP Code:
$include_path.= '/usr/share/php' . PATH_SEPARATOR; 
after the line 46 :
PHP Code:
$include_path.= INSTALL_PATH . 'program/include' . PATH_SEPARATOR;

Roundcube Web Frontend

apt-get install php-pear php5-mysql php-mdb2 php-net-smtp php-mail-mime
sudo apt-get install lamp-server^
pear install channel://pear.php.net/Net_IDNA2-0.1.1
echo date.timezone = 'UTC' >> /etc/php5/pache2/php.ini
Roundcube runter laden
neuste version runterladen
Tar umbenennen und entpacken
tar xzf roundcubemail-0.*.tar.gz
Roundcube in Web-server verschieben
mv roundcubemail-0.6 /var/www/webmail
MySQL installieren
apt-get install mysql-server
MySQL für Roundcube einrichten
mysql -u root -p
CREATE DATAVABASE roundcube;
CREATE USER roundcube;
SET PASSWORD FOR 'roundcube' = PASSWORD('12345');
GRANT ALL PRIVILEGES ON roundcube.* TO 'roundcube' IDENTIFIED BY '12345';
exit
mysql roundcubemail -p < SQL/mysql.initial.sql
Roundcube installer ausführen über Browser
http://example.de/webmail/installer
Konfiguration über Browser
  • Bei Database setup die korrekten Daten eintragen
  • Bei IMAP Settings den default_host mit ssl: ssl://imap.example.de eintragen und port auf 993 stellen
  • Bei SMTP Setiings den smtp_server mit ssl: ssl://smtp.example.de eintragen und port auf 465 stellen sowie Use the current IMAP username and password for SMTP authentication ankreuzen!
  • Continue
Die angezeigten Konfigurations Dateien
db.inc.php und main.inc.php in dem /config Ordner der Roundcube Installation anlegen und übernehmen
  • Continue
In der Roundcube Installation die Ordner temp und logs sowie die eben erstellten Konfigurationsdateien für den Webserver beschreibbar machen
chown www-data temp logs config/db.inc.php config/main.inc.php
installer aus der Roundcube installation entfernen
rm installer

Roundcube Plugin installieren - carddav

Annahme: Roundcube Verzeichnis ist /var/www/webmail

(sollte roundcube in einem anderen Verzeichnis sein bitte entsprechend anpassen)


Paket herunterladen und in Plugin-Verzeichnis entpacken und evtl. umbenennen, Rechte anpassen

tar xvfz carddav_x.tar.bz2 /var/www/webmail/plugins/
mv /var/www/webmail/plugins/carddav_x /var/www/webmail/plugins/carddav

PostgreSQL - roundcube Datenbank anpassen - Ausführen von ../plugins/carddav/SQL/postgres.sql:

psql -Uroundcube roundcube < /var/www/webmail/plugins/carddav/SQL/postgres.sql

ODER:

MySQL - roundcube Datenbank anpassen - Ausführen von ../plugins/carddav/SQL/mysql.sql:

mysql -u roundcube -p roundcubemail < /var/www/webmail/plugins/carddav/SQL/mysql.sql

in Datei vi /var/www/webmail/config/main.inc.php das Plugin aktivieren:

// List of active plugins (in plugins/ directory)
$rcmail_config['plugins'] = array('carddav');

Konfigdatei anlegen

 cp /var/www/webmail/plugins/carddav/config.inc.php.dist /var/www/webmail/plugins/carddav/config.inc.php

Danach im Browser unter 'Einstellungen' das carddav Plugin konfigurieren.

Roundcube Plugin installieren - calendar

Annahme: Roundcube Verzeichnis ist /var/www/webmail

(sollte roundcube in einem anderen Verzeichnis sein bitte entsprechend anpassen)

Voraussetzung: Installation von myroundcube Plugin Manager

Zuerst myroundcube Plugin Manager installieren

Paket von http://myroundcube.com/myroundcube-plugins/plugin-manager herunterladen und in Plugin-Verzeichnis entpacken

unzip plugins.zip -d /var/www/webmail/

Plugin aktivieren

vi /var/www/webmail/config/main.inc.php

// List of active plugins (in plugins/ directory)
$rcmail_config['plugins'] = array('carddav','plugin_manager');

Der naechste Benutzer, der sich anmeldet gilt als plugin manager admin benutzer (kann auch in config.inc.php angegeben werden, dazu dann config.inc.php.dist nach config.inc.php kopieren und bearbeiten)

Falls Feld Kundennummer leer:

Bei Einstellungen->Erweiterungen verwalten->Kundenkonto->neue Kundennummer anforden

Dann:

Einstellungen -> Bereich Erweiterungen Verwalten -> Updates herunterladen ->I agree-> Liste der Plugins

Drauf achten, dass bei den gewünschten Plugins in der checkbox ein Häckchen hat und 'Zip-Archiv herunterladen' anklicken (zur Sicherheit am besten noch rechts unten 'kostenpflichtige Downloads abwählen' anklicken)

folge Plugins auswählen:

calendar
jqueryui
jscolor
qtip
http_auth
http_request
timepicker

Datei (plugins.zip) auf Server kopieren und in Plugin Verzeichnis enpacken:

unzip /root/plugins.zip -d /var/www/webmail/

MySQL - roundcube Datenbank anpassen - Ausführen von ../plugins/calendar/SQL/mysql.sql:

mysql -u roundcube -p roundcubemail < /var/www/webmail/plugins/calendar/SQL/mysql.sql

Konfigdatei anlegen

 cp /var/www/webmail/plugins/calendar/config.inc.php.example /var/www/webmail/plugins/calendar/config.inc.php

config.inc.php solange bearbeiten, bis beim Aufruf von 'Einstellungen' keine php Fehler mehr auftauchen, also Löschen bzw. auskommentieren der Modulabschnitte in der Konfig, die zu nicht installierten Modulen gehören.

Fertig.

MX Backup Mailserver einrichten

MX Record auf DNS in zone des Mainservers eintragen
MX      20 mail.zweebrigge.de.
Auf Mainserver in main.cf hinzufügen
smtpd_recipient_restrictions = permit_mynetworks,
                               permit_sasl_authenticated,
                               reject_unauth_destination,
                               permit_mx_backup
Auf Backupserver in main.cf hinzufügen
smtpd_recipient_restrictions = permit_mynetworks,
                               permit_mx_backup,
                               permit_sasl_authenticated,
                               reject
relay_domains = $mydestination, hash:/etc/postfix/relay_domains
maximal_queue_lifetime = 60d
In /etc/postfix/maps/relay_domains Mainserver Domain eintragen
echt-jetzt.de x
Postfix lookup table aktivieren
postmap relay_domains
Postfix neustarten
/etc/init.d/postfix restart

Mail Forward

Um mit Postfix ein forwarding von Mails einzurichten muss man in /etc/postfix/main.cf folgende Zeilen addieren:

virtual_alias_domains = suxer.com
virtual_alias_maps = hash:/etc/postfix/virtual

Damit werden die Domains die bei virtual_alias_domains aufgelistet sind zu Domains die der Mailserver behandelt und nicht abweißt. In unserem Beispiel wäre das die Domain suxer.com. In der Zeile mit virtual_alias_maps legt man die zuständige Konfigurationsdatei fest.

Nun erstellt man die Konfigurationsdatei in der festgelegt wird, welche domain wohin weitergeleitet werden soll mit:

vi /etc/postfix/virtual

In unserem Beispiel addieren wir jetzt folgende Zeile:

xinux@suxer.com   schmeich@daneich.de

Dies wird alle Mails die an xinux@suxer.com gesendet werden auf unserem Mailserver entgegennehmen und sie weiterleiten an schmeich@daneich.de

Nun schließen wir die Datei und laden die in Postfix ein mit:

postmap /etc/postfix/virtual
service postfix reload

Man beachte das bei jeder änderung der Datei postmap wieder aufgerufen werden muss.

authsmtp

This instructions will guide you through configuring Postfix to use AuthSMTP as an authenticated SMTP relay host for all your outbound email. First you need to make sure the email address(es) you will be sending from have been authorised for your account in our Control Panel. These instructions assume your server is already configured with Postfix, email can be received and you have external network access on one of the following ports -

23, 25, 26, 2525
>cd /etc/postfix

Backup your configuration files:

>mkdir /POSTFIX_BACKUP
>cp /etc/postfix/* /POSTFIX_BACKUP

Open your Postfix configuration file (typically /etc/postfix/main.cf) using 'vi' or an alternative file editor and do the following:

>vi /etc/postfix/main.cf

Add the following lines to the bottom of the file:

smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_mechanism_filter =
smtp_sasl_security_options =
relayhost = mail.authsmtp.com

The above configuration use's the default 'plain' SASL authentication mechanism but you have the option of PLAIN, LOGIN, CRAM-MD5 and DIGEST-MD5 but to use those is an advanced Postfix topic that should only be approached by advanced users.

This next step is optional - the default SMTP port is 25 but some ISPs block this port so if you wish to use one of the alternative ports (23, 26, 2525) please add ':' and the alternative port to the end of the 'relayhost' line, so it should read as follows:

relayhost = mail.authsmtp.com:2525

If you wish to send your messages using TLS/SSL you will need to also add the two following lines:

smtp_tls_security_level = encrypt
smtp_tls_mandatory_ciphers = high

IMPORTANT: If you do wish to send your messages using SSL you will also need to login to the Control Panel and enable SSL on your account.

Open your SASL password file (typically /etc/postfix/sasl_passwd) using 'vi' or an alternative file editor and add the following line replacing 'username' and 'password' with your AuthSMTP username and password:

mail.authsmtp.com    username:password

Save and close the file, then run the following command on your SASL password file:

>postmap hash:/etc/postfix/sasl_passwd

Once you have made the changes you will need to restart Postfix for the changes to take effect:

>/etc/rc.d/init.d/postfix restart

no shell

chsh -s /usr/sbin/nologin

Blacklist & Whitelist

Es gibt zwei verschiedene Arten zu blocken:

  • Client: IP(Range)/Hostname
check_client_access 
  • Sender: FROM-Field (= Domain)
check_sender_access 

Trage diese Regel in die main.cf ein: (Am besten fügt man das weit oben ein)

Main.cf-Eintrag

vi /etc/postfix/main.cf
smtpd_recipient_restrictions =
   check_client_access hash:/etc/postfix/client_checks,
   check_sender_access hash:/etc/postfix/sender_checks,
   ...

List-Erstellung

vi /etc/postfix/client_checks
  1. Restricts which clients this system accepts SMTP connections from.
example.com               REJECT No spammers
.example.com              REJECT No spammers, from your subdomain
123.456.789.123           REJECT Your IP is spammer
123.456.789.0/24          REJECT Your IP range is spammer
321.987.654.321           OK
example1.com              OK
vi /etc/postfix/sender_checks
  1. Restricts sender addresses this system accepts in MAIL FROM commands.
example.com              REJECT env. from addr any@example.com rejected
.example.com             REJECT env. from addr any@sub.example.com rejected
user@example.com         REJECT We don't want your email
example2.com             OK

OK is allowed REJECT is block


Wenn Änderungen vorgenommen wurden, muss man die Datenbank aktualisieren!

reload/restart

postmap /etc/postfix/client_checks
postmap /etc/postfix/sender_checks

Oder man schreibt es in /etc/init.d/postfix

vi /etc/init.d/postfix

Unter dem Casepunkt "start" fügt man an das Ende des Skriptes das an:

/usr/sbin/postmap /etc/postfix/sender_checks

Beispiel: (Auszug aus der /etc/init.d/postfix)

case "$1" in
    start)
        log_daemon_msg "Starting Postfix Mail Transport Agent" postfix
        RET=0
        # for all instances that are not already running, handle chroot setup if needed, and start
        for INSTANCE in $(enabled_instances); do
            RUNNING=$(running $INSTANCE)
            if [ "X$RUNNING" = X ]; then
                configure_instance $INSTANCE
                CMD="/usr/sbin/postmulti -- -i $INSTANCE -x ${DAEMON}"
                if ! start-stop-daemon --start --exec $CMD quiet-quick-start; then
                    RET=1
                fi
            fi
        done
        log_end_msg $RET
        /usr/sbin/postmap /etc/postfix/sender_checks
    ;;

Danach Postfix reload/restart

/etc/init.d/postfix restart

Link

http://linuxlasse.net/linux/howtos/Blacklist_and_Whitelist_with_Postfix

nützliche Tools

postconf

Zeigt alle Einstellungen der main.cf, die nicht den Defaultwerten entsprechen:

postconf -n

Zeigt den Defaultwert einer Variable an; ignoriert also den Wert aus der main.cf:

postconf -d myorigin
myorigin = $myhostname

Die Abfrage von Variablen direkt aus unserem laufenden Postfix heraus erfolgt ohne Parameterangabe:

postconf myorigin
myorigin = $mydomain

Wollen wir einen Parameter ändern, so benutzen wir die Option -e

postconf -d smtpd_client_connection_count_limit
smtpd_client_connection_count_limit = 50

 postconf smtpd_client_connection_count_limit
smtpd_client_connection_count_limit = 10

postconf -e "smtpd_client_connection_count_limit = 15"

postconf smtpd_client_connection_count_limit
smtpd_client_connection_count_limit = 15

Anschließend muss via service postfix reload der laufende Daemon noch von der Änderung an der main.cf informiert werden


postqueue

Zeigt eine vollständige Übersicht aller eMails in den Warteschlangen

postqueue -p

Alle eMails in der deferred-Queue werden sofort wieder zur Auslieferung gebracht

postqueue -f


postsuper

Um alle Nachrichten aus der Mailqueu erneut zur Auslieferung zu bringen, erreichen wir durch:

postsuper -r ALL

Löschen der eMail mit der <QUEUE-ID> aus der Warteschlange

postsuper -d <QUEUE-ID>

Will man mehrere Nachrichten eines bestimmten Absenders bzw. Empfängers löschen, so wäre die manuelle Löschung von z.B. mehreren Tausenden von Nachrichten nicht mehr durchzuführen. In der Manpage von postsuper findet man hierzu einen sehr Hilfreichen Tip (Die Variabeln sind dabei wie folgt belegt: $7=sender, $8=recipient1, $9=recipient2)

Mit folgendem Befehl löscht man z.B. alle Nachrichten von gaudiwurm@nerv.com:

mailq | tail +2 | grep -v '^ *(' | awk  'BEGIN { RS = "" } { if ($7 == "gaudiwurm@nerv.com") print $1 }' | tr -d '*!' | postsuper -d -

alternativ empfiehlt sich das delete_from_mailq.pl von Victor Duchovni

#!/usr/bin/perl

$REGEXP = shift || die "no email-adress given (regexp-style, e.g. bl.*\@yahoo.com)!";

@data = qx</usr/sbin/postqueue -p>;
for (@data) {
  if (/^(\w+)(\*|\!)?\s/) {
     $queue_id = $1;
  }
  if($queue_id) {
    if (/$REGEXP/i) {
      $Q{$queue_id} = 1;
      $queue_id = "";
    }
  }
}

#open(POSTSUPER,"|cat") || die "couldn't open postsuper" ;
open(POSTSUPER,"|postsuper -d -") || die "couldn't open postsuper" ;

foreach (keys %Q) {
  print POSTSUPER "$_\n";
};
close(POSTSUPER);


postalias

Konvertiert die Datei aliases in das binäre Datenbankformat. (Auf Grund der Doppelpunkte funktioniert hier postmap nicht!) Muss nach jedem Ändern der /etc/aliases aufgerufen werden!

postalias /etc/aliases
postmap

Konvertiert die angegebene Textdatei in das binäre Datenbankformat. Muss nach jeder Änderung an der Textdatei aufgerufen werden!

postmap /etc/postfix/policyd_weight_client_whitelist

Listet alle einträge einer Datenbank (i.e. policyd_weight_client_whitelist) auf:

postmap -s /etc/postfix/policyd_weight_client_whitelist
kundenserver.de OK


lsof

Zeigt welches Programm (Command) auf dem gennaten Port lauscht/reagiert.

lsof -i :25
COMMAND   PID    USER   FD   TYPE  DEVICE SIZE NODE NAME
smtpd   22703 postfix    6u  IPv4 2790158       TCP *:smtp (LISTEN)
smtpd   22803 postfix    6u  IPv4 2790158       TCP *:smtp (LISTEN)
master  31413    root   11u  IPv4 2790158       TCP *:smtp (LISTEN)

mailx

Nachrichtentext (Mailbody) wird mit dem Subject „Betreff“ an den postmaster und in cc an bigchief geschickt

echo Nachrichtentext | mailx -s "Betreff" -c bigchief postmaster


uuenview

Will man Nachrichten mit Anhängen von der Konsole aus verschicken, so z.B. Status- oder Logfiles via cronjob, so bendient man sich am besten uuenview. Das Postfixlog (/var/log/maillog) wird als Anhang an den User mit der Adresse empfaenger@nausch.org geschickt. Absender ist absender@nausch.org, wobei wir als Rückantwortadresse rueckantwortadresse@nausch.org mitgeben.

# /usr/bin/uuenview -b -s "Betreff" -r rueckantwortadresse@nausch.org -f absender@nausch.org -m empfaenger@nausch.org /var/log/maillog

Links

http://nodomain.cc/2007/03/14/howto-postfix-als-backup-mx-einrichten.html
http://www.cyberciti.biz/faq/linux-unix-bsd-postfix-forward-email-to-another-account/
http://dokuwiki.nausch.org/doku.php/centos:mailserver:nuetzliche_kommandos_rund_um_postfix
http://www.authsmtp.com/postfix/
http://www.huschi.net/4_220_de-postfix-greylisting-mit-postgrey-debian.html
http://www.weareroot.de/2008/07/24/postfix-absender-bei-mailversand-von-der-konsole-anpassen/