Proxmox Mail Gateway mit rspamd

Hmm, jetzt habe ich wegen der Datenschutzgrundverordnung meinen Blogbereich abgeschaltet (nein, nicht nur deswegen, will ja nicht zu den skurillen Folgen gehören, die meiner Meinung nach teilweise deutlich überzogen sind, aber ich habe schon lange nicht mehr gebloggt, einen Artikel primär für mich, einen anderen, der schon ziemlich alt und teilweise überholt ist, ich komme einfach nicht dazu und bin nicht so der Blogger, dazu muss ich dann auch nicht ständig Plugins wie Subscribe to Double-Opt-In Comments, Sharriff Wrapper oder WP GDPR Comliance mitlaufen lassen und ständig updaten und spare mir die Absätze in der Datenschutzerklärung) und nun poste ich doch etwas. Vielleicht werde ich in Zukunft auch hier und da mal ein paar Guides posten, denn es gibt doch immer wieder mal Dinge, mit denen ich mich recht lange beschäftige, die andere auch interessieren könnten und ich daher der Öffentlichkeit nicht vorenthalten will. So könnte ich über mein inzwischen perfektes WiFi-Setup berichten, meine Erfahrungen mit Raspberry Pi, dem vernetzten Haus, meinen kurzen Ausflug mit einem Intel NUC und ESXi auf demselben (bis leider mein NUC den Geist aufgegeben hat) sowie mein optimiertes Plesk-Setup, mal schauen, ob es Interessenten gibt, die darüber mehr erfahren möchten. Über den Blödsinn mancher der oben angesprochenen skurillen Folgen und bspw. wie man sein Blog doch recht simpel datenschutzkonform bekommt, wird hingegen in unserem Firmenblog berichtet werden, da gibt es Kollegen, die sich darum perfekt kümmern und mehr Muse zum Schreiben haben. Bei Fragen oder Anregungen mir bitte eine Nachricht senden, ich belasse bis auf weiteres die Kommentarfunktion hier erst mal aus den oben genannten Gründen deaktiviert.

Nun zum eigentlichen Inhalt. Ich habe primär für die Firma nach einer neuen Antispamlösung gesucht, aber auch privat hat es mich ein wenig genervt, dass ich in meiner lokalen Mailkopie (da das E-Mail-Archiv meines Hosted Exchange-Anbieters früher immer mal gemuckt hat und inzwischen zwar stabil läuft, die Suche aber stellenweise bescheiden ist) immer auch mal wieder Spam drunter habe. Eigentlich unkritisch, denn nach dem bisher annehmenden Mailserver, einem Postfix auf meinem zunächst auf Intel NUC und nun in der Cloud betriebenen Plesk-Server und der lokalen Mailkopie gehen die Mails durch zwei Antispamdienste, danach bleibt in meinem Hosted Exchange-Postfach kaum noch Spam übrig. Also eigentlich ein Luxusproblem. Zunächst testete ich neben den eh schon aktiven Blacklists in meiner Plesk-Installation die Aktivierung von SPF, DKIM und DMARC als Filter sowie nachdem das kaum etwas brachte auch den mitgelieferten SpamAssassin, jedoch mit mäßigem Erfolg. Mit zunehmender minimaler Optimierung des SpamAssassin-Setups durch weitere taggende Blacklists (mehr Energie wollte ich da nicht reinstecken) erhöhten sich auch die False-Positives, so dass ich von dieser Lösung absah. Ich hatte auch die Befürchtung, dass das angeblich in Plesk eingebaute Autolearn von Nachrichten, die man in den Spamordner schiebt oder aus selbigem heraus, nicht wirklich funktionierte, denn es gab keine Bayes-getaggten Nachrichten, zudem hatte ich auch nicht vor, stets die Mails der Mailkopie auszusortieren und geschäftlich war das für meine Zwecke eh untauglich. Also ging ich noch mal auf die Suche nach einem Antispamdienst für privat mit geringen monatlichen Kosten, weil wie bekannt Luxusproblem, aber so ganz zufrieden war ich mit dem Angebot nicht. Bei der weiteren Recherche liefen mir diverse Lösungen über den Weg, die allesamt auf dem damals im Rahmen der ESVA eingesetztem MailScanner basierten, jedoch fehlten mir hier weiterhin die angenehmen Konfigurationsmöglichkeiten wie auch der Überblick über Mails, die bereits vor dem Eintritt in den Contentscanner geblockt oder abgewiesen wurden. Einzig Scrollout F1 und vielleicht noch Baruwa wirkten umfassend, sprachen mich aber technisch wie optisch nicht wirklich an.

Letztendlich entdeckte ich dann das Proxmox Mail Gateway, eine wirklich sehr gut integrierte Lösung mit einer schönen (wenn auch mobil nicht nutzbaren) GUI, vielen direkt über diese möglichen Einstellungen und einem wirklich brauchbaren Setup out of the Box, dessen Erkennung ich mit ein paar Anpassungen noch optimieren konnte, mal mit mehr, hauptsächlich mit weniger False-Positives und False-Negatives. Über die Zeit des Tests für privat und dann auch für geschäftlich stellten sich aber ein paar Unzulänglichkeiten heraus: Eindeutiger Spam mit hohem Spamscore kann nicht rechtskonform abgewiesen werden, da SpamAssassin als Contentfilter realisiert wurde und nicht via Milter und damit nicht mehr mit Postfix in der SMTP-Verbindung kommunizieren kann sondern erst danach sein Ergebnis ausspuckt, DKIM einzubinden erfordert zusätzlichen Aufwand, Lösungen wie Amazon Simple Email Service oder Mailchimp liefern Mails mit Absendern ein, die zur Bounce-Erkennung dienen, aber den tatsächlichen Absender derart verschleiern, dass man ihn in die Bewertung, ob legitime Mails abgewiesen oder getagged wurden oder nicht, über die verfügbaren GUI-Werkzeuge nicht einfließen lassen kann, das Betreff, was ebenfalls Ausschlag geben könnte, fehlt ebenfalls, selbst wenn man Rejects verzögert, auch wird nur noch alternativ Avast unterstützt, welches sich nicht gerade der besten Presse rühmt, so dass nahe lag, mal den Blick auf einen alternativen Contentscanner zu legen, ohne das Gesamtsystem dabei wegzuwerfen.

Gesagt getan hat sich rspamd in letzter Zeit sehr viel gute Presse verschafft und ist im Gegensatz zu Bogofilter oder OrangeAssassin kein reines Place-in für SpamAssassin sondern ein komplett neuer Ansatz aus Russland kommend, wo auch nginx, lftpd und andere großartige Software herkommt. Die Anleitung wie folgt beschreibt mein Setup, welches zunächst aus einer Optimierung von Proxmox Mail Gateway besteht (wie bereits für meine ersten Tests vollzogen) und sich dann dem Setup von rspamd auf derselben Umgebung sowie der Integration beider Lösungen widmet. Die Integration war erforderlich, da ansonsten die Zahlen in den Statistiken nicht stimmten und auch das Tracking Center weniger brauchbar wurde, einziger Nachteil der Integration war, dass sie den Backport von Postfix 3.3 auf Debian 9 erforderte, da durch den weiterhin aktiven Contentfilter Mails zwei mal Postfix passierten und damit auch rspamd zweifach scannte, was in wenigen Fällen zu dem Problem führte, dass Mails im zweiten Anlauf einen höheren Spamscore bekamen und damit abgewiesen wurden, wodurch diese mitten im Workflow hängen blieben und zu Nicht-Zustellbar-Berichten führten, die man ja tunlichst vermeiden sollte, Stichwort Backscatter.

Zunächst folgt meine bash-Historie mit allen Befehlen wie eingegeben, anschließend die jeweiligen Dateiinhalte soweit diese angepasst oder erstellt wurden. Individuelle Informationen wie meine Domains oder Lizenznummern sind hierbei mit xxx überschrieben. Ich habe mich bei meinem rspamd-Setup an dem Quick Start Guide in Verbindung mit der Anleitung von Thomas Leister orientiert, die vorherigen Optimierungen von SpamAssassin erfolgten nach den Anleitungen von Syn-Flut.de und schaal @it. Im Gegensatz zu meinem ursprünglichen Setup habe ich mich für unbound an Stelle von bind entschieden und gemäß der Anleitung von rspamd die dcc.tar.Z an Stelle der dcc-dccproc.tar.Z heruntergeladen, wobei ein diff -bur beider Verzeichnisse mir meine Vermutung bestätigt hat: die Inhalte der Archive waren deckungsgleich.

Wie beschrieben habe ich mich für einen Parallelbetrieb von rspamd sowie SpamAssassin entschieden, da das Proxmox Mail Gateway Informationen wie auch Zahlen für die Statistik und Darstellung im Tracking Center offensichtlich nicht rein vom Postfix sondern auch von der eigenen Implementierung des SpamAssassin bezieht, so dass beispielsweise von Postfix abgewiesene Mails in der Statistik auftauchten, von rspamd analysierte angenommene Mails aber wiederum nicht mehr, auch die Statusangaben im Tracking Center veränderten sich. Aufgrund meiner Entscheidung habe ich das Antivirus-Modul von rspamd deaktiviert, ein doppelter Virenscan mit genau dem gleichen Virenscanner macht ja keinen Sinn und im Gegensatz zu den paar Sekunden Versatz durch zwei Contentscanner ist dieser beim Antivirus schon deutlicher spürbar. Ich hätte mich auch für einen anderen zusätzlichen Virenscanner in rspamd entscheiden können, jedoch sind alle sonst angebotenen kostenpflichtig, für meine private Lösung und meinen privaten Test daher nicht notwendig, im kommerziellen Einsatz wäre Sophos oder Avira als zusätzlicher Scanner denkbar. Auf Grund des beschriebenen doppelten Aufrufs von rspamd vor und nach dem jeweiligen SpamAssassin-Aufruf seitens der Postfix-Konfiguration musste ich den zweiten Aufruf unterbinden, indem ich mittels smtpd_milter_maps den Aufruf für lokale Adressen deaktivierte. Leider ist dies erst mit Postfix 3.2 möglich, Proxmox Mail Gateway kommt aber mit Debian 9, welches nur den Postfix 3.1.8 enthält, daher war ich gezwungen, einen Backport zu erstellen, zum Glück lieferte das Debian Wiki hierfür eine Anleitung. Ich habe die Backport-Mailingliste über meinen Backport informiert, möglicherweise wird dieser zukünftig auch offiziell zur Verfügung stehen.

bash_history:
vi /etc/apt/sources.list.d/pmg-enterprise.list
apt-get update
apt-get upgrade
apt-get dist-upgrade
apt-get install gcc
apt-get install make
apt-get install unzip
apt-get install vim
vi /etc/profile
vi /etc/pmg/pmg-api.pem
vi /etc/pmg/pmg-tls.pem
reboot
mkdir .ssh
vi .ssh/authorized_keys
apt-get install ufw
ufw enable
ufw default deny incoming
ufw default allow outgoing
ufw allow ssh
ufw allow smtp
ufw allow 8006
ufw status verbose
apt-get install unbound
vi /etc/systemd/timesyncd.conf
systemctl restart systemd-timesyncd
mkdir -p /etc/pmg/templates
cp /var/lib/pmg/templates/* /etc/pmg/templates/.
cd /etc/pmg/templates
vi main.cf.in
vi /etc/postfix/header_checks
apt-get install pyzor
cd /tmp
wget http://www.dcc-servers.net/dcc/source/dcc.tar.Z
tar xzvf dcc.tar.Z
cd dcc-*
./configure
make
make install
vi /lib/systemd/system/dcc.service
vi /var/dcc/dcc_conf
systemctl enable dcc
systemctl start dcc
apt-get install re2c
cd /etc/cron.hourly && wget sa.schaal-it.net/sa-update && chown root.root sa-update && chmod 755 sa-update
vi sa-update
cd /tmp
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
wget http://geolite.maxmind.com/download/geoip/database/GeoIPv6.dat.gz
gunzip GeoIP.dat.gz
gunzip GeoIPv6.dat.gz
mkdir /usr/share/GeoIP
mv GeoIP.dat /usr/share/GeoIP/
mv GeoIPv6.dat /usr/share/GeoIP/
vi /etc/pmg/templates/init.pre.in
vi /etc/mail/spamassassin/custom.cf
pmgconfig sync --restart 1
spamassassin -D --lint
echo "test" | spamassassin -D pyzor 2>&1 | less
/etc/cron.hourly/sa-update
systemctl restart pmg-smtp-filter
wget https://github.com/extremeshok/clamav-unofficial-sigs/archive/master.zip
unzip master.zip
cp clamav-unofficial-sigs-master/clamav-unofficial-sigs.sh /usr/local/sbin/
chmod 755 /usr/local/sbin/clamav-unofficial-sigs.sh
mkdir /etc/clamav-unofficial-sigs
cp clamav-unofficial-sigs-master/config/* /etc/clamav-unofficial-sigs/
mkdir /var/log/clamav-unofficial-sigs
cd /etc/clamav-unofficial-sigs
cat /etc/*release*
mv os.debian9.conf os.conf
vi user.conf
/usr/local/sbin/clamav-unofficial-sigs.sh --install-cron
/usr/local/sbin/clamav-unofficial-sigs.sh --install-logrotate
/usr/local/sbin/clamav-unofficial-sigs.sh --install-man
/usr/local/sbin/clamav-unofficial-sigs.sh
cp /tmp/clamav-unofficial-sigs-master/systemd/* /etc/systemd/
clamscan --debug 2>&1 /dev/null | grep "loaded"
apt-get install redis-server
apt-get install lsb-release
wget -O- https://rspamd.com/apt-stable/gpg.key | apt-key add -
echo "deb http://rspamd.com/apt-stable/ $(lsb_release -c -s) main" > /etc/apt/sources.list.d/rspamd.list
echo "deb-src http://rspamd.com/apt-stable/ $(lsb_release -c -s) main" >> /etc/apt/sources.list.d/rspamd.list
apt-get update
apt-get install rspamd
rspamadm configwizard
vi /etc/rspamd/local.d/worker-proxy.inc
vi /etc/rspamd/local.d/milter_headers.conf
vi /etc/rspamd/local.d/rbl.conf
vi /etc/rspamd/local.d/rbl_group.conf
vi /etc/rspamd/local.d/dcc.conf
vi /etc/rspamd/local.d/antivirus.conf
apt-get install nginx
vi /etc/nginx/sites-available/xxx
ln -s /etc/nginx/sites-available/xxx /etc/nginx/sites-enabled/xxx
nginx -t
systemctl restart nginx
systemctl restart rspamd
ufw allow 8007
apt-get install packaging-dev debian-keyring devscripts equivs
rmadison postfix --architecture amd64
dget -x http://http.debian.net/debian/pool/main/p/postfix/postfix_3.3.0-1.dsc
cd postfix-3.3.0
mk-build-deps --install --remove
dch --local ~bpo9+ --distribution stretch-backports "Rebuild for stretch-backports."
fakeroot debian/rules binary
dpkg-buildpackage -us -uc
sudo dpkg -i ../postfix_3.3.0-1~bpo9+1_amd64.deb
vi /etc/pmg/templates/main.cf.in
vi /etc/postfix/smtpd_milter_map
pmgconfig sync --restart 1

/etc/apt/sources.list.d/pmg-enterprise.list:
deb http://download.proxmox.com/debian/pmg stretch pmg-no-subscription

/etc/profile:
# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).

if [ "`id -u`" -eq 0 ]; then
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
else
PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
fi
export PATH

HISTSIZE=1000
if [ "$HISTCONTROL" = "ignorespace" ] ; then
export HISTCONTROL=ignoreboth
else
export HISTCONTROL=ignoredups
fi
export HISTSIZE HISTCONTROL

alias "ls=ls -al"
alias "rm=rm --preserve-root"
alias "cd..=cd .."
alias "dir=ls -al"

if [ "${PS1-}" ]; then
if [ "${BASH-}" ] && [ "$BASH" != "/bin/sh" ]; then
# The file bash.bashrc already sets the default PS1.
# PS1='\h:\w\$ '
if [ -f /etc/bash.bashrc ]; then
. /etc/bash.bashrc
fi
else
if [ "`id -u`" -eq 0 ]; then
PS1='# '
else
PS1='$ '
fi
fi
fi

if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r $i ]; then
. $i
fi
done
unset i
fi

/etc/systemd/timesyncd.conf:
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
#
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# Defaults can be restored by simply deleting this file.
#
# See timesyncd.conf(5) for details.

[Time]
NTP=de.pool.ntp.org

/etc/postfix/header_checks:
/^subject:/ INFO

/lib/systemd/system/dcc.service:
[Unit]
Description=DCC (Distributed Checksum Clearinghouses) interface daemon
After=remote-fs.target systemd-journald-dev-log.socket

[Service]
Type=forking
PermissionsStartOnly=true
RuntimeDirectory=dcc
ExecStart=/var/dcc/libexec/dccifd
User=root
Group=root
Nice=1

#DCC writes pid file with "-" at the beginning which confuses systemd
#PIDFile=/run/dcc/dccifd.pid

[Install]
WantedBy=multi-user.target

/var/dcc/dcc_conf:
#! /bin/sh

# set parameters for DCC start, stop, and cron scripts

# This file is parsed by /bin/sh, and so parameters must be appropriately quoted
# Start your own comment lines with something other than "#" such as "##"
# so that they will be preserved when installing a new version.

# from Rhyolite Software DCC 1.3.163-1.88 $Revision$
DCC_CONF_VERSION=4

# don't set DCC_HOMEDIR since if we got here, it must be set
DCC_LIBEXEC=/var/dcc/libexec
DCC_RUNDIR=/var/run/dcc

# DCC user name
DCCUID=root

DCCD_ENABLE=off
# DCC server-IDs must be globally unique.
SRVR_ID=
# BRAND can be any short alphanumeric string that suggests the identity
# of the server.
BRAND=
# args used to start dccd
DCCD_ARGS=

# GREY_CLIENT_ARGS contains "on", "-GnoIP", etc. to turn on greylisting
# in the dccm and dccifd DCC clients.
# Also turns on the local greylist dccd server unless GREY_ENABLE=off
GREY_CLIENT_ARGS=
# GREY_ENABLE turns local greylist server 'on' or 'off',
# but does not effect dccm, dccifd
GREY_ENABLE=

# GREY_SRVR_ID DCC server-IDs must be globally unique, but greylisting dccd
# servers are usually isolated. If you have more than one greylist server,
# ensure that they use distinct server-IDs and that they flood each other
# with entries in /var/dcc/flod
GREY_SRVR_ID=$SRVR_ID
# Start dccd for grey listing or set server options such as -Gweak-IP.
# See also GREY_ENABLE.
GREY_DCCD_ARGS=

# dccm and dccifd client reputation parameters such as -tREP,20
REP_ARGS=-tREP,20

# DNS blacklist -B parameters for dccifd and dccm
# For example, this checks SMTP client IP addresses for any value Spamhaus'
# ZEN. It also looks for for values between 127.0.0.0 and 127.0.0.8 for SMTP
# envelope sender mail_host or mail_host domain names, URLs in mail message
# bodies, MX servers, DNS (NS) servers.
# It then checks URLs in the message body in Spamhaus' DBL.
# It also whitelists with the "0 = none" values of dnswl.org.
# DNSBL_ARGS="'-Bset:rej-msg=5.7.1 550 %ID %BTYPE https://www.spamhaus.org/query/bl?ip=%BTGT' \
# -Bzen.spamhaus.org,127.0.0.0-127.0.0.8 \
# -Bset:no-mail_host -Bset:no-URL -Bset:no-NS -Bzen.spamhaus.org \
# -Bset:URL -Bset:no-client -Bdbl.spamhaus.org,127.0.1.1-127.0.1.59,name \
# -Bset:white -Bset:client -Bset:no-URL -Bset:no-mail_host \
# -Bset:no-NS -Bset:no-MX '-Blist.dnswl.org,127.0.0.3&255.255.0.255'"
DNSBL_ARGS=

DCCM_ENABLE=off
#
# used to start dccm
# a common value is
# DCCM_ARGS="-SHELO -Smail_host -SSender -SList-ID"
# Note the use of single quotes in
# DCCM_ARGS="-SHELO '-r5.7.1 550 mail %s from %s rejected with DCC'"
# Put greylist parameters in GREY_CLIENT_ARGS but not in DCCM_ARGS.
DCCM_ARGS="-SHELO -Smail_host -SSender -SList-ID"
# The log directories should be cleaned with the /var/dcc/libexec/cron-dccd
# nightly cron job. DCCM_LOGDIR can start with D? H? or M? as in
# DCCM_LOGDIR='D?log' See -l in the man page.
# Set DCCM_LOGDIR to the empty or null string to disable logging.
DCCM_LOGDIR="D?log"
DCCM_WHITECLNT=whiteclnt
DCCM_USERDIRS=userdirs
# set DCCM_LOG_AT to a number that determines "bulk mail" for your situation.
# 50 is a typical value.
# Leave DCCM_REJECT_AT blank until you are confident that most sources of
# solicited bulk mail have been whitelisted. Then set it to the number
# that defines "bulk mail" for your site. This rejection or "bulk" threshold
# does not affect the blacklisting of the DCCM_WHITECLNT whitelist file.
# Add '-aIGNORE' to DCCM_ARGS to ignore the bulkiness of mail except to
# add X-DCC headers.
DCCM_LOG_AT=NEVER
DCCM_REJECT_AT=MANY
# override basic list of DCC server checksums controlling rejections or logging
DCCM_CKSUMS=
# additional DCC server checksums worthy of rejections or logging
DCCM_XTRA_CKSUMS=

DCCIFD_ENABLE=on
#
# used to start dccifd
# a common value is
# DCCIFD_ARGS="-SHELO -Smail_host -SSender -SList-ID"
DCCIFD_ARGS="-SHELO -Smail_host -SSender -SList-ID"
DCCIFD_LOGDIR="$DCCM_LOGDIR"
DCCIFD_WHITECLNT="$DCCM_WHITECLNT"
# When both dccm and dccifd are used it may be necessary to set
# DCCIFD_USERDIRS="$DCCM_USERDIRS/local"
DCCIFD_USERDIRS="$DCCM_USERDIRS"
DCCIFD_LOG_AT="$DCCM_LOG_AT"
DCCIFD_REJECT_AT="$DCCM_REJECT_AT"
# override basic list of checksums controlling rejections or logging
DCCIFD_CKSUMS="$DCCM_CKSUMS"
# additional DCC server checksums worthy of rejections or logging
DCCIFD_XTRA_CKSUMS="$DCCM_XTRA_CKSUMS"

# days to keep files in DCC log directories
DBCLEAN_LOGDAYS=14
# used to start dbclean, including -H, -u, -e, and -E
DBCLEAN_ARGS=

# optionally set to something like "local5" or "local5.notice" for
# dccd, dbclean, dccifd, and dccm. The defaults are equivalent to
# DCC_INFO_LOG_FACILITY=MAIL.NOTICE and DCC_ERROR_LOG_FACILITY=MAIL.ERR
DCC_INFO_LOG_FACILITY=
DCC_ERROR_LOG_FACILITY=

# ensure that the log facilities include levels and that $DCC_LOGGER
# has a default.
if test -n "$DCC_INFO_LOG_FACILITY"; then
if expr "X$DCC_INFO_LOG_FACILITY" : 'X.*\..*' >/dev/null; then
:
else
DCC_INFO_LOG_FACILITY="$DCC_INFO_LOG_FACILITY.notice"
fi
DCC_LOG_ARGS="$DCC_LOG_ARGS -Linfo,$DCC_INFO_LOG_FACILITY"
fi
if test -z "$DCC_ERROR_LOG_FACILITY"; then
# for $DCC_LOGGER
DCC_ERROR_LOG_FACILITY=mail.err
else
if expr "X$DCC_ERROR_LOG_FACILITY" : 'X.*\..*' >/dev/null; then
:
else
DCC_ERROR_LOG_FACILITY="$DCC_ERROR_LOG_FACILITY.err"
fi
DCC_LOG_ARGS="$DCC_LOG_ARGS -Lerror,$DCC_ERROR_LOG_FACILITY"
fi
DCC_LOGGER="logger -s -p ${DCC_ERROR_LOG_FACILITY-mail.err} -t ${LOGGER_TAG-DCC}"

# capture ./configure values for make-dcc_conf
Configure_DCC_LIBEXEC=/var/dcc/libexec
Configure_DCC_RUNDIR=/var/run/dcc
Configure_DCCUID=root
Configure_DCC_LOGGER="logger -s -p ${DCC_ERROR_LOG_FACILITY-mail.err} -t ${LOGGER_TAG-DCC}"

/etc/cron.hourly/sa-update:
#!/bin/sh

# schaal @it
#
# Simple script to update SpamAssassin

SYSLOG_TAG=sa-update

compile=0

logger -d -t $SYSLOG_TAG "Start SA-Update"

sa-update --nogpg
retval="$?"
if [ $retval -eq 0 ]; then compile=1; fi

sa-update --nogpg --channel updates.spamassassin.org
retval="$?"
if [ $retval -eq 0 ]; then compile=1; fi

sa-update --nogpg --channel sa.zmi.at
retval="$?"
if [ $retval -eq 0 ]; then compile=1; fi

sa-update --nogpg --channel sa.schaal-it.net
retval="$?"
if [ $retval -eq 0 ]; then compile=1; fi

sa-update --nogpg --channel sought.rules.yerp.org
retval="$?"
if [ $retval -eq 0 ]; then compile=1; fi

sa-update --nogpg --channel spamassassin.heinlein-support.de
retval="$?"
if [ $retval -eq 0 ]; then compile=1; fi

if [ $compile -eq 1 ]; then
logger -d -t $SYSLOG_TAG "SA-Update found"
sa-compile --quiet 2>/dev/null
systemctl restart pmg-smtp-filter.service
else
logger -d -t $SYSLOG_TAG "No SA-Update found"
fi

/etc/pmg/templates/init.pre.in:
# This is the right place to customize your installation of SpamAssassin.
#
# See 'perldoc Mail::SpamAssassin::Conf' for details of what can be
# tweaked.
#
# This file contains plugin activation commands for plugins included
# in SpamAssassin 3.0.x releases. It will not be installed if you
# already have a file in place called "init.pre".
#
###########################################################################

# RelayCountry - add metadata for Bayes learning, marking the countries
# a message was relayed through
#
# loadplugin Mail::SpamAssassin::Plugin::RelayCountry

[% IF pmg.spam.rbl_checks %]
loadplugin Mail::SpamAssassin::Plugin::URIDNSBL
[% END %]

# Hashcash - perform hashcash verification.
#
loadplugin Mail::SpamAssassin::Plugin::Hashcash

[% IF pmg.spam.rbl_checks %]
loadplugin Mail::SpamAssassin::Plugin::SPF
[% END %]

# always load dkim to improve accuracy
loadplugin Mail::SpamAssassin::Plugin::DKIM

loadplugin Mail::SpamAssassin::Plugin::Pyzor
use_pyzor 1

loadplugin Mail::SpamAssassin::Plugin::DCC
dcc_path /usr/local/bin/dccproc
dcc_home /var/dcc
dcc_dccifd_path /var/dcc/dccifd
dcc_body_max 999999
dcc_fuz1_max 999999
dcc_fuz2_max 999999
use_dcc 1
dcc_timeout 10

loadplugin Mail::SpamAssassin::Plugin::RelayCountry

/etc/mail/spamassassin/custom.cf:
ifplugin Mail::SpamAssassin::Plugin::RelayCountry
add_header all Relay-Country _RELAYCOUNTRY_
header RELAYCOUNTRY_BAD X-Relay-Countries =~ /(CN|RU|UA|RO|VN)/
describe RELAYCOUNTRY_BAD Relayed through spammy country at some point
score RELAYCOUNTRY_BAD 2.0
header RELAYCOUNTRY_GOOD X-Relay-Countries =~ /^(DE|AT|CH)/
describe RELAYCOUNTRY_GOOD First untrusted GW is DE, AT or CH
score RELAYCOUNTRY_GOOD -0.5
endif # Mail::SpamAssassin::Plugin::RelayCountry

header RCVD_IN_BRBL eval:check_rbl('brbl-lastexternal', 'b.barracudacentral.org.', '127.0.0.2')
describe RCVD_IN_BRBL Received via a relay in Barracuda RBL
tflags RCVD_IN_BRBL net
score RCVD_IN_BRBL 1.4

header RCVD_IN_NIX_SPAM eval:check_rbl('nix-spam-lastexternal', 'ix.dnsbl.manitu.net.')
describe RCVD_IN_NIX_SPAM Listed in NiX Spam DNSBL (heise.de)
tflags RCVD_IN_NIX_SPAM net
score RCVD_IN_NIX_SPAM 1.4

header RCVD_IN_WPBL eval:check_rbl('wpbl-lastexternal', 'db.wpbl.info.', '127.0.0.2')
describe RCVD_IN_WPBL Listed in WPBL
tflags RCVD_IN_WPBL net
score RCVD_IN_WPBL 1.4

/etc/clamav-unofficial-sigs/user.conf:
# This file contains user configuration settings for clamav-unofficial-sigs.sh
###################
# This is property of eXtremeSHOK.com
# You are free to use, modify and distribute, however you may not remove this notice.
# Copyright (c) Adrian Jon Kriel :: admin@extremeshok.com
# License: BSD (Berkeley Software Distribution)
##################
#
# Script updates can be found at: https://github.com/extremeshok/clamav-unofficial-sigs
#
##################
#
# NOT COMPATIBLE WITH VERSION 3.XX / 4.XX CONFIG
#
################################################################################
# SEE MASTER.CONF FOR CONFIG EXPLAINATIONS
################################################################################

# Values in this file will always override those in the master.conf and os.conf files.
# This is useful to specify your authorisation/receipt codes and to always force certain options.
# Please note, it is your responsibility to manage the contents of this file.
# Values provided here are just examples, feel free to use any values from the main config file.

malwarepatrol_receipt_code="xxx"
malwarepatrol_product_code="32"
malwarepatrol_list="clamav_basic" # clamav_basic or clamav_ext
malwarepatrol_free="no"

securiteinfo_authorisation_signature="xxx"

# Default dbs rating
# valid rating: LOW, MEDIUM, HIGH
#default_dbs_rating="MEDIUM"

# Per Database
# These ratings will override the global rating for the specific database
# valid rating: LOW, MEDIUM, HIGH, DISABLE
#sanesecurity_dbs_rating=""
#securiteinfo_dbs_rating=""
#linuxmalwaredetect_dbs_rating=""
#yararulesproject_dbs_rating=""

# =========================
# Additional signature databases
# =========================
#declare -a additional_dbs=(
# ftp://ftp.example.net/pub/sigs.ndb
# http://www.example.org/sigs.ldb
#) #END ADDITIONAL DATABASES

# Uncomment the following line to enable the script
user_configuration_complete="yes"

# https://eXtremeSHOK.com ######################################################

Bis hierher ist es das gleiche Setup wie bei der Optimierung des Proxmox Mail Gateway, lediglich die mail.cf.in folgt nach, da diese im Rahmen von rspamd noch mal angepasst wurde. Es folgt die finale Version, wobei lediglich die letzten Zeilen (alles Milter-bezogene) hinzugefügt wurden, möchte man die Änderungen nachvollziehen.

/etc/rspamd/local.d/worker-proxy.inc:
milter = yes; # Enable milter mode
timeout = 120s; # Needed for Milter usually
upstream "local" {
default = yes; # Self-scan upstreams are always default
self_scan = yes; # Enable self-scan
}
count = 4; # Spawn more processes in self-scan mode
max_retries = 5; # How many times master is queried in case of failure
discard_on_reject = false; # Discard message instead of rejection
quarantine_on_reject = false; # Tell MTA to quarantine rejected messages
spam_header = "X-Spam"; # Use the specific spam header
reject_message = "Spam message rejected"; # Use custom rejection message

/etc/rspamd/local.d/milter_headers.conf:
use = ["x-spam-status"];

/etc/rspamd/local.d/rbl.conf:
rbls {
brbl {
symbol = "RBL_BRBL";
rbl = "b.barracudacentral.org";
}

nixspam {
symbol = "RBL_NIXSPAM";
rbl = "ix.dnsbl.manitu.net";
}

wpbl {
symbol = "RBL_WPBL";
rbl = "db.wpbl.info";
}
}

/etc/rspamd/local.d/rbl_group.conf:
symbols = {
"RBL_BRBL" {
weight = 1.0;
description = "From address is listed in Barracuda RBL";
}

"RBL_NIXSPAM" {
weight = 1.0;
description = "From address is listed in NiX Spam DNSBL (heise.de)";
}

"RBL_WPBL" {
weight = 1.0;
description = "From address is listed in WPBL";
}
}

/etc/rspamd/local.d/dcc.conf:
host = "/var/dcc/dccifd";

/etc/rspamd/local.d/antivirus.conf:
enabled = false;

/etc/nginx/sites-available/xxx:
server {
listen 8007 ssl;
listen [::]:8007 ssl;

ssl_certificate /etc/pmg/pmg-api.pem;
ssl_certificate_key /etc/pmg/pmg-api.pem;

server_name xxx;

root /var/www/default;

location / {
proxy_pass http://localhost:11334/;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

/etc/pmg/templates/main.cf.in:
# auto-generated by proxmox

compatibility_level = 2
command_directory = /usr/sbin
daemon_directory = /usr/lib/postfix/sbin
data_directory = /var/lib/postfix

# appending .domain is the MUA's job.
append_dot_mydomain = yes

smtpd_banner = $myhostname [% pmg.mail.banner %]
biff = no

[% IF pmg.mail.dwarning %]
delay_warning_time = [% pmg.mail.dwarning %]h
[% END %]

best_mx_transport = local
message_size_limit = [% pmg.mail.maxsize %]
mailbox_size_limit = [% ((pmg.mail.maxsize*2 > 51200000) ? pmg.mail.maxsize*2 : 51200000) %]

mydomain = [% dns.domain %]
myhostname = [% dns.hostname %].[% dns.domain %]

parent_domain_matches_subdomains = debug_peer_list,fast_flush_domains,mynetworks,permit_mx_backup_networks,qmqpd_authorized_clients,smtpd_access_maps

alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydestination = localhost, $myhostname
mynetworks = [% postfix.mynetworks %]

relay_domains = hash:/etc/pmg/domains

transport_maps = hash:/etc/pmg/transport

[% IF pmg.mail.relay %]
[% IF pmg.mail.relaynomx %]
relay_transport = smtp:[[% pmg.mail.relay %]]:[% pmg.mail.relayport %]
[% ELSE %]
relay_transport = smtp:[% pmg.mail.relay %]:[% pmg.mail.relayport %]
[% END %]
[% END %]

[% IF pmg.mail.smarthost %]
default_transport = smtp:[% pmg.mail.smarthost %]
[% END %]

content_filter=scan:127.0.0.1:10024

mail_name = Proxmox

[% IF pmg.mail.helotests %]
smtpd_helo_required = yes
smtpd_helo_restrictions = permit_mynetworks reject_non_fqdn_helo_hostname reject_invalid_helo_hostname reject_rhsbl_helo dbl.spamhaus.org
[% ELSE %]
smtpd_helo_restrictions =
[% END %]

postscreen_access_list =
permit_mynetworks,
cidr:/etc/postfix/postscreen_access

postscreen_dnsbl_threshold = 2

[% IF postfix.dnsbl_sites %]
postscreen_dnsbl_sites = [% postfix.dnsbl_sites %]
[% END %]

postscreen_dnsbl_action = enforce
postscreen_greet_action = enforce

smtpd_sender_restrictions =
permit_mynetworks
reject_non_fqdn_sender
check_client_access cidr:/etc/postfix/clientaccess
check_sender_access regexp:/etc/postfix/senderaccess
check_recipient_access regexp:/etc/postfix/rcptaccess
[%- IF pmg.mail.rejectunknown %] reject_unknown_client_hostname[% END %]
[%- IF pmg.mail.rejectunknownsender %] reject_unknown_sender_domain[% END %]
reject_rhsbl_client dbl.spamhaus.org
reject_rhsbl_sender dbl.spamhaus.org

smtpd_recipient_restrictions =
permit_mynetworks
reject_unauth_destination
reject_non_fqdn_recipient
check_recipient_access regexp:/etc/postfix/rcptaccess
[%- IF postfix.usepolicy %] check_sender_access regexp:/etc/postfix/senderaccess[% END %]
[%- IF postfix.usepolicy %] check_client_access cidr:/etc/postfix/clientaccess[% END %]
[%- IF postfix.usepolicy %] check_policy_service inet:127.0.0.1:10022[% END %]
[%- IF pmg.mail.verifyreceivers %] reject_unknown_recipient_domain[% END %]
[%- IF pmg.mail.verifyreceivers %] reject_unverified_recipient[% END %]

smtpd_data_restrictions = reject_unauth_pipelining

[% IF pmg.mail.rejectunknownsender %]
unknown_address_reject_code = 550
[% ELSE %]
[% IF pmg.mail.verifyreceivers %]
unknown_address_reject_code = 550
[% END %]
[% END %]

[% IF pmg.mail.rejectunknown %]
unknown_client_reject_code = 550
[% END %]

[% IF pmg.mail.verifyreceivers %]
unverified_recipient_reject_code = [% pmg.mail.verifyreceivers %]
[% END %]

smtpd_client_connection_count_limit = [% pmg.mail.conn_count_limit %]
smtpd_client_connection_rate_limit = [% pmg.mail.conn_rate_limit %]
smtpd_client_message_rate_limit = [% pmg.mail.message_rate_limit %]

[% IF pmg.mail.tls %]
smtp_tls_security_level = may
smtp_tls_policy_maps = hash:/etc/pmg/tls_policy
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
smtpd_tls_security_level = may
smtpd_tls_cert_file = /etc/pmg/pmg-tls.pem
smtpd_tls_key_file = $smtpd_tls_cert_file
[% IF pmg.mail.tlslog %]
smtpd_tls_loglevel = 1
smtp_tls_loglevel = 1
[% END %]
[% IF pmg.mail.tlsheader %]
smtpd_tls_received_header = yes
[% END %]
[% END %]

header_checks = regexp:/etc/postfix/header_checks

smtp_tls_session_cache_database = btree:/var/lib/postfix/smtp_tls_session_cache
smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_tls_session_cache

default_destination_concurrency_limit = 40
lmtp_destination_concurrency_limit = 20
relay_destination_concurrency_limit = 20
smtp_destination_concurrency_limit = 20
virtual_destination_concurrency_limit = 20

recipient_delimiter = +

#smtpd_milters = unix:/var/lib/rspamd/milter.sock
# or for TCP socket
smtpd_milters = inet:localhost:11332

# skip mail without checks if something goes wrong
milter_default_action = accept

# 6 is the default milter protocol version;
# prior to Postfix 2.6 the default protocol was 2.
milter_protocol = 6

smtpd_milter_maps = cidr:/etc/postfix/smtpd_milter_map

/etc/postfix/smtpd_milter_map:
# Disable Milters for local clients.
127.0.0.0/8 DISABLE
::/64 DISABLE

Desweiteren wurde der Plesk-Server so eingestellt, nur noch Mails vom Proxmox Mail Gateway entgegenzunehmen, um direkt einliefernde Spammer, die den MX einfach ignorieren, auszusperren.

Es folgen noch die Konfigurationen des eigentlichen Proxmox Mail Gateway, soweit dies der Export und Dump zuließ, es fehlt die Network-Whitelist von 194.25.134.0/24, da die Telekom es immer wieder schafft, auf prominente und ansonsten vertrauenswürdige Blacklists zu kommen sowie mein OpenVPN- und Backup-Setup für privat, dieses findet sich in meinem ursprünglichen Feature Request-Thread im Proxmox Forum.

pmgconfig dump:
composed.wl_bounce_relays = xxx
dns.domain = xxx
dns.hostname = xxx
ipconfig.int_ip = xxx
pmg.admin.advfilter = 0
pmg.admin.avast = 0
pmg.admin.clamav = 1
pmg.admin.dailyreport = 1
pmg.admin.demo = 0
pmg.admin.email = xxx
pmg.admin.http_proxy =
pmg.admin.statlifetime = 7
pmg.clamav.archiveblockencrypted = 0
pmg.clamav.archivemaxfiles = 1000
pmg.clamav.archivemaxrec = 5
pmg.clamav.archivemaxsize = 25000000
pmg.clamav.dbmirror = database.clamav.net
pmg.clamav.maxcccount = 0
pmg.clamav.maxscansize = 100000000
pmg.clamav.safebrowsing = 1
pmg.mail.banner = ESMTP Proxmox
pmg.mail.conn_count_limit = 50
pmg.mail.conn_rate_limit = 0
pmg.mail.dnsbl_sites = zen.spamhaus.org*2,bl.spamcop.net*2,psbl.surriel.com*2,spamrbl.imp.ch*2,noptr.spamrats.com*2,escalations.dnsbl.sorbs.net*2,ix.dnsbl.manitu.net,b.barracudacentral.org,db.wpbl.info
pmg.mail.dwarning = 4
pmg.mail.ext_port = 25
pmg.mail.greylist = 0
pmg.mail.helotests = 1
pmg.mail.hide_received = 0
pmg.mail.int_port = 26
pmg.mail.max_filters = 14
pmg.mail.max_policy = 5
pmg.mail.max_smtpd_in = 96
pmg.mail.max_smtpd_out = 96
pmg.mail.maxsize = 104857600
pmg.mail.message_rate_limit = 0
pmg.mail.rejectunknown = 1
pmg.mail.rejectunknownsender = 1
pmg.mail.relay = xxx
pmg.mail.relaynomx = 0
pmg.mail.relayport = 25
pmg.mail.smarthost =
pmg.mail.spf = 1
pmg.mail.tls = 1
pmg.mail.tlsheader = 1
pmg.mail.tlslog = 1
pmg.mail.verifyreceivers = 550
pmg.spam.bounce_score = 0
pmg.spam.clamav_heuristic_score = 3
pmg.spam.languages = all
pmg.spam.maxspamsize = 262144
pmg.spam.rbl_checks = 1
pmg.spam.use_awl = 1
pmg.spam.use_bayes = 1
pmg.spam.use_razor = 1
pmg.spam.wl_bounce_relays =
pmg.spamquar.allowhrefs = 1
pmg.spamquar.authmode = ticket
pmg.spamquar.hostname =
pmg.spamquar.lifetime = 7
pmg.spamquar.mailfrom =
pmg.spamquar.port = 8006
pmg.spamquar.protocol = https
pmg.spamquar.reportstyle = verbose
pmg.spamquar.viewimages = 1
pmg.virusquar.allowhrefs = 1
pmg.virusquar.lifetime = 7
pmg.virusquar.viewimages = 1
postfix.dnsbl_sites = zen.spamhaus.org*2,bl.spamcop.net*2,psbl.surriel.com*2,spamrbl.imp.ch*2,noptr.spamrats.com*2,escalations.dnsbl.sorbs.net*2,ix.dnsbl.manitu.net,b.barracudacentral.org,db.wpbl.info
postfix.int_ip = xxx
postfix.mynetworks = 127.0.0.0/8 [::1]/128 xxx
postfix.transportnets =
postfix.usepolicy = 1

pmgdb dump
Found RULE 4: Blacklist
FOUND FROM GROUP 2: Blacklist
OBJECT 1: nomail@fromthisdomain.com
FOUND ACTION GROUP 18: Block
OBJECT 31: block message
Found RULE 3: Virus Alert
FOUND WHAT GROUP 9: Virus
OBJECT 22: active
FOUND ACTION GROUP 18: Block
OBJECT 31: block message
FOUND ACTION GROUP 20: Notify Admin
OBJECT 33: notify __ADMIN__
FOUND ACTION GROUP 21: Notify Sender
OBJECT 34: notify __SENDER__
Found RULE 2: Remove Viruses
FOUND WHAT GROUP 9: Virus
OBJECT 22: active
FOUND ACTION GROUP 15: Remove attachments
OBJECT 28: remove matching attachments
FOUND ACTION GROUP 20: Notify Admin
OBJECT 33: notify __ADMIN__
FOUND ACTION GROUP 23: Modify Virus Subject
OBJECT 37: modify field: subject:VIRUS: __SUBJECT__
Found RULE 1: Remove Dangerous Files
FOUND WHAT GROUP 8: Dangerous Content
OBJECT 16: content-type=application/javascript
OBJECT 17: content-type=application/x-executable
OBJECT 15: content-type=application/x-java
OBJECT 14: content-type=application/x-ms-dos-executable
OBJECT 18: content-type=application/x-ms-dos-executable
OBJECT 19: content-type=message/partial
OBJECT 20: filename=.*\.(vbs|pif|lnk|shs|shb)
OBJECT 21: filename=.*\.\{.+\}
FOUND ACTION GROUP 15: Remove attachments
OBJECT 28: remove matching attachments
FOUND ACTION GROUP 20: Notify Admin
OBJECT 33: notify __ADMIN__
FOUND ACTION GROUP 24: Modify Dangerous Subject
OBJECT 38: modify field: subject:DANGEROUS: __SUBJECT__
Found RULE 5: Modify Header
FOUND ACTION GROUP 13: Modify Spam Level
OBJECT 26: modify field: X-SPAM-LEVEL:__SPAM_INFO__
Found RULE 12: Block Multimedia Files
FOUND WHAT GROUP 6: Multimedia
OBJECT 5: content-type=audio/.*
OBJECT 6: content-type=video/.*
FOUND ACTION GROUP 15: Remove attachments
OBJECT 28: remove matching attachments
Found RULE 6: Whitelist
FOUND FROM GROUP 3: Whitelist
OBJECT 2: mail@fromthisdomain.com
FOUND ACTION GROUP 17: Accept
OBJECT 30: accept message
Found RULE 9: Block Spam (Level 10)
FOUND WHAT GROUP 12: Spam (Level 10)
OBJECT 25: Level 10
FOUND ACTION GROUP 18: Block
OBJECT 31: block message
Found RULE 8: Quarantine/Mark Spam (Level 5)
FOUND WHAT GROUP 11: Spam (Level 5)
OBJECT 24: Level 5
FOUND ACTION GROUP 14: Modify Spam Subject
OBJECT 27: modify field: subject:SPAM: __SUBJECT__
FOUND ACTION GROUP 19: Quarantine
OBJECT 32: Move to quarantine.
Found RULE 7: Mark Spam (Level 6)
FOUND WHAT GROUP 10: Spam (Level 6)
OBJECT 23: Level 6
FOUND ACTION GROUP 14: Modify Spam Subject
OBJECT 27: modify field: subject:SPAM: __SUBJECT__
Found RULE 10: Block outgoing Spam
FOUND WHAT GROUP 10: Spam (Level 6)
OBJECT 23: Level 6
FOUND ACTION GROUP 18: Block
OBJECT 31: block message
FOUND ACTION GROUP 20: Notify Admin
OBJECT 33: notify __ADMIN__
FOUND ACTION GROUP 21: Notify Sender
OBJECT 34: notify __SENDER__
Found RULE 11: Add Disclaimer
FOUND ACTION GROUP 22: Disclaimer
OBJECT 35: disclaimer

Für die kommerzielle Installation werde ich auf alle Fälle eine Subskription holen, für die private Installation würde ich mich über eine Spendenfunktion oder Ähnliches freuen, eine Subskription wäre da einfach nicht notwendig, aber ich gebe gerne etwas zurück.

Sollte irgendwas fehlen, bitte um Nachricht.

Update: Meine stetig gepflegter Thread zur reinen Proxmox Mail Gateway-Optimierung habe ich verschoben, zudem hat sich das Debian Backport-Team gemeldet, mein Backport ist nun ein inoffizieller Backport, der unter https://www.heutger.net/backports/ zu finden ist und im Debian Wiki Erwähnung findet.

Zu rspamd bin ich von den Ergebnissen jetzt erst mal nicht so begeistert, wie beworben, ich habe daher jetzt nur noch ein paar kleinere Anpassungen vorgenommen und werde das Projekt zunächst weiter beobachten und gegebenenfalls später noch einmal aufgreifen. Nach einem Telefonat mit den großen Open-Source-Antispam-Experten wäre es durchaus möglich, die rspamd-Ergebnisse in SpamAssassin zum Scoring mit heranzuziehen und wird es sicher in Zukunft noch weitere interessante Optionen geben, aber derzeit ist rspamd erst mal nichts für mich und ich konzentriere mich auf die Optimierung des “nativen” Proxmox Mail Gateway.

Meine letzten Änderungen umfassen ein Anpassen der Scores von rspamd, da die Standardwerte für mich nicht so gut passten, eine Erweiterung der Historie, da diese für mich im kommerziellen Test eindeutig zu kurz war sowie ein Löschen der dynamischen Konfiguration der Scores, wie sie von der WebUI geschrieben werden, da ich diese ausschließlich statisch per Konfigurationsdatei pflegen möchte und nicht dynamisch über die WebUI. Die Scores habe ich dabei so angepasst, dass ein Reject zunächst erst einmal ausbleibt (um einen sinnvollen Score hierfür zu ermitteln), damit das funktioniert, habe ich den Score auf sehr hoch gesetzt (dem Standardwert einfach ein paar Nullen spendiert), der Spam-Header sollte zudem beim gleichen Score wie der Spam-Subject-Prefix eingefügt werden, da rspamd dies nicht vorsieht, habe ich den Wert vom Header sehr nah zum Subject-Prefix gesetzt, er muss aber stets kleiner sein. Es folgen die erfolgten Schritte und die jeweiligen Einstellungen.

bash_history:
vi /etc/rspamd/local.d/actions.conf
vi /etc/rspamd/local.d/history_redis.conf
rm /var/lib/rspamd/rspamd_dynamic
systemctl restart rspamd

/etc/rspamd/local.d/actions.conf:
reject = 1500; # Reject when reaching this score
rewrite_subject = 9; # Rewrite subject when reaching this score
add_header = 8.999; # Add header when reaching this score
greylist = 8; # Apply greylisting when reaching this score (will emit `soft reject action`)

/etc/rspamd/local.d/history_redis.conf:
nrows = 8000;