chkpnt.mailserver
Ansible-Rolle für einen All-In-One-Mailserver basierend auf openSUSE Leap 15.5
Das Ziel dieser Ansible-Rolle ist es, meine Anforderungen an meinen eigenen Mailserver zu erfüllen:
- Unterstützt openSUSE Leap 15.5
- Orchestrierung von Postfix (MTA), Dovecot (MDA) und Rspamd
- Postfix verwendet Dovecot zur Authentifizierung (SMTP AUTH über Dovecot SASL)
- Keine Datenbanken für die Konfiguration, nur einfache Dateien
- Mails an bestimmte Adressen können an einen anderen MTA weitergeleitet werden
- Mails an bestimmte Adressen können abgelehnt werden
- Ausgehende Mails sind DKIM-signiert
- Weitergeleitete Mails sind ARC-signiert
- Catch-All-Konten können konfiguriert werden
- Mehrere Domains werden unterstützt
- Sieve-Regeln können verwendet werden
- Spam
- Spam mit hohem Score wird abgelehnt
- Spam-Erkennung kann für bestimmte Absender (Adressen oder Domains) deaktiviert werden
- Potenzieller Spam wird nicht automatisch in einen Spam-Ordner zugestellt (natürlich kann eine benutzerdefinierte Sieve-Regel verwendet werden)
- Potenzieller Spam wird grau gelistet
- Spam kann gelernt werden, indem die Mail in einen speziellen IMAP-Ordner verschoben wird
- Spam kann gelernt werden, indem das Junk-Flag angewendet wird, das von Thunderbird verwendet wird
- Ham kann gelernt werden, indem die Mail in einen speziellen IMAP-Ordner verschoben wird
- Ham kann gelernt werden, indem das NonJunk-Flag angewendet wird, das von Thunderbird verwendet wird
- Ham kann gelernt werden, indem die Mail in der iOS Mail App mit einer grünen Fahne markiert wird
- Antivirus
- Integration von ClamAV
- Integration von Fangfrisch
- Integration von VirusTotal.com
- Infizierte Mails werden abgelehnt
- Schöne Berichte (die rspamd WebUI reicht mir aus)
- Fast alle Anforderungen sind durch Tests abgedeckt
- Tests werden von einem CI-System ausgeführt
Verwendung und Konfiguration
Diese Rolle ist über Ansible Galaxy unter dem Namen chkpnt.mailserver
verfügbar. Sie kann installiert werden mit
$ ansible-galaxy install chkpnt.mailserver
und innerhalb eines Playbooks wie folgt verwendet werden
---
- hosts: server1
remote_user: root
roles:
- role: chkpnt.mailserver
vars:
mail_domain: example.com
mail_hostname: server1.example.com
mail_mailname: server1.example.com
mail_mailbox_domains:
- example.com
- example.net
- example.org
mail_ssl:
certificate: '/etc/ssl/servercerts/example.com.crt.pem'
private_key: '/etc/ssl/private/example.com.privkey.pem'
generate_certificate_for_test: yes
generate_safe_primes_for_dh: yes # https://www.openssl.org/news/secadv/20160128.txt
mail_dkim_keys:
- { domain: example.com, selector: 'key1', private_key: '/var/lib/rspamd/dkim/example.com.key1.key' }
- { domain: example.org, selector: 'key1', private_key: '/var/lib/rspamd/dkim/example.org.key1.key' }
- { domain: example.net, selector: 'key1', private_key: '/var/lib/rspamd/dkim/example.net.key1.key' }
# Hash kann mit doveadm berechnet werden.
# Ich empfehle, Blowfish als Hash-Schema zu verwenden, die ideale Anzahl der Runden hängt von Ihrem System ab.
# > doveadm pw -s BLF-CRYPT -r 10
mail_accounts:
- { user: '[email protected]', password: '{BLF-CRYPT}$2y$10$6W9VYuRklwLg8y2UoP6YHuK5Q8g7g.LOJdSa7K4CgoVMmARNYMVMK' } # Passwort: changeme
- { user: '[email protected]', password: '{BLF-CRYPT}$2y$10$wZtIn5uHAsbsMgMmOdBdU.qbRgrQxfeej65G63aUxMaDNEHfb8P2e' } # Passwort: changeme
mail_mailboxes:
- { name: '[email protected]', path: '/srv/mail/john' }
- { name: '[email protected]', path: '/srv/mail/jane' }
mail_aliases:
# ein selbstreferenzierender Alias wird benötigt, wenn mail_transports verwendet wird
- { for: '[email protected]', destination: '[email protected]' }
# normale Aliase
- { for: '[email protected]', destination: '[email protected]' }
- for: '[email protected]'
destination:
- '[email protected]'
- '[email protected]'
# Catch-Alls:
- { for: '@example.com', destination: '[email protected]' }
- { for: '@example.org', destination: '[email protected]' }
- { for: '@example.net', destination: '[email protected]' }
mail_recipient_restrictions:
- for: '[email protected]'
action: 'REJECT Diese Adresse soll keine Mails erhalten!'
mail_transports:
- for: '[email protected]'
nexthop: 'smtp:gmail.com'
mail_spam:
greylisting_delay: 5min
thresholds: # Anforderung: greylist < add_header < reject
greylist: 4
add_header: 6
reject: 15
controller:
# Der Controller-Worker wird verwendet, um rspamd-Statistiken zu verwalten, rspamd zu lernen und die WebUI bereitzustellen.
# https://rspamd.com/doc/workers/controller.html
# Wenn Sie auf die WebUI von localhost zugreifen, werden Sie nicht nach dem Passwort gefragt, da localhost eine "secure_ip" ist
# > rspamadm pw
password: '$2$c75qgo1b8brudgq7wokg8wxr5qiby84p$ye6ss3ymc4h4u4swk3fhx3ph7jesahqrzw8kkxwhyfb14g4rkfhb' # Passwort: changeme
bind_socket: 'localhost:11334'
# Regexps werden unterstützt
allowlist_domain:
- foobar.test
allowlist_email:
- /.*@important.test/
Die Standardwerte der Variablen sind in defaults/main.yml definiert. Alle Variablen, die auf example.com
oder ähnliches verweisen, müssen ausdrücklich in Ihrem Playbook deklariert werden.
Das Playbook tests/testfixtures/vms/sut.yml, das von den Tests verwendet wird, ist ebenfalls ein gutes Beispiel.
Entwicklung
Ich empfehle, eine Python-Umgebung mit pipenv einzurichten. Auf macOS kann pipenv mit Homebrew installiert werden:
$ brew install pipenv
Um die Python-Umgebung mit pipenv zu nutzen, geben Sie einfach die folgenden Befehle ein:
$ pipenv install --dev
$ pipenv shell
Um die Tests auszuführen, sind VirtualBox und Vagrant erforderlich. Auch diese Abhängigkeiten können auf macOS mit Homebrew installiert werden:
$ brew install --cask virtualbox
$ brew install --cask vagrant
Für die Verwaltung Ihrer Vagrant-VMs empfehle ich die Verwendung von Vagrant-Manager, einer kleinen Dienstprogrammanwendung für die Menüleiste.
$ brew install --cask vagrant-manager
Zusätzliche Informationen zu den Tests finden Sie im entsprechenden Dokument.
Lizenz
Apache-2.0
Ansible role for an all-in-one mail server based on openSUSE Leap 15.5
ansible-galaxy install chkpnt.mailserver