mailserver
Ansible роль для всего-в-одном почтового сервера на базе openSUSE Leap 15.5
Цель данной роли Ansible - удовлетворить мои требования к собственному почтовому серверу:
- Поддержка openSUSE Leap 15.5
- Оркестрация Postfix (MTA), Dovecot (MDA) и Rspamd
- Postfix использует Dovecot для аутентификации (SMTP AUTH через Dovecot SASL)
- Нет баз данных для конфигурации, только обычные файлы
- Письма на определенные адреса могут быть пересланы на другой MTA
- Письма на определенные адреса могут быть отклонены
- Исходящие письма подписаны DKIM
- Пересланные письма подписаны ARC
- Можно настроить универсальные аккаунты
- Поддерживается несколько доменов
- Можно использовать правила Sieve
- Спам
- Спам с высоким счетом отклоняется
- Обнаружение спама можно отключить для определенных отправителей (адресов или доменов)
- Потенциальный спам не автоматически помещается в папку спама (можно использовать пользовательское правило Sieve)
- Потенциальный спам попадает в серый список
- Спам можно обучить, переместив письмо в специальную папку IMAP
- Спам можно обучить, установив флаг Junk, используемый Thunderbird
- Legit письма можно обучить, переместив письмо в специальную папку IMAP
- Legit письма можно обучить, установив флаг NonJunk, используемый Thunderbird
- Legit письма можно обучить, отметив письмо зеленым флагом в приложении Mail на iOS
- Антивирус
- Интеграция с ClamAV
- Интеграция с Fangfrisch
- Интеграция с VirusTotal.com
- Инфицированные письма отклоняются
- Хорошие отчеты (Interfase WebUI rspamd меня устраивает)
- Почти все требования покрыты тестами
- Тесты выполняются системой CI
Использование и конфигурация
Эта роль доступна через Ansible Galaxy под именем chkpnt.mailserver
. Установить ее можно с помощью команды
$ ansible-galaxy install chkpnt.mailserver
и использовать в плейбуке следующим образом:
---
- 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
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' }
mail_accounts:
- { user: '[email protected]', password: '{BLF-CRYPT}$2y$10$6W9VYuRklwLg8y2UoP6YHuK5Q8g7g.LOJdSa7K4CgoVMmARNYMVMK' }
- { user: '[email protected]', password: '{BLF-CRYPT}$2y$10$wZtIn5uHAsbsMgMmOdBdU.qbRgrQxfeej65G63aUxMaDNEHfb8P2e' }
mail_mailboxes:
- { name: '[email protected]', path: '/srv/mail/john' }
- { name: '[email protected]', path: '/srv/mail/jane' }
mail_aliases:
- { for: '[email protected]', destination: '[email protected]' }
- { for: '[email protected]', destination: '[email protected]' }
- for: '[email protected]'
destination:
- '[email protected]'
- '[email protected]'
- { 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 Это адрес не должен получать письма!'
mail_transports:
- for: '[email protected]'
nexthop: 'smtp:gmail.com'
mail_spam:
greylisting_delay: 5min
thresholds:
greylist: 4
add_header: 6
reject: 15
controller:
password: '$2$c75qgo1b8brudgq7wokg8wxr5qiby84p$ye6ss3ymc4h4u4swk3fhx3ph7jesahqrzw8kkxwhyfb14g4rkfhb'
bind_socket: 'localhost:11334'
allowlist_domain:
- foobar.test
allowlist_email:
- /.*@important.test/
По умолчанию переменные определены в defaults/main.yml. Все переменные, относящиеся к example.com
и подобным, должны быть явно указаны в вашем плейбуке.
Плейбук tests/testfixtures/vms/sut.yml, используемый для тестов, также является хорошим примером.
Разработка
Рекомендую настроить Python-окружение с использованием pipenv. На macOS pipenv можно установить с помощью Homebrew:
$ brew install pipenv
Для использования Python-окружения с pipenv, просто введите следующие команды:
$ pipenv install --dev
$ pipenv shell
Для запуска тестов требуются VirtualBox и Vagrant. На macOS эти зависимости также можно установить с помощью Homebrew:
$ brew install --cask virtualbox
$ brew install --cask vagrant
Для управления вашими виртуальными машинами Vagrant я рекомендую использовать Vagrant-Manager, небольшое приложение для системного трея.
$ brew install --cask vagrant-manager
Дополнительную информацию о тестах можно найти в соответствующем документе.
Лицензия
Apache-2.0
Ansible role for an all-in-one mail server based on openSUSE Leap 15.5
ansible-galaxy install chkpnt/chkpnt-mailserver