chkpnt.mailserver

基于 openSUSE Leap 15.5 的全功能邮件服务器 Ansible 角色

GitHub 工作流状态 Ansible 角色

这个 Ansible 角色的目的是满足我对自己的邮件服务器的需求:

  • 支持 openSUSE Leap 15.5
  • 协调 Postfix(邮件传输代理)、Dovecot(邮件投递代理)和 Rspamd
  • Postfix 使用 Dovecot 进行身份验证(通过 Dovecot SASL 的 SMTP 身份验证)
  • 配置不使用数据库,仅使用纯文件
  • 特定地址的邮件可以转发到另一个 MTA
  • 特定地址的邮件可以被拒绝
  • 外发邮件支持 DKIM 签名
  • 转发的邮件支持 ARC 签名
  • 可以配置通用账户
  • 支持多个域
  • 可以使用 Sieve 规则
  • 垃圾邮件
    • 高分垃圾邮件会被拒绝
    • 可以为特定发送者(地址或域)禁用垃圾邮件检测
    • 潜在的垃圾邮件不会自动送入垃圾邮件文件夹(当然可以使用自定义 Sieve 规则)
    • 潜在垃圾邮件会被灰名单处理
    • 垃圾邮件可以通过将邮件移动到特定 IMAP 文件夹来学习
    • 垃圾邮件可以通过标记垃圾邮件标志学习,该标志用于 Thunderbird
    • 正常邮件可以通过将邮件移动到特定 IMAP 文件夹来学习
    • 正常邮件可以通过应用非垃圾邮件标志来学习,该标志用于 Thunderbird
    • 正常邮件可以通过在 iOS 邮件应用中标记绿色旗帜来学习
  • 防病毒
    • 集成 ClamAV
    • 集成 Fangfrisch
    • 集成 VirusTotal.com
    • 感染邮件会被拒绝
  • 提供友好的报告(rspamd WebUI 对我来说足够)
  • 几乎所有的要求都有测试覆盖
  • 测试由 CI 系统执行

使用与配置

这个角色可以通过 Ansible Galaxy 获得,名称为 chkpnt.mailserver。可以通过以下命令安装:

$ ansible-galaxy install chkpnt.mailserver

并在 playbook 中像这样使用:

---
- 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' }
      # 使用 doveadm 可以计算哈希。
      # 我推荐使用 Blowfish 作为哈希方案,理想的轮数依赖于你的系统。
      # > doveadm pw -s BLF-CRYPT -r 10
      mail_accounts:
        - { user: '[email protected]', password: '{BLF-CRYPT}$2y$10$6W9VYuRklwLg8y2UoP6YHuK5Q8g7g.LOJdSa7K4CgoVMmARNYMVMK' } # 密码:changeme
        - { user: '[email protected]', password: '{BLF-CRYPT}$2y$10$wZtIn5uHAsbsMgMmOdBdU.qbRgrQxfeej65G63aUxMaDNEHfb8P2e' } # 密码:changeme
      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' # 密码:changeme
          bind_socket: 'localhost:11334' 
        allowlist_domain:
          - foobar.test
        allowlist_email:
          - /.*@important.test/

变量的默认值在 defaults/main.yml 中定义。所有引用 example.com 或相似的变量都需在你的 playbook 中显式声明。

用于测试的 playbook tests/testfixtures/vms/sut.yml 也是一个很好的示例。

开发

我推荐使用 pipenv 设置 Python 环境。在 macOS 上,可以通过 Homebrew 安装 pipenv

$ brew install pipenv

要使用 pipenv 的 Python 环境,只需输入以下命令:

$ 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.mailserver
许可证
apache-2.0
下载
82
拥有者