chkpnt.mailserver
Rol de Ansible para un servidor de correo todo en uno basado en openSUSE Leap 15.5
El propósito de este rol de Ansible es satisfacer mis necesidades en mi propio servidor de correo:
- Soporta openSUSE Leap 15.5
- Orquestación de Postfix (MTA), Dovecot (MDA) y Rspamd
- Postfix usa Dovecot para autenticación (SMTP AUTH a través de Dovecot SASL)
- Sin bases de datos para la configuración, solo archivos simples
- Los correos a direcciones específicas pueden ser reenviados a otro MTA
- Los correos a direcciones específicas pueden ser rechazados
- Los correos salientes están firmados con DKIM
- Los correos reenviados están firmados con ARC
- Se pueden configurar cuentas Catch-all
- Se soportan múltiples dominios
- Se pueden usar reglas Sieve
- Spam
- El spam con un alto puntaje es rechazado
- La detección de spam se puede desactivar para remitentes específicos (direcciones o dominios)
- El spam potencial no se entrega automáticamente en una carpeta de spam (por supuesto, se puede usar una regla Sieve personalizada)
- El spam potencial está en lista gris
- Se puede aprender spam moviendo el correo a una carpeta IMAP especial
- Se puede aprender spam aplicando la etiqueta Junk, que se usa en Thunderbird
- Se puede aprender ham moviendo el correo a una carpeta IMAP especial
- Se puede aprender ham aplicando la etiqueta NonJunk, que se usa en Thunderbird
- Se puede aprender ham marcando el correo con una etiqueta verde en la aplicación de correo de iOS
- Antivirus
- Integración de ClamAV
- Integración de Fangfrisch
- Integración de VirusTotal.com
- Los correos infectados son rechazados
- Informes bonitos (la interfaz web de rspamd es suficiente para mí)
- Casi todos los requisitos están cubiertos por pruebas
- Las pruebas son ejecutadas por un sistema de CI
Uso y configuración
Este rol está disponible en Ansible Galaxy bajo el nombre chkpnt.mailserver
. Se puede instalar con
$ ansible-galaxy install chkpnt.mailserver
y utilizar dentro de un playbook así:
---
- 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' }
mail_accounts:
- { user: '[email protected]', password: '{BLF-CRYPT}$2y$10$6W9VYuRklwLg8y2UoP6YHuK5Q8g7g.LOJdSa7K4CgoVMmARNYMVMK' } # Contraseña: changeme
- { user: '[email protected]', password: '{BLF-CRYPT}$2y$10$wZtIn5uHAsbsMgMmOdBdU.qbRgrQxfeej65G63aUxMaDNEHfb8P2e' } # Contraseña: 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 Esta dirección no debe recibir correos!'
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' # Contraseña: changeme
bind_socket: 'localhost:11334'
allowlist_domain:
- foobar.test
allowlist_email:
- /.*@important.test/
Los valores predeterminados de las variables están definidos en defaults/main.yml. Se espera que todas las variables que se refieren a example.com
o similares se declaren explícitamente en tu playbook.
El playbook tests/testfixtures/vms/sut.yml usado por las pruebas es un buen ejemplo también.
Desarrollo
Recomiendo configurar un entorno de Python usando pipenv. En macOS, pipenv se puede instalar usando Homebrew:
$ brew install pipenv
Para usar el entorno de Python con pipenv, simplemente ingresa los siguientes comandos:
$ pipenv install --dev
$ pipenv shell
Para ejecutar las pruebas, se requieren VirtualBox y Vagrant. En macOS, estas dependencias también se pueden instalar usando Homebrew:
$ brew install --cask virtualbox
$ brew install --cask vagrant
Para gestionar tus máquinas virtuales de Vagrant, recomiendo usar Vagrant-Manager, una pequeña aplicación utilitaria para la barra de menú.
$ brew install --cask vagrant-manager
Información adicional sobre las pruebas se puede encontrar en el documento correspondiente document.
Licencia
Apache-2.0
Ansible role for an all-in-one mail server based on openSUSE Leap 15.5
ansible-galaxy install chkpnt.mailserver