chkpnt.mailserver
Rola Ansible dla serwera pocztowego typu "wszystko w jednym" opartego na openSUSE Leap 15.5
Celem tej roli Ansible jest spełnienie moich wymagań dotyczących własnego serwera pocztowego:
- Obsługuje openSUSE Leap 15.5
- Orkiestracja Postfix (MTA), Dovecot (MDA) i Rspamd
- Postfix używa Dovecot do autoryzacji (SMTP AUTH przez Dovecot SASL)
- Brak baz danych dla konfiguracji, tylko zwykłe pliki
- Wiadomości do określonych adresów mogą być przekazywane do innego MTA
- Wiadomości do określonych adresów mogą być odrzucane
- Wiadomości wychodzące są podpisywane DKIM
- Przekazywane wiadomości są podpisywane ARC
- Można konfigurować konta catch-all
- Obsługiwane są wiele domen
- Można stosować reguły Sieve
- Spam
- Spam o wysokim wyniku jest odrzucany
- Wykrywanie spamu można wyłączyć dla określonych nadawców (adresów lub domen)
- Potencjalny spam nie jest automatycznie dostarczany do folderu Spam (oczywiście można użyć niestandardowej reguły Sieve)
- Potencjalny spam jest poddawany szarej liście
- Spam można nauczyć, przenosząc wiadomość do specjalnego folderu IMAP
- Spam można nauczyć, stosując flagę Junk, która jest używana przez Thunderbirda
- "Ham" można nauczyć, przenosząc wiadomość do specjalnego folderu IMAP
- "Ham" można nauczyć, stosując flagę NonJunk, która jest używana przez Thunderbirda
- "Ham" można nauczyć, oznaczając wiadomość zieloną flagą w aplikacji Mail na iOS
- Antivirus
- Integracja ClamAV
- Integracja Fangfrisch
- Integracja VirusTotal.com
- Zainfekowane wiadomości są odrzucane
- Ładne raporty (dla mnie wystarczy WebUI rspamd)
- Pra prawie wszystkie wymagania są pokryte testami
- Testy są wykonywane przez system CI
Użycie i konfiguracja
Ta rola jest dostępna w Ansible Galaxy pod nazwą chkpnt.mailserver
. Można ją zainstalować za pomocą
$ ansible-galaxy install chkpnt.mailserver
i użyć w playbooku jak
---
- 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 można obliczyć za pomocą doveadm.
# Zalecam użycie Blowfish jako schematu haszowania, idealna liczba rund zależy od systemu.
# > doveadm pw -s BLF-CRYPT -r 10
mail_accounts:
- { user: '[email protected]', password: '{BLF-CRYPT}$2y$10$6W9VYuRklwLg8y2UoP6YHuK5Q8g7g.LOJdSa7K4CgoVMmARNYMVMK' } # Hasło: changeme
- { user: '[email protected]', password: '{BLF-CRYPT}$2y$10$wZtIn5uHAsbsMgMmOdBdU.qbRgrQxfeej65G63aUxMaDNEHfb8P2e' } # Hasło: changeme
mail_mailboxes:
- { name: '[email protected]', path: '/srv/mail/john' }
- { name: '[email protected]', path: '/srv/mail/jane' }
mail_aliases:
# samoreferencyjny alias jest potrzebny, jeśli używany jest mail_transports
- { for: '[email protected]', destination: '[email protected]' }
# normalne aliasy
- { 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 Ten adres nie powinien otrzymywać wiadomości!'
mail_transports:
- for: '[email protected]'
nexthop: 'smtp:gmail.com'
mail_spam:
greylisting_delay: 5min
thresholds: # Wymaganie: szara lista < dodaj_nagłówek < odrzuc
greylist: 4
add_header: 6
reject: 15
controller:
# Pracownik kontrolera jest używany do zarządzania statystykami rspamd, aby nauczyć rspamd i służyć WebUI.
# https://rspamd.com/doc/workers/controller.html
# Jeśli uzyskujesz dostęp do WebUI z localhosta, nie zostaniesz poproszony o hasło, ponieważ localhost jest "secure_ip"
# > rspamadm pw
password: '$2$c75qgo1b8brudgq7wokg8wxr5qiby84p$ye6ss3ymc4h4u4swk3fhx3ph7jesahqrzw8kkxwhyfb14g4rkfhb' # Hasło: changeme
bind_socket: 'localhost:11334'
# Obsługiwane są wyrażenia regularne
allowlist_domain:
- foobar.test
allowlist_email:
- /.*@important.test/
Domyślne wartości zmiennych są zdefiniowane w defaults/main.yml. Wszystkie zmienne odnoszące się do example.com
lub podobnych powinny być jawnie zadeklarowane w Twoim playbooku.
Playbook tests/testfixtures/vms/sut.yml, używany przez testy, jest również dobrym przykładem.
Rozwój
Zalecam skonfigurowanie środowiska Python za pomocą pipenv. Na macOS pipenv można zainstalować za pomocą Homebrew:
$ brew install pipenv
Aby używać środowiska Python z pipenv, wystarczy wprowadzić następujące komendy:
$ pipenv install --dev
$ pipenv shell
Aby uruchomić testy, wymagana jest VirtualBox i Vagrant. Na macOS te zależności można zainstalować za pomocą Homebrew:
$ brew install --cask virtualbox
$ brew install --cask vagrant
W celu zarządzania maszynami wirtualnymi Vagrant polecam użycie Vagrant-Manager, małej aplikacji pomocniczej na pasek menu.
$ brew install --cask vagrant-manager
Dodatkowe informacje o testach można znaleźć w odpowiednim dokumencie.
Licencja
Apache-2.0
Ansible role for an all-in-one mail server based on openSUSE Leap 15.5
ansible-galaxy install chkpnt.mailserver