diff --git a/postfix/defaults/main.yml b/postfix/defaults/main.yml new file mode 100644 index 0000000000000000000000000000000000000000..9c10031cb3a9dd27db3c2f3664e0c15522d6a804 --- /dev/null +++ b/postfix/defaults/main.yml @@ -0,0 +1,27 @@ +--- + +postfix_domains: + - "{{ domain }}" +postfix_virtual_domains: [] + +postfix_tls_cert: /etc/ssl/private/fullchain.pem +postfix_tls_key: /etc/ssl/private/privkey.pem +postfix_tls_ciphers: "{{ tls_ciphers }}" +postfix_tls_protocols: "!SSLv2 !SSLv3" + +postfix_login_suffix: '@extmind.de' +postfix_prefer_lmtp: no +postfix_enable_memcached: no +postfix_login_suffix: '' +postfix_dnsbl_sites: + - name: zen.spamhaus.org + - name: bl.spamcop.net + - name: b.barracudacentral.org + - name: '#swl.spamhaus.org' + modifier: 2 + - name: list.dnswl.org + modifier: -5 +postfix_network_access: + - cidr: 134.130.5.32/27 # rwth + action: permit +postfix_content_filter: no # or: spamassassin diff --git a/postfix/files/login_maps.pcre b/postfix/files/login_maps.pcre deleted file mode 100644 index 96399fc12c05fadc7e0f42b73eb946dedcf635ad..0000000000000000000000000000000000000000 --- a/postfix/files/login_maps.pcre +++ /dev/null @@ -1 +0,0 @@ -/^(.*)$/ ${1} diff --git a/postfix/files/postscreen_whitelist b/postfix/files/postscreen_whitelist deleted file mode 100644 index 887c952d74ae36452737bd4e1986745d42f85dce..0000000000000000000000000000000000000000 --- a/postfix/files/postscreen_whitelist +++ /dev/null @@ -1,16 +0,0 @@ -# Django : 2014-10-29 -# access-Tabelle: Wer wird von postscreen ausgenommen und wer nicht? -# Tabelle zum black- und whitelisten einzelner Hosts auf Basis ihrer -# IP-Adressen. In der rechten Tabellenspalte können die AKtionen -# "permit", "reject" und "dunno" gesetzt werden. -# Nach dem Ändern und/oder Erweitern der Tabelle, muß ein -# laufender Postfix über die Änderungen mit einem reload informiert -# werden: -# $ systemctl reload postfix.service -# -# Es muss hier keine Datenbank mit postmap erzeugt werden, da -# Postfix die ASCII-Konfigurationsdatei direkt auswertet! -# - -# roughly the RWTH network for the e-mail servers -134.130.5.32/27 permit diff --git a/postfix/files/sender_login_map.hash b/postfix/files/sender_login_map.hash deleted file mode 100644 index e80951f06c9cb87a223b2fdba0ca2f6335c84b25..0000000000000000000000000000000000000000 --- a/postfix/files/sender_login_map.hash +++ /dev/null @@ -1 +0,0 @@ -test@wolfscloud.de test@wolfscloud.de diff --git a/postfix/tasks/main.yml b/postfix/tasks/main.yml index 9400d43ffc410f0e60a90b232dfe7c37ebccc9ab..17df26b99598b309e9de2eb57ca465192740f44c 100644 --- a/postfix/tasks/main.yml +++ b/postfix/tasks/main.yml @@ -1,34 +1,35 @@ --- - name: ensure all required postfix packages are installed - apt: name={{ item }} state=present + apt: + name: "{{ item }}" + state: present with_items: - postfix - postfix-pcre - postfix-cdb - - memcached tags: - postfix - mail -- name: ensure not templated config is present - copy: src=files/{{ item }} dest=/etc/postfix/ - with_items: - - login_maps.pcre - - sender_login_map.hash - - postscreen_whitelist - notify: - - restart postfix +- name: ensure additional packages are installed if required + apt: + name: memcached + state: present + when: postfix_enable_memcached tags: - postfix - mail -- name: ensure templated config is present - template: src=templates/{{ item }}.j2 dest=/etc/postfix/{{ item }} +- name: ensure config is present + template: + src: "{{ item }}.j2" + dest: "/etc/postfix/{{ item }}" with_items: + - login_maps.pcre - master.cf - main.cf - - postscreen_cache + - postscreen_access.cidr notify: - restart postfix tags: @@ -36,7 +37,21 @@ - mail - name: ensure memcached config is present - template: src=templates/memcached.conf.j2 dest=/etc/memcached.conf + template: + src: memcached.conf.j2 + dest: /etc/memcached.conf + when: postfix_enable_memcached + notify: + - restart memcached + tags: + - postfix + - mail + +- name: ensure postscreen memcached integration is present + template: + src: postscreen_cache.j2 + dest: /etc/postfix/postscreen_cache + when: postfix_enable_memcached notify: - restart memcached tags: @@ -44,7 +59,9 @@ - mail - name: ensure system alias database is present - template: src=templates/aliases.j2 dest=/etc/aliases + template: + src: aliases.j2 + dest: /etc/aliases notify: - postmap system tags: @@ -52,15 +69,21 @@ - mail - name: ensure virtual alias database is present - template: src=templates/v_aliases.j2 dest=/etc/postfix/virtual + template: + src: virtual.j2 + dest: /etc/postfix/virtual notify: - postmap virtual tags: - postfix - mail -- meta: flush_handlers - - - - +- name: ensure mailname is properly configured + template: + src: mailname.j2 + dest: /etc/mailname + notify: + - restart postfix + tags: + - postfix + - mail diff --git a/postfix/templates/aliases.j2 b/postfix/templates/aliases.j2 index 71ae0df53b516d4886074421bf76aafea6aea345..90ef766aecfe1a12e9b4dd113b7bcf55456e1436 100644 --- a/postfix/templates/aliases.j2 +++ b/postfix/templates/aliases.j2 @@ -1,4 +1,3 @@ {% for alias in system_aliases %} -{{ alias.src }}:{{ alias.dest }} +{{ alias.src }}: {{ alias.dest }} {% endfor %} - diff --git a/postfix/templates/login_maps.pcre.j2 b/postfix/templates/login_maps.pcre.j2 new file mode 100644 index 0000000000000000000000000000000000000000..8a395f7879c5a5c4d21770321eb2159f406406eb --- /dev/null +++ b/postfix/templates/login_maps.pcre.j2 @@ -0,0 +1 @@ +/^(.*){{ postfix_login_suffix }}$/ ${1} diff --git a/postfix/templates/mailname.j2 b/postfix/templates/mailname.j2 new file mode 100644 index 0000000000000000000000000000000000000000..81008bac28684edb06528802426d0c82acdeb96d --- /dev/null +++ b/postfix/templates/mailname.j2 @@ -0,0 +1 @@ +{{ domain }} diff --git a/postfix/templates/main.cf.j2 b/postfix/templates/main.cf.j2 index 4b42739221144893e00533536c797c5268d03127..b891d06cabac1898f6f96f2a3234746c09aafa44 100644 --- a/postfix/templates/main.cf.j2 +++ b/postfix/templates/main.cf.j2 @@ -1,45 +1,34 @@ # See /usr/share/postfix/main.cf.dist for a commented, more complete version +inet_interfaces = all +inet_protocols = all +myhostname = {{ ansible_fqdn }} +myorigin = /etc/mailname +mydestination = $myhostname localhost {{ postfix_domains | join(" ") }} +mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 +relayhost = +{% if postfix_domains|count > 0 %} +{% if postfix_prefer_lmtp %} +mailbox_transport = lmtp:unix:private/dovecot-lmtp +{% else %} +mailbox_command = /usr/lib/dovecot/dovecot-lda -f "$SENDER" -a "$RECIPIENT" +{% endif %} +{% endif %} -# Debian specific: Specifying a file name will cause the first -# line of that file to be used as the name. The Debian default -# is /etc/mailname. -#myorigin = /etc/mailname - -smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU) -biff = no - -# appending .domain is the MUA's job. append_dot_mydomain = no - -# Uncomment the next line to generate "delayed mail" warnings +biff = no +compatibility_level = 2 #delay_warning_time = 4h - +disable_vrfy_command = yes +#enable_long_queue_ids = yes +mailbox_size_limit = 0 +#message_size_limit = 41943040 readme_directory = no +recipient_delimiter = + +#strict_rfc821_envelopes = no -# See http://www.postfix.org/COMPATIBILITY_README.html -- default to 2 on -# fresh installs. -compatibility_level = 2 - -# TLS parameters -smtpd_use_tls = yes -smtpd_tls_cert_file=/var/lib/acme/live/wolfscloud.de/fullchain -smtpd_tls_key_file=/var/lib/acme/live/wolfscloud.de/privkey -smtpd_tls_auth_only=yes -smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache -smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache - -#ciphers supported downto android 2.3 -smtpd_tls_mandatory_protocols = !TLSv1 !SSLv2, !SSLv3 -smtpd_tls_protocols = !TLSv1 !SSLv2 !SSLv3 -smtpd_tls_mandatory_ciphers=high -tls_high_cipherlist = {{ tls_ciphers }} -smtpd_tls_eecdh_grade=ultra - - - -# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for -# information on enabling SSL in the smtp client. +smtpd_banner = $myhostname ESMTP $mail_name +smtpd_sender_login_maps = proxy:pcre:/etc/postfix/login_maps.pcre smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth smtpd_sasl_auth_enable = yes @@ -47,82 +36,56 @@ smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination -myhostname = {{ ansible_fqdn }} + +smtpd_use_tls = yes +smtpd_tls_auth_only = yes +smtpd_tls_cert_file = {{ postfix_tls_cert }} +smtpd_tls_key_file = {{ postfix_tls_key }} +smtpd_tls_eecdh_grade = ultra +smtpd_tls_mandatory_ciphers = high +smtpd_tls_mandatory_protocols = {{ postfix_tls_protocols }} +smtpd_tls_protocols = {{ postfix_tls_protocols }} +smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache +smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache +tls_high_cipherlist = {{ postfix_tls_ciphers }} + alias_maps = cdb:/etc/aliases alias_database = cdb:/etc/aliases -myorigin = /etc/mailname -mydestination = $myhostname, localhost -relayhost = -mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 -mailbox_size_limit = 0 -recipient_delimiter = + -inet_interfaces = all -inet_protocols = all +virtual_alias_maps = cdb:/etc/postfix/virtual -virtual_mailbox_domains = {{ virtual_domains | join(", ") }} +{% if postfix_virtual_domains|count > 0 %} +virtual_mailbox_domains = {{ postfix_virtual_domains | join(", ") }} virtual_mailbox_base = /var/vmail/ virtual_mailbox_limit = 512000000 virtual_minimum_uid = 5000 virtual_transport = lmtp:unix:private/dovecot-lmtp virtual_gid_maps = static:5000 -virtual_alias_maps = cdb:/etc/postfix/virtual -smtpd_sender_login_maps = proxy:pcre:/etc/postfix/login_maps.pcre +{% endif %} -################################################################################ -## POSTSCREEN - ERSTE STUFE DER SPAM/UCE/VIREN-ABWEHRMECHANISMEN -# -# Django : 2014-10-29 - PERMANENT WHITE/BLACKLIST TEST -# default: postscreen_access_list = permit_mynetworks postscreen_access_list = permit_mynetworks - cidr:/etc/postfix/postscreen_whitelist -# -# default: postscreen_blacklist_action = ignore + cidr:/etc/postfix/postscreen_access.cidr +{% if postfix_enable_memcached %} +postscreen_cache_map = memcache:/etc/postfix/postscreen_cache +proxy_write_maps = proxy:btree:/var/lib/postfix/postscreen_cache +{% else %} +postscreen_cache_map = proxy:btree:/var/lib/postfix/postscreen_cache +{% endif %} + postscreen_blacklist_action = drop - - -# Django : 2014-10-29 - MAIL EXCHANGER POLICY TESTS -# default: postscreen_whitelist_interfaces = static:all - -# Django : 2014-10-29 - PRE 220 GREETING TESTS -# -# default: postscreen_greet_banner = $smtpd_banner -# -# default: postscreen_greet_action = ignore postscreen_greet_action = enforce - -# default: postscreen_dnsbl_threshold = 1 -postscreen_dnsbl_threshold = 2 -# -# default: postscreen_dnsbl_sites = -postscreen_dnsbl_sites = zen.spamhaus.org*1 - bl.spamcop.net*1 - b.barracudacentral.org*1 - #swl.spamhaus.org*2 - list.dnswl.org*-5 -# -# default: postscreen_dnsbl_action = ignore -postscreen_dnsbl_action = enforce - - -# Django : 2014-10-29 - POST 220 GREETING TESTS -# -# default: postscreen_dnsbl_whitelist_threshold = 0 -postscreen_dnsbl_whitelist_threshold = -1 -# -# default: postscreen_pipelining_enable = no +# postscreen_whitelist_interfaces = static:all +# postscreen_greet_banner = $smtpd_banner postscreen_pipelining_enable = yes -# -# default: postscreen_pipelining_action = enforce -# -# default: postscreen_non_smtp_command_enable = no +# postscreen_pipelining_action = enforce postscreen_non_smtp_command_enable = yes -# default: postscreen_non_smtp_command_action = drop -# -# default: postscreen_bare_newline_enable = no +# postscreen_non_smtp_command_action = drop postscreen_bare_newline_enable = yes -# -# default: postscreen_bare_newline_action = ignore postscreen_bare_newline_action = drop -# -postscreen_cache_map = memcache:/etc/postfix/postscreen_cache -proxy_write_maps = proxy:btree:/var/lib/postfix/postscreen_cache + +postscreen_dnsbl_action = enforce +postscreen_dnsbl_threshold = 2 +postscreen_dnsbl_whitelist_threshold = -1 +postscreen_dnsbl_sites = +{% for site in postfix_dnsbl_sites %} + {{ site.name }}*{{ site.modifier|default(1) }} +{% endfor %} diff --git a/postfix/templates/master.cf.j2 b/postfix/templates/master.cf.j2 index 6105ccd55ecf4648da5f140ce7caee5622029c9d..abcd14149c00ce9bed3239d4dcba659a8cbf1c08 100644 --- a/postfix/templates/master.cf.j2 +++ b/postfix/templates/master.cf.j2 @@ -1,36 +1,32 @@ -dovecot unix - n n - - pipe - flags=DRhu user=5001:5000 argv=/usr/lib/dovecot/dovecot-lda -f ${sender} -a ${original_recipient} -d ${user}@${nexthop} -# # Postfix master process configuration file. For details on the format # of the file, see the master(5) manual page (command: "man 5 master" or # on-line: http://www.postfix.org/master.5.html). # # Do not forget to execute "postfix reload" after editing this file. -# + # ========================================================================== # service type private unpriv chroot wakeup maxproc command + args # (yes) (yes) (no) (never) (100) # ========================================================================== -#smtp inet n - y - - smtpd + +#smtp inet n - y - - smtpd smtp inet n - y - 1 postscreen smtpd pass - - y - - smtpd -{% if content_filter is defined %} - -o content_filter={{ content_filter }} +{% if postfix_content_filter %} + -o content_filter={{ postfix_content_filter }} {% endif %} dnsblog unix - - y - 0 dnsblog tlsproxy unix - - y - 0 tlsproxy submission inet n - y - - smtpd -# -o smtpd_tls_security_level=encrypt -o smtpd_sasl_security_options=noanonymous -o smtpd_sasl_local_domain=$myhostname -o smtpd_client_restrictions=permit_sasl_authenticated,reject -o smtpd_sender_restrictions=reject_sender_login_mismatch -o smtpd_recipient_restrictions=reject_non_fqdn_recipient,reject_unknown_recipient_domain,permit_sasl_authenticated,reject -{% if content_filter is defined %} - -o content_filter={{ content_filter }} -{% endif %} -o syslog_name=postfix/submission -# -o syslog_name=postfix/submission +{% if postfix_content_filter %} + -o content_filter={{ postfix_content_filter }} +{% endif %} # -o smtpd_tls_security_level=encrypt # -o smtpd_sasl_auth_enable=yes # -o smtpd_reject_unlisted_recipient=no @@ -51,7 +47,7 @@ submission inet n - y - - smtpd # -o smtpd_recipient_restrictions= # -o smtpd_relay_restrictions=permit_sasl_authenticated,reject # -o milter_macro_daemon_name=ORIGINATING -#628 inet n - y - - qmqpd +#628 inet n - y - - qmqpd pickup unix n - y 60 1 pickup cleanup unix n - y - 0 cleanup qmgr unix n - n 300 1 qmgr @@ -77,7 +73,7 @@ virtual unix - n n - - virtual lmtp unix - - y - - lmtp anvil unix - - y - 1 anvil scache unix - - y - 1 scache -# + # ==================================================================== # Interfaces to non-Postfix software. Be sure to examine the manual # pages of the non-Postfix software to find out what options it wants. @@ -86,57 +82,28 @@ scache unix - - y - 1 scache # agent. See the pipe(8) man page for information about ${recipient} # and other message envelope options. # ==================================================================== -# + # maildrop. See the Postfix MAILDROP_README file for details. # Also specify in main.cf: maildrop_destination_recipient_limit=1 -# -maildrop unix - n n - - pipe - flags=DRhu user=vmail argv=/usr/bin/maildrop -d ${recipient} -# -# ==================================================================== -# -# Recent Cyrus versions can use the existing "lmtp" master.cf entry. -# -# Specify in cyrus.conf: -# lmtp cmd="lmtpd -a" listen="localhost:lmtp" proto=tcp4 -# -# Specify in main.cf one or more of the following: -# mailbox_transport = lmtp:inet:localhost -# virtual_transport = lmtp:inet:localhost -# -# ==================================================================== -# -# Cyrus 2.1.5 (Amos Gouaux) -# Also specify in main.cf: cyrus_destination_recipient_limit=1 -# -#cyrus unix - n n - - pipe -# user=cyrus argv=/cyrus/bin/deliver -e -r ${sender} -m ${extension} ${user} -# -# ==================================================================== -# Old example of delivery via Cyrus. -# -#old-cyrus unix - n n - - pipe -# flags=R user=cyrus argv=/cyrus/bin/deliver -e -m ${extension} ${user} -# -# ==================================================================== -# -# See the Postfix UUCP_README file for configuration details. -# -uucp unix - n n - - pipe - flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient) -# -# Other external delivery methods. -# -ifmail unix - n n - - pipe - flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient) -bsmtp unix - n n - - pipe - flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -t$nexthop -f$sender $recipient -scalemail-backend unix - n n - 2 pipe - flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} ${user} ${extension} -mailman unix - n n - - pipe - flags=FR user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py - ${nexthop} ${user} -{% if content_filter is defined %} -{{ content_filter }} {{ content_filter_arguments }} -{{ content_filter_command }} + +dovecot unix - n n - - pipe + flags=DRhu user=5001:5000 argv=/usr/lib/dovecot/dovecot-lda -f ${sender} -a ${original_recipient} -d ${user}@${nexthop} + +{% if postfix_content_filter == 'spamassassin' %} +spamassassin unix - n n - - pipe + user=debian-spamd argv=/usr/bin/spamc -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient} {% endif %} + +#maildrop unix - n n - - pipe +# flags=DRhu user=vmail argv=/usr/bin/maildrop -d ${recipient} +#uucp unix - n n - - pipe +# flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient) +#ifmail unix - n n - - pipe +# flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient) +#bsmtp unix - n n - - pipe +# flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -t$nexthop -f$sender $recipient +#scalemail-backend unix - n n - 2 pipe +# flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} ${user} ${extension} +#mailman unix - n n - - pipe +# flags=FR user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py +# ${nexthop} ${user} diff --git a/postfix/templates/postscreen_access.cidr.j2 b/postfix/templates/postscreen_access.cidr.j2 new file mode 100644 index 0000000000000000000000000000000000000000..8a829fb4201c7cc7e148d3580ed553af67549fb4 --- /dev/null +++ b/postfix/templates/postscreen_access.cidr.j2 @@ -0,0 +1,16 @@ +# access-Tabelle: Wer wird von postscreen ausgenommen und wer nicht? +# Tabelle zum black- und whitelisten einzelner Hosts auf Basis ihrer +# IP-Adressen. In der rechten Tabellenspalte können die Aktionen +# "permit", "reject" und "dunno" gesetzt werden. +# Nach dem Ändern und/oder Erweitern der Tabelle, muß ein +# laufender Postfix über die Änderungen mit einem reload informiert +# werden: +# $ systemctl reload postfix.service +# +# Es muss hier keine Datenbank mit postmap erzeugt werden, da +# Postfix die ASCII-Konfigurationsdatei direkt auswertet! +# + +{% for net in postfix_network_access %} +{{ net.cidr }} {{ net.action|default('dunno') }} +{% endfor %} diff --git a/postfix/templates/postscreen_cache.j2 b/postfix/templates/postscreen_cache.j2 index 9b861ab82dc7efbb107f29b0cf32254c88488020..7b2601b00201bbc9abd24df2a0e75cbf875a013f 100644 --- a/postfix/templates/postscreen_cache.j2 +++ b/postfix/templates/postscreen_cache.j2 @@ -1,10 +1,6 @@ -# Django : 2014-11-07 postscreen-cache Konfigurationsdatei -# # -# - {% for partner in groups['mail'] %} {% if partner != ansible_hostname %} -memcache = inet:{{hostvars[partner]["tinc_vpnip"]}}:11211 +memcache = inet:{{ hostvars[partner]['tinc_vpnip'] }}:11211 {% endif %} {% endfor %} diff --git a/postfix/templates/v_aliases.j2 b/postfix/templates/virtual.j2 similarity index 64% rename from postfix/templates/v_aliases.j2 rename to postfix/templates/virtual.j2 index c24df94c5b8622e0f53b9c1cbc301aaac51ec50e..4540d44db607cef07a37ba028932e98f153e1c85 100644 --- a/postfix/templates/v_aliases.j2 +++ b/postfix/templates/virtual.j2 @@ -5,6 +5,11 @@ abuse@{{ domain }} {{ adminaddr }} {% endfor %} {% for alias in virtual_aliases %} +{% if alias.src is string %} {{ alias.src }} {{ alias.dest }} +{% else %} +{% for src in alias.src %} +{{ src }}@{{ alias.domain }} {{ alias.dest }} +{% endfor %} +{% endif %} {% endfor %} -