Das schlimmste, was uns passieren kann, wäre der Betrieb eines offenen Mailrelais bzw. ein Mailserver der sich beharrlich weigert mails zu versenden und zu empfangen. Mit unserer Grundinstallation haben wir schon mal den wichtigsten Part Mailrelay erschlagen und sichergestellt, dass kein Fremder Nachrichten an Dritte verschickt, für die unser MX sich nicht zuständig und verantwortlich fühlt.
Auch wurde der Versand unserer eMail bereits entsprechend berücksichtigt.

Absicherung mit Hilfe von Restrictions

Damit aber nun unser Mailserver nicht jeden Dreck – aka SPAM & Co – definieren wir uns nun ein Regelwerk, mit Hilfe dessen wir festlegen, wann unser Server Mails annehmen oder ablehnen soll. Diese Festlegungen erfolgt mit Hilfe der Restrictions.
Der entscheidenste Moment, an dem wir nicht nur SPAM sondern auch all die anderen unerwünschten Nachrichten abzuwehren, ist der Einlieferungszeitpunkt! Was wir nicht annehmen brauchen wir auch später nicht weiterverarbeiten bzw. beachten. Analog dem Briefverkehr legen wir quasi fest, welche Sendungen überhaupt in unseren Briefkasten geworfen werden können und dürfen.
Wie bereits die Grundkonfiguration habe ich die wichtigsten Details mit Hilfe der Postfix-Bibel erarbeitet, bzw. den dortigen Beispielen entnommen. Die Bemerkungen in den nachfolgenden Restriction-Definitionen verweisen auf einzelne Kapitel im Buch!

[code language=”shell” gutter=”0″] #
# Schutz durch Restrictions für unser SOHO
# Eingetragen am 05.10.2008
#

smtpd_recipient_restrictions =
# Postmaster, abuse und andere aufgaben- oder funktionsgebundene E-Mail-Adressen (Role-Accounts) whitelisten
check_recipient_access hash:/etc/postfix/access_recipient-rfc,
# Black- und Whitelisting (Kapitel 8.2.3 White- und Blacklisting)
check_client_access hash:/etc/postfix/access_client,
check_helo_access hash:/etc/postfix/access_helo,
check_sender_access hash:/etc/postfix/access_sender,
check_recipient_access hash:/etc/postfix/access_recipient,
# Unsauberer eMails nicht annehmen (Kapitel 8.2.4 Anforderungen an Mailadressen)
reject_non_fqdn_sender,
reject_non_fqdn_recipient,
reject_unknown_sender_domain,
reject_unknown_recipient_domain,
# Unsere eigenen Nutzer zulassen-/erlauben (Kapitel 8.2.2 Relaying erlauben und verbieten)
permit_sasl_authenticated,
permit_mynetworks,
# RBL überprüfen (Kapitel 10.11 Realtime Blackhole Lists)
reject_rbl_client zen.spamhaus.org,
reject_rbl_client ix.dnsbl.manitu.net,
reject_rbl_client bl.spamcop.net,
reject_rbl_client dnsbl.njabl.org,
reject_rhsbl_client multi.uribl.com,
# Dynamische Prüfung auf existente Relay-Empfänger (Kapitel 12.2.2 Dynamische Empfänger-Verifizierung)
# reject_unverified_recipient,
# Mackupserver (MX) erlauben
# permit_mx_backup,
# alles andere an relaying verbieten (Kapitel 8.2.2 Relaying erlauben und verbieten)
reject_unauth_destination,
# Zu guter Letzt alles durchlassen, was bis jetzt noch nicht beanstandet wurde
permit[/code]

erweiterte Konfiguration unseres MXers

An Hand der Restrictions können wir unseres Postfix-Servers nun mit folgender erweiterten Konfiguration betreiben.

[code language=”shell” gutter=”0″] # postconf -n

alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
command_directory = /usr/sbin
config_directory = /etc/postfix
daemon_directory = /usr/libexec/postfix
debug_peer_level = 2
header_checks = pcre:/etc/postfix/header_checks
html_directory = no
inet_interfaces = all
mail_owner = postfix
mailq_path = /usr/bin/mailq.postfix
manpage_directory = /usr/share/man
masquerade_domains = nausch.org
mydestination = $myhostname, $mydomain, localhost, localhost.$mydomain
myhostname = mx1.nausch.org
mynetworks = 192.168.1.0/24, 127.0.0.0/8
mynetworks_style = subnet
myorigin = $mydomain
newaliases_path = /usr/bin/newaliases.postfix
queue_directory = /var/spool/postfix
readme_directory = /usr/share/doc/postfix-2.3.3/README_FILES
sample_directory = /usr/share/doc/postfix-2.3.3/samples
sendmail_path = /usr/sbin/sendmail.postfix
setgid_group = postdrop
smtpd_banner = $myhostname ESMTP $mail_name
smtpd_recipient_restrictions = check_recipient_access hash:/etc/postfix/access_recipient-rfc,
check_client_access hash:/etc/postfix/access_client,
check_helo_access hash:/etc/postfix/access_helo,
check_sender_access hash:/etc/postfix/access_sender,
check_recipient_access hash:/etc/postfix/access_recipient,
reject_non_fqdn_sender,
reject_non_fqdn_recipient,
reject_unknown_sender_domain,
reject_unknown_recipient_domain,
permit_sasl_authenticated,
permit_mynetworks,
reject_rbl_client zen.spamhaus.org,
reject_rbl_client ix.dnsbl.manitu.net,
reject_rbl_client bl.spamcop.net,
reject_rbl_client dnsbl.njabl.org,
reject_rhsbl_client multi.uribl.com,
check_client_access hash:/etc/postfix/policyd_weight_client_whitelist
check_policy_service inet:127.0.0.1:12525,
check_policy_service unix:postgrey/socket,
reject_unauth_destination,
permit
unknown_local_recipient_reject_code = 550[/code]

header_checks zur SPAM-Abwehr

Für die erweiterete SPAM-Abwehr haben wir bereits die Option header_checks = pcre:/etc/postfix/header_checks in der main.cf eingetragen.

[code language=”shell” gutter=”0″]header_checks = pcre:/etc/postfix/header_checks[/code]

Voraussetzung hierzu (Perl Compatible Regular Expressions) ist natürlich die Unterstützung des installierten Postfix. Mit

[code language=”shell” gutter=”0″] # postconf -m
btree
cidr
environ
hash
ldap
nis
pcre
proxy
regexp
static
unix[/code]

können wir testen, ob pcre unterstützt wird.

Trifft das gewählte Suchmuster bei unseren PRCE zu, so haben wir unter anderem folgene Möglichkeiten:

REJECT Nachricht mit einem fatalen Fehler 5xx ablehnen
REJECT MSG Nachricht mit dem Text MSG ablehnen
DISCARD Die Nachricht wird verworfen und zwar an alle Empfänger, sobald einer der Empfänger via DISCARD abgelehnt wird. Dem Einliefernden client wir eine erfolgreiche Zustellung mittels 250 OK vorgegaukelt.

Wollen wir nun Nachrichten von bestimmten Absendern generell blocken, so tragen wir in unsere /etc/postfix/header-checks einfach folgende Zeilen ein:

[code language=”shell” gutter=”0″] If /^From:/i
/^From: .*Euro Dice Casino.*/ REJECT Header-From-Spamschutzregel From-1001
/^From: .*happydigits.de/ REJECT Header-From-Spamschutzregel From-1000
Endif[/code]

Nachrichten mit einem speziellem Betreff filter wir wie folgt:

[code language=”shell” gutter=”0″] If /^Subject:/i
/^Subject:.*young and enhanced.*/ REJECT Header-Subject-Spamschutzregel Subj-1053
/^Subject:.*YOUR ASSISTANCE.*/ REJECT Header-Subject-Spamschutzregel Subj-1052
/^Subject:.*Potenzprobleme.*/ REJECT Header-Subject-Spamschutzregel Subj-1001
/^Subject:.*RedBull fur Ihr bestes Stueck/ REJECT Header-Subject-Spamschutzregel Subj-1000
Endif[/code]

und verweigern damit die Annahme.
Nachrichten mit einem absurden Datum im Mailheader verweigern wir durch folgende Zeilen:

[code language=”shell” gutter=”0″] /^Date: .* 200[0-7]/ REJECT Your email has a date from the past. Fix your system clock and try again.
/^Date: .* 19[0-9][0-9]/ REJECT Your email has a date from the past. Fix your system clock and try again.[/code]

DSN abstellen

DSN zu verbergen, kann ein wünschenswerter Zustand sein. Was geht schon einem externen der interne Aufbau unserer eMail-Infrastruktur an.

Wir erlauben also beim abgehenden Verkehr die Möglichkeit für unsere eigenen User, nach außen schotten wir uns jedoch ab. Dazu tragen wir in unserer /etc/postfix/main.cf folgende Zeile nach.

[code language=”shell” gutter=”0″] vim /etc/postfix/main.cf

# DSN selectiv aktivieren, bzw. sperren (Kapitel 13.11.2 DSN verbieten)
# Eingetragen am 21.11.2008
smtpd_discard_ehlo_keyword_address_maps = cidr:/etc/postfix/esmtp_access[/code]

Die zugehörige cidr-Tabelle mit den Netzdefinitionen legen wir anschließend auch noch an.

[code language=”shell” gutter=”0″] vim /etc/postfix/esmtp_access

# NDS requests werden nur aus dem eignen Netz erlaubt
192.168.10.0/24 silent-discard
0.0.0.0/0 silent-discard, dsn
::/0 silent-discard, dsn[/code]

Abschließend starten wir den MX einmal durch.

[code language=”shell” gutter=”0″] service postfix restart[/code]

Bei Änderungen an der Datei ist lediglich ein service postfix reload notwendig.