Postfix ist ein SMTP Server. Siehe auch [[dovecot|Dovecot]]. Von Haus aus nutzt Postfix die vorhandenen Systembenutzer als Email accounts.
postqueue -p // list queue
postqueue -f // flush queue
postsuper -d // delete specific mail
postsuper -d ALL // delete all
=====Installation=====
Die "System email" ist der Domain name (z.B zarat.ml).
apt-get install postfix
Postfix **läuft nun bereits im Hintergrund**. Die meisste Konfiguration liegt im Verzeichnis ''/etc/postfix''.
=====Spam=====
Um **nur bekannte Empfänger** zu erlauben fügt man in die Datei ''/etc/postfix/main.cf'' folgendes ein.
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
Um **nur bekannte Absender** zu erlauben fügt man folgendes ein.
smtpd_helo_required = yes
smtpd_helo_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_invalid_helo_hostname, reject_non_fqdn_helo_hostname, reject_unknown_helo_hostname
**WICHTIG** Mann kann an die ''restrictions'' eigene Scripte anhängen!
=====Postfächer=====
Um Postfix mitzuteilen welche Verzeichnisstruktur (in diesem Fall das am weitesten verbreitete Maildir) man für Mail Postfächer verwenden will fügt man in der Datei ''/etc/postfix/main.cf'' folgendes ein.
home_mailbox = MailDir/
mailbox_command =
Nun kann man bereits [[dovecot|Dovecot]] installieren um die Mailstruktur anzulegen.
Danach den Postfix Dienst neu starten.
====Spamassassin====
Nachdem man [[spamassassin|SpamAssassin]] installiert hat kann man dieses in Postfix integrieren
Die Datei ''/etc/postfix/master.cf'' bearbeiten. Die Zeile
smtp inet n - y - - smtpd
kopieren und gleich darunter einfügen. Das ''y'' in der 5. Spalte durch ein ''-'' ersetzen und **in der darauf folgenden Zeile 4 Leerzeichen voranstellen** und die Zeile ''-o content_filter=spamassassin'' einfügen. Am Ende sollte es so aussehen.
smtp inet n - y - - smtpd
smtp inet n - - - - smtpd
-o content_filter=spamassassin
Damit wird Spam aber nur erkannt, die Mails in die entsprechenden Ordner zu verschieben muss [[dovecot|Dovecot]]. Siehe auch [[sieve|Sieve]]
=====SASL Authentifizierung=====
In der Datei ''/etc/postfix/main.cf'' fügt man folgendes ein.
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
=====Verschlüsselung=====
Wenn man noch kein Zertifikat hat kann man mit [[certbot|Certbot]] eines erstellen. Um Postfix mitzuteilen das neue Zertifikat zu verwenden bearbeitet man in der Datei ''/etc/postfix/main.cf'' die Einträge. Siehe uch [[dovecot#verschluesselung|Dovecot #Verschlüsselung]].
#
# Vorsicht bei der Unterscheidung zwischen
#
# smtp -> ausgehender traffic
# smtpd -> einkommender traffic
#
smtpd_tls_cert_file = /etc/letsencrypt/live/zarat.ml/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/zarat.ml/privkey.pem
smtp_use_tls = yes
====STATTLS====
Um das ganze zu vereinfachen nutzt man **STARTTLS** dann muss man die Ports für smtps und imaps nicht extra konfigurieren sondern das ganze läuft dann auf den normalen Ports 25 und 143.
Um auch den einkommenden Verkehr zu verschlüsseln fügt man der Datei ''/etc/postfix/main.cf'' folgendes ein
smtpd_use_tls = yes
# zeige tls info in email header
smtpd_tls_received_header = yes
=====SPF=====
Mit dem sender policy framework [[https://de.wikipedia.org/wiki/Sender_Policy_Framework|Wikipedia]] kann man verhindern das fremde Mails im Namen des eigenen Servers senden können. Dazu muss man einen DNS Eintrag vom Typ TXT erstellen.
v=spf1 mx ~all
Installation über das apt tool.
apt install postfix-policyd-spf-python
Gleich zu Beginn wird in der Datei ''/etc/postfix/master.cf'' wird folgendes hinzugefügt.
policyd-spf unix - n n - 0 spawn
user=policyd-spf argv=/usr/bin/policyd-spf
In der Datei ''/etc/postfix/main.cf'' wird in die Zeile **vor den ''recipient_restrictions''** folgendes eingefügt
policyd-spf_time_limit = 3600
Ausserdem wird an den Eintrag ''smtpd_recipient_restrictions'' selbst das Argument
check_policy_service unix:private/policyd-spf
angehängt.
=====DKIM=====
[[https://de.wikipedia.org/wiki/DomainKeys|DKIM]] (DomainKeys Identified Mail) ist eine Methode, die eindeutig feststellen kann, dass eine Mail von einem ganz bestimmten Mailserver gesendet wurde. Dies wird realisiert, indem auf dem eigenen Mailserver ein Schlüsselpaar generiert wird und der öffentliche Schlüssel der Domain per DNS Eintrag beigefügt wird.
====Installation Windows====
[[https://github.com/Pro/dkim-exchange|DKIM Signer]]
====Installation Linux====
apt install opendkim opendkim-tools
Nun fügen wir den Benutzer ''postfix'' der Gruppe ''opendkim'' hinzu.
gpasswd -a postfix opendkim
Nun bearbeitet man die Datei ''/etc/opendkim.conf'' - hier kann man alles löschen und neu schreiben.
# This is a basic configuration that can easily be adapted to suit a standard
# installation. For more advanced options, see opendkim.conf(5) and/or
# /usr/share/doc/opendkim/examples/opendkim.conf.sample.
# Log to syslog
Syslog yes
# Required to use local socket with MTAs that access the socket as a non-
# privileged user (e.g. Postfix)
UMask 002
# 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 simple
Mode sv
SubDomains no
AutoRestart yes
AutoRestartRate 10/1M
Background yes
DNSTimeout 5
SignatureAlgorithm rsa-sha256
# 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 inet:8892@localhost
Socket local:/var/spool/postfix/opendkim/opendkim.sock
## 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
# Map domains in From addresses to keys used to sign messages
KeyTable refile:/etc/opendkim/key.table
SigningTable refile:/etc/opendkim/signing.table
# Hosts to ignore when verifying signatures
ExternalIgnoreList /etc/opendkim/trusted.hosts
# A set of internal hosts whose mail should be signed
InternalHosts /etc/opendkim/trusted.hosts
Jetzt muss man folgende Verzeichnisstruktur anlegen
/etc/opendkim/
/etc/opendkim/keys
Die richtigen Berechtigungen zu setzen!
chown -R opendkim:opendkim /etc/opendkim
chmod go-rw /etc/opendkim/keys
Jetzt wird die Datei ''/etc/opendkim/signing.table'' angelegt
*@zarat.ml defaul._domainkey.zarat.ml
Jetzt wird die Datei ''/etc/opendkim/key.table'' angelegt
default._domainkey.zarat.ml zarat.ml:default:/etc/opendkim/keys/zarat.ml/default.private
Jetzt wird die Datei ''/etc/opendkim/trusted.hosts'' angelegt
127.0.0.1
localhost
*.zarat.ml
Für DKIM verwendet man nicht den Serverkey - man muss einen eigenen erstellen. Dazu erstellt man das Verzeichnis ''/etc/opendkim/keys/zarat.ml''. Den Key erzeugt man mit
opendkim-genkey -b 2048 -d zarat.ml -D /etc/opendkim/keys/zarat.ml -s default -v
Die entsprechenden Berechtigungen zu setzen!
chown opendkim:opendkim /etc/opendkim/
chown opendkim:opendkim /etc/opendkim/keys/zarat.ml/default.private
====DNS Eintrag====
Wir haben einen DNS TXT Eintrag zu setzen, dieser wurde beim genereren des Schlüssels in der Datei ''/etc/opendkim/keys/zarat.ml/default.txt'' gespeichert. **Leerzeichen und ''"'' entfernen!**
Man erstellt einen TXT Eintrag mit dem Namen ''default._domainkey'' und als Inhalt den generierten Key. Es sollten 3 Attribute sein
* v=DKIM1
* k=rsa
* p=
Jetzt erstellt man das Verzeichnis ''/var/spool/postfix/opendkim'' und **setzt die entsprechenden Berechtigungen.**
mkdir /var/spool/postfix/opendkim
chown opendkim:postfix /var/spool/postfix/opendkim
In der Datei ''/etc/default/opendkim'' den Eintrag ''SOCKET'' bearbeiten.
SOCKET="local:/var/spool/postfix/opendkim/opendkim.sock"
und am Ende folgendes einfügen (falls nicht vorhanden)
USER=opendkim
GROUP=opendkim
PIDFILE=$RUNDIR/$NAME.pid
EXTRAAFTER=
Nnu mss noch die Postfix Konfiguration unter ''/etc/postfix/main.cf'' bearbeitet werden.
milter_default_action = accept
milter_protocol = 6
smtpd_milters = local:/opendkim/opendkim.sock
non_smtpd_milters = $smtpd_milters
Die Services neu starten und zum testen kann man das Programm ''opendkim-testkey'' nutzen.
opendkim-testkey -d zarat.ml -s default -vvv
=====DMARC=====
Domain-based Message Authentication, Reporting and Conformance [[https://de.wikipedia.org/wiki/DMARC|Wikipedia]]
**SPF und DKIM muss eingerichtet sein!**
Man erstellt einen DNS TXT Record mit dem Namen ''_DMARK.zarat.ml'' und folgendem Inhalt erstellen. (Es können auch 2 verschiedene Mailadressen sein, dorthin werden Security reports gesendet)
v=DMARC1; p = none; rua = mailto:postmaster@zarat.ml; ruf = mailto:manuel@zarat.ml; fo = 1;
=====User=====
====Aliases====
Aliases bedeuten die Mailkonten werden auf die UNIX Konten des Systems gemapt. Aliases werden in die Datei /etc/postfix/aliases
eingetragen.
mylongusername@domain.local username@domain.local
Danach muss man
postalias /etc/postfix/aliases
newaliases
aufrufen. Alternativ können Sie die Datei ~/.forward erstellen, z.B. /root/.forward für root. Geben Sie den Benutzer an, an den Root-Mails weitergeleitet werden sollen, z.B benutzer@lokalhost.
====Local mail====
Um Mails nur an lokale Systembenutzer (die sich in /etc/passwd befinden) zuzustellen, aktualisieren Sie /etc/postfix/main.cf
und kommentieren Sie die folgenden Zeilen aus, ändern Sie sie oder fügen Sie sie hinzu. ToDo
myhostname = zarat.ml
smtpd_banner = $myhostname SMTP (Postfix)
mydomain = zarat.ml
mydestination = $myhostname, localhost.$mydomain, localhost
inet_interfaces = $myhostname, localhost
mynetworks_style = host
default_transport = error: outside mail is not deliverable
====Virtual mail====
Virtual Mail sind Mailkonten, die keinem Benutzerkonto aus /etc/passwd
zugeordnet sind. Todo Siehe https://wiki.archlinux.org/title/Virtual_user_mail_system_with_Postfix,_Dovecot_and_Roundcube und https://wiki.dovecot.org/VirtualUsers
=====Links=====
* https://ubuntu.com/server/docs/mail-postfix
* https://wiki.archlinux.org/title/Postfix
* https://www.youtube.com/watch?v=r91lEOGtpvs
* https://www.linuxbabe.com/mail-server/setting-up-dkim-and-spf
* https://kofler.info/dkim-konfiguration-fuer-postfix/