====== MailServer ======
===== Bestandteile der eMail-Infrastruktur =====
{{:server:email-kette.png|aus: http://de.wikipedia.org/wiki/Datei:E-mail.svg Lizenz: GNU FDL}}
* [[wpde>E-Mail-Programm|MUA (Mail User Agent) = eMail-Programm]]: ein Programm, mit dem E-Mails empfangen, gelesen, geschrieben und versendet werden.
* [[netzwerke:SMTP]]: Protokoll zur Übertragung der eMail-Daten
* [[wpde>Mail Transfer Agent]] (MTA; auch Mail Transport Agent): Ein Programm, das den Transport und die Verteilung von Nachrichten erledigt
* MX-Record (Mail Exchange-Record) (siehe [[netzwerke:DNS]]: Zeigt auf die zuständigen Mail-Server einer Domain, wird vom [[wpde>Mail Transfer Agent|MTA]] ausgewertet
* [[wpde>Mail Delivery Agent]] (MDA): Eine Software, die eingehende E-Mails annimmt und sie nach bestimmten Kriterien an die Empfänger verteilt.
* [[wpde>Mail Retrieval Agent]] holt E-Mails von einem Mailserver, genauer dem [[wpde>Mail Delivery Agent]] (MDA), ab und speichert sie auf dem lokalen Rechner.
* [[netzwerke:POP3]]/[[netzwerke:IMAP]]: Protokolle zum eMail-Abruf.
* **[[Spamfilterung]]**
==== DNS Blacklisting ====
[[wpde>Realtime Blackhole List]] (RBL) bzw. DNS-based Blackhole List (DNSBL): In Echtzeit (realtime) abfragbare schwarze Listen, die verwendet werden, um E-Mail zweifelhafter Herkunft als Spam zu klassifizieren. Die Listen werden von sog. DNS-Blacklistern gepflegt.
* [[http://www.heise.de/ix/nixspam/|iX DNSBL]]
* [[http://www.spamhaus.org/|Spamhaus.org]]
* [[http://www.surbl.org/|SURBL - Spam URI Realtime Blocklists]]
* [[http://uribl.com/|URIBL.COM]]
==== Greylisting ====
[[wpde>Greylisting]]: Die erste E-Mail von unbekannten Absendern wird temporär abgewiesen und erst nach einem zweiten Zustellversuch angenommen. Gute Software wie [[postgrey]] (oder amavisd-new) lernt verlässliche Mailserver automatisch und sorgt somit bei bekannt (zuverlässigen) Sendern für eine sofortige Zustellung.
==== Sender Policy Framework (SPF) ====
Das Verfahren [[wpde>Sender Policy Framework (SPF)]] macht überprüfbar welche Computer E-Mails für eine Domäne versenden dürfen.
Dazu wird in der [[netzwerke:DNS]]-Zone einer Domäne ein sog. Resource Record vom Typ TXT oder SPF mit Informationen darüber hinterlegt, welche Computer E-Mails für diese Domäne versenden dürfen. Anhand dieser Informationen soll nach RFC 4408 der Empfangs-Server dann sowohl die "MAIL FROM"-Identität als auch die "HELO"-Identität des Senders nachprüfen.
* [[http://www.openspf.org/SPF_Record_Syntax|SPF Syntax]]
Schema:
v=spf1 mx a include:mailxy.domain.tld ip4:WeitereIP.IP.IP.IP ~all
- **a** "Meine Webseiten verschicken Mails, z.B. über Formmailskripte oder als Teil der installierten Programme wie Forum, Shoplösung etc." ansonsten weglassen.
- **include:smtp-server** (weiterer SMTP-Server)
- ip4:WeitereIP.IP.IP.IP (zusätzliche IPs von smtp-Server)
- **~all** (=nicht alle aufgelistet); **-all** (ALLE Mailserver aufgelistet, Vorsicht!)
**Problematisch an SPF ist**, das SMTP bewusst keine Aussage darüber treffen wollte wer den "Briefkasten" spielt. Daher gibt es einige Szenarien die bei -all Probleme bereiten:
* Weiterleitungen an einen anderen Provider
* Mailinglisten die in meinem Namen mails weiterleiten (und nicht den Envelope umschreiben)
* Artikelempfehlungen/Webgrußkarten etc. die den Absender des Empfehlenden setzen
Da zudem Spammer die ersten waren die SPF korrekt umgesetzt haben wird heute von Spamassassin ein korrekter SPF (SPF_PASS) nur noch extrem minimal positiv bewertet und ein fehlgeschlagener SPF (SPF_FAIL) zur Zeit nur mit 0,919 Punkten bestraft (siehe [[http://spamassassin.apache.org/tests_3_3_x.html|3.3.x-Tests]]). Der Einsatz von SPF hat also nur wenig bis keine praktische Auswirkung.
==== DomainKeys Identified Mail (DKIM) ====
Das [[wpde>DomainKeys]]-Verfahren führt eine Digitale Signatur ein über die der Empfänger überprüfen kann ob eine E-Mail tatsächlich unverändert vom richtigen Mailserver stammt. Dazu wird per [[netzwerke:DNS]] der öffentliche Schlüssel zugänglich gemacht und dieser durch asymmetrischer Verschlüsselung überprüft. Aufgrund dieses Konzeptes muss der E-Mail-Provider seine Systeme entsprechend angepasst haben was aus Komplexitätgründen selten passiert.
* [[http://www.dkim.org/|dpki.org]]
Wie testen?
* [[https://www.dmarcanalyzer.com/dkim/dkim-check/|DKIM DNS-Record checker]]
* [[https://www.sparkpost.com/email-tools/authentication-checker/|Authentication Checker]]
* -> Google mail zeigt in der Originalansicht des Verifikationsstatus an
===== OpenDKIM =====
Die folgende Anleitung funktioniert mit opendkim als milter in Postfix.
!!! amavisd-new könnte das auch direkt: https://dokuwiki.tachtler.net/doku.php?id=tachtler:postfix_amavis_dkim_einsetzen
Quelle: https://kofler.info/dkim-konfiguration-fuer-postfix/
apt install opendkim opendkim-tools
mkdir /etc/opendkim
mkdir /etc/opendkim/keys
chown -R opendkim:opendkim /etc/opendkim
chmod go-rw /etc/opendkim/keys
Template ''/etc/opendkim.conf''
# stefanux opendkim config
# For more advanced options, see opendkim.conf(5) and/or
# /usr/share/doc/opendkim/examples/opendkim.conf.sample.
# Log to syslog
Syslog yes
# debug:
SyslogSuccess yes
LogWhy yes
# Required to use local socket with MTAs that access the socket as a non-
# privileged user (e.g. Postfix)
UMask 007
# Sign for example.com with key in /etc/dkimkeys/dkim.key using
# selector '2007' (e.g. 2007._domainkey.example.com)
#Domain example.com
#KeyFile /etc/dkimkeys/dkim.key
#Selector 2007
# Commonly-used options; the commented-out versions show the defaults.
Canonicalization relaxed/simple
# Mode sv
# only sign:
Mode s
#SubDomains no
# Socket smtp://localhost
#
# ## Socket socketspec
# ##
# ## Names the socket where this filter should listen for milter connections
# ## from the MTA. Required. Should be in one of these forms:
# ##
# ## inet:port@address to listen on a specific interface
# ## inet:port to listen on all interfaces
# ## local:/path/to/socket to listen on a UNIX domain socket
#
#Socket local:/var/run/opendkim/opendkim.sock
Socket inet:8892@localhost
## PidFile filename
### default (none)
###
### Name of the file where the filter should write its pid before beginning
### normal operations.
#
PidFile /var/run/opendkim/opendkim.pid
# Always oversign From (sign using actual From and a null From to prevent
# malicious signatures header fields (From and/or others) between the signer
# and the verifier. From is oversigned by default in the Debian pacakge
# because it is often the identity key used by reputation systems and thus
# somewhat security sensitive.
OversignHeaders From
## ResolverConfiguration filename
## default (none)
##
## Specifies a configuration file to be passed to the Unbound library that
## performs DNS queries applying the DNSSEC protocol. See the Unbound
## documentation at http://unbound.net for the expected content of this file.
## The results of using this and the TrustAnchorFile setting at the same
## time are undefined.
## In Debian, /etc/unbound/unbound.conf is shipped as part of the Suggested
## unbound package
# ResolverConfiguration /etc/unbound/unbound.conf
## TrustAnchorFile filename
## default (none)
##
## Specifies a file from which trust anchor data should be read when doing
## DNS queries and applying the DNSSEC protocol. See the Unbound documentation
## at http://unbound.net for the expected format of this file.
TrustAnchorFile /usr/share/dns/root.key
## Userid userid
### default (none)
###
### Change to user "userid" before starting normal operation? May include
### a group ID as well, separated from the userid by a colon.
#
UserID opendkim
# OpenDKIM bei Problemen neustarten,
# aber max. 10 mal pro Stunde
AutoRestart yes
AutoRestartRate 10/1h
# interne Mails (signieren, nicht verifizieren)
InternalHosts refile:/etc/opendkim/trusted
# Hosts, denen vertraut wird (vermeidet Warnungen beim Logging)
ExternalIgnoreList refile:/etc/opendkim/trusted
# welche Verschlüsselungs-Keys sollen für welche
# Domains verwendet werden
# (refile: für Dateien mit regulären Ausdrücke)
SigningTable refile:/etc/opendkim/signing.table
KeyTable /etc/opendkim/key.table
# diesen Signatur-Algorithmus verwenden
SignatureAlgorithm rsa-sha256
''/etc/opendkim/trusted''
# Host without signature
127.0.0.1
::1
localhost
meinMailserver.stefanux.net
''/etc/opendkim/signing.table''
# Domain keyname
*@stefanux.net stefanux
''/etc/opendkim/key.table''
#Name Hostname:Selektor:Filename
stefanux stefanux.net:20201110:/etc/opendkim/keys/stefanux.private
''cd /etc/opendkim
opendkim-genkey -d stefanux.net -b 2048 -r -s 20201110''
Ergebnis:
-> 20201110.private
-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----
20201110.txt
20201110._domainkey IN TXT ( "v=DKIM1; h=sha256; k=rsa; s=email; "
"p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+CSXRWPhO3Ig3pG3WSehRCtxaa9Wr6hSy5Q6HTr9QAoNzOOnhK2/7qlxIPLw09MwVgMj+vbWZ9KtgnkRqJrO/18lk5CcL6/ozGy99bk0IHr+zp4wJTERZPUvg81oHMiZph4j6kaJixOt49hmiC50nzrirywDF1+3CjIZ/PScHPSi2/+M20DfM5+/Df3DaNPdgorwZrLLXZyGya"
"IvQl/G7a8/rdLGTlN4SYZPOjjQn2aDO8QkGdbqY+j0tTE5+bPEbCksIcciLk7pJVMgNhMwW1OSAPiZUfB+5a7gqYuicwUfvqMthWD5D4Jy2X6CeRstwBMd9USq+AmAU61YhZCN1wIDAQAB" ) ; ----- DKIM key 20201110 for stefanux.net
-> für den DNS Eintrag die Anführungszeichen + Leerzeichen wegnehmen, Ergebnis:
''dig txt 20201110._domainkey.stefanux.net +short''
"v=DKIM1; h=sha256; k=rsa; s=email; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+CSXRWPhO3Ig3pG3WSehRCtxaa9Wr6hSy5Q6HTr9QAoNzOOnhK2/7qlxIPLw09MwVgMj+vbWZ9KtgnkRqJrO/18lk5CcL6/ozGy99bk0IHr+zp4wJTERZPUvg81oHMiZph4j6kaJixOt49hmiC50nzrirywDF1+3CjIZ/PScHPSi2" "/+M20DfM5+/Df3DaNPdgorwZrLLXZyGyaIvQl/G7a8/rdLGTlN4SYZPOjjQn2aDO8QkGdbqY+j0tTE5+bPEbCksIcciLk7pJVMgNhMwW1OSAPiZUfB+5a7gqYuicwUfvqMthWD5D4Jy2X6CeRstwBMd9USq+AmAU61YhZCN1wIDAQAB
''mv /etc/opendkim/20201110.private /etc/opendkim/keys/stefanux.private
mv /etc/opendkim/20201110.txt /etc/opendkim/keys/stefanux.txt''
''chown -R opendkim:opendkim /etc/opendkim
chmod -R go-rwx /etc/opendkim/keys''
''systemctl restart opendkim''
''opendkim-testkey -d stefanux.net -s 20201110 -vvv''
opendkim-testkey: using default configfile /etc/opendkim.conf
opendkim-testkey: checking key '20201110._domainkey.stefanux.net'
opendkim-testkey: key secure
opendkim-testkey: key OK
opendkim-testkey: key secure -> dnssec OK + DKIM OK
Key not secure -> kein DNSSEC
record not found -> defekt
''/etc/postfix/main.cf'':
# openDKIM:
# accept mail when milter does not work:
milter_default_action = accept
# 6 is default:
milter_protocol = 6
smtpd_milters = inet:localhost:8892
# local generated mails:
non_smtpd_milters = inet:localhost:8892
Nov 10 20:16:16 mx1 opendkim[9055]: OpenDKIM Filter: mi_stop=1
Nov 10 20:16:16 mx1 opendkim[9055]: OpenDKIM Filter v2.11.0 terminating with status 0, errno = 0
Nov 10 20:16:16 mx1 opendkim[9321]: OpenDKIM Filter v2.11.0 starting (args: -x /etc/opendkim.conf)
Nov 10 20:16:36 mx1 opendkim[9321]: 9158A1DF87: DKIM-Signature field added (s=20201110, d=mx1.stefanux.net)
TXT für _dmarc.stefanux.net:
Type: TXT
Host/Name: _DMARC.stefanux.net
Value: v=DMARC1; p=none; rua=mailto:postmaster@stefanux.net; ruf=mailto:postmaster@stefanux.net; fo=1
rua -> DMARC reports
ruf -> forensic DMARC failure reports
[[https://mxtoolbox.com/SPFRecordGenerator.aspx|SPF-Record-Generator]]
==== DMARC ====
Das Domain-based Message Authentication, Reporting and Conformance (kurz DMARC) baut auf den bekannten Techniken SPF und DKIM auf (siehe oben).
DMARC legt zusätzlich fest auf welche Art der Empfänger mit einer Mail umgeht, die in einem oder beiden Fällen nicht den Anforderungen entspricht.
Es ist also erstmals ein Benachrichtigung (wieviel Spam unterwegs ist) und leichtere Auswertung auf Providerebene möglich.
[[http://www.msxfaq.de/spam/dmarc.htm|DMARC @msxfaq.de]]
dig txt _dmarc.ebay.de
_dmarc.ebay.de. 300 IN TXT "v=DMARC1\; p=none\; rua=mailto:ebay@rua.agari.com,mailto:dmarc_agg@auth.returnpath.net\; ruf=mailto:ebay@ruf.agari.com,mailto:dmarc_afrf@auth.returnpath.net\; fo=1\; rf=afrf\; pct=100"
===== Felder einer eMail =====
* Felder im Header einer eMAIL:
* To: Der Empfänger der eMail
* CC: grundsätzlich wie "To:", hier kann der Sender deutlich machen, dass die eMail nur eine Kopie zur Kenntnisnahme darstellt. Empfänger in diesem Feld sind für andere Empfänger sichtbar.
* BCC: Empfänger in diesem Feld sind für andere Empfänger nicht sichtbar.
* Subject: Betreff einer eMail
* X-... hinzugefügte Informationsfelder von Virenscanner, Spamfilter, Zwischenstationen, ...
Webserver richtigen Standardabsender angeben lassen (''php.ini'' oder ''httpd.conf''):
php_admin_value sendmail_from user@domain.de
php_admin_value sendmail_path "sendmail t i f user@domain.de"
===== MailServer (Opensource) =====
Unter [[linux:Linux]]:
* **cyrus** mail server: läuft nicht als root, viele Features
* [[Courier]] Mail Server
* **[[server:dovecot]]:** Design-Ziel: Sicherheit und Zuverlässigkeit (u. a. gutes Fehlerhandling)
* Perdition: POP3 and IMAP4 Proxy server
* [[http://www.web-cyradm.org/|Web-cyradm]]: eine web-basierte Verwaltungsoberfläche für cyrus-imap and [[Postfix]].
Unter [[windows:Windows]]:
* [[http://www.heise.de/download/hmailserver.html|hmailserver]] (freeware)
==== Links und Anleitungen ====
* [[http://www.hypexr.org/linux_mail_server.php|Creating a Linux Mail Server]]
* [[http://linux-magazin.de/videos/open_source_antispam_antivirus_and_mail_processing_solutions| Open source antispam, antivirus and mail processing solutions]]
* [[http://www.heise.de/open/artikel/74991/|Mailserver mit Spamfilter]]
* [[http://www.tecchannel.de/server/hardware/1750499/index.html|Zehn kritische Fehler beim Einrichten eines E-Mail-Servers]]
==== kommerzielle ====
[[http://www.axigenmailgate.de/index.html|axigen.mailserver]]
===== Mail Transfer Agents (MTAs) =====
* [[Postfix]] - flexibel, schnell, erweiterbar
* [[exim]]
* sendmail (veraltet)
* [[wpde>qmail]]
[[http://www.onlamp.com/pub/a/bsd/2003/07/24/FreeBSD_Basics.html|SMTP Proxies]]
===== Links =====
* [[http://www.tecchannel.de/storage/grundlagen/576672/|Das ungeliebte Kind E-Mail-Archivierung]]
TIP: swaks: SMTP command-line test tool
===== Push-mail =====
Push-mail wird, im Gegensatz zum periodischen Abholen (pull) der eMail, direkt nach dem eintreffen auf mobile Geräte gesendet.
Es sind offene Lösungen (IMAP-IDLE) propritären Lösungen (wie Blackberry) vorzuziehen.
FIXME
==== Anbieter ====
* [[http://www.cortado.com/eude/CortadoFree/%C3%9CberCortadoFree.aspx|Cortado free]]
===== Konfiguration =====
==== Checkliste ====
* IP Addressen der MTAs/Mailserver sollten
* nicht dynamisch sein (die werden von großen Providern blockiert und hat Kommunikationsprobleme)
* identische vorwärts- und Rückwärts-DNS-Auflösung haben
* nicht auf einer Blacklist sein
* der MTA/Mailserver sollte den zur IP-Adresse passenden Namen konfiguriert haben und sich damit melden ("greeting")
* kein offenes Relay sein (mail nur von authentizierten Benutzern annehmen bzw. nur für die eigenen Domains annehmen)
* korrekte (!) SPF/DKIM-Records helfen sind aber nicht Zwang
==== Aliase ====
Aliase für Nutzer trägt man in der Datei /etc/aliases ein. Die Änderungen gibt man durch newaliases
bekannt.
Das Format ist ''Benutzer: ALIAS'', wobei ALIAS ein anderer Benutzer oder eine eMail-Adresse sein kann. Alternativ sind auch Aufrufe vom Programme (über Pipe) möglich:
benutzer: "|/var/lib/mailman/mail/mailman post Benutzergruppe"
Das Beispiel ist von [[software:mailman]].