mailserver

Ansible роль для всего-в-одном почтового сервера на базе openSUSE Leap 15.5

Статус рабочего процесса GitHub Роль Ansible

Цель данной роли 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
Лицензия
apache-2.0
Загрузки
64
Владелец