chkpnt.mailserver

Ansible-Rolle für einen All-In-One-Mailserver basierend auf openSUSE Leap 15.5

GitHub Workflow Status Ansible Rolle

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

Über das Projekt

Ansible role for an all-in-one mail server based on openSUSE Leap 15.5

Installieren
ansible-galaxy install chkpnt.mailserver
GitHub Repository
Lizenz
apache-2.0
Downloads
82
Besitzer