shell: gnupg: always update conf
[sourcephile-nix.git] / servers / mermet / postfix.nix
index a6dd7319a06ec1f664a3d42282ddc3d1492875d8..56ef05345d1267b308fa3306af2decc5daccefed 100644 (file)
 { pkgs, lib, config, ... }:
 let
-  inherit (builtins) attrNames readFile toPath;
+  inherit (builtins) attrNames concatStringsSep readFile toPath;
   inherit (builtins.extraBuiltins) pass;
   inherit (lib) types;
   inherit (pkgs.lib) loadFile unlines unwords unlinesAttrs;
-  inherit (config) networking;
+  inherit (config) networking users;
   inherit (config.services) postfix dovecot2 openldap;
-
-  submissionHeaderCleanupRules = pkgs.writeText "submission_header_cleanup_rules" ''
-    # Removes sensitive headers from mails handed in via the submission or smtps port.
-    # See https://thomas-leister.de/mailserver-debian-stretch/
-    # Uses "pcre" style regex.
-
-    /^Received:/         IGNORE
-    /^User-Agent:/       IGNORE
-    /^X-Enigmail:/       IGNORE
-    /^X-Mailer:/         IGNORE
-    /^X-Originating-IP:/ IGNORE
-  '';
 in
 {
-systemd.services.postfix.after = [
-  "openldap.service"
-  "postfix.${networking.domainBase}.key.pem-key.service"
+imports = [
+  postfix/sourcephile.fr.nix
+  postfix/autogeree.net.nix
 ];
-deployment.keys = {
-  "postfix.${networking.domainBase}.key.pem" = {
-    text        = pass "x509/${networking.domainBase}/key.pem";
-    user        = postfix.user;
-    group       = "root";
-    destDir     = "/run/keys/";
-    permissions = "0400"; # WARNING: not enforced when deployment.storeKeysOnMachine = true
+options = {
+  services.postfix = {
+    tls_server_sni_maps = lib.mkOption {
+      type = types.attrsOf (types.listOf types.path);
+      default = {};
+      apply = m: pkgs.writeText "sni" (lib.concatStringsSep "\n" (lib.mapAttrsToList (domain: x509: ''
+        ${domain} ${unwords x509}
+      '') m));
+    };
   };
 };
+config = {
+systemd.services.postfix = {
+  after = ["openldap.service"];
+  preStart = ''
+    install -m 400 -o root -g root ${postfix.tls_server_sni_maps} /run/keys/postfix-sni
+    ${pkgs.postfix}/bin/postmap -F hash:/run/keys/postfix-sni
+  '';
+};
 services.postfix = {
   enable = true;
-  #hostname = networking.domain;
-  #domain = "localdomain";
   networksStyle = "host";
-  #mapFiles."valias" = toFile "valias" (unlines (all_valiases_postfix ++ catchAllPostfix));
-  # See https://blog.grimneko.de/2011/12/24/a-bunch-of-tips-for-improving-your-postfix-setup/
-  # for details on how this file looks. By using the same file as valias,
-  # every alias is uniquely owned by its user.
-  # The user's own address is already in all_valiases_postfix.
-  #mapFiles."vaccounts" = toFile "vaccounts" (unlines all_valiases_postfix);
-  mapFiles."virtual_alias_maps" = pkgs.writeText "virtual_alias_maps"
-    (unlinesAttrs
-     (from: to: "${from} ${unwords to}")
-     postfix.aliases);
-  mapFiles."ldap-virtual_alias_maps.cf" = pkgs.writeText "ldap-virtual_alias_maps.cf" ''
-    version          = 3
-    debuglevel       = 0
-    server_host      = ldapi://
-    bind             = sasl
-    sasl_mechs       = EXTERNAL
-    search_base      = ou=posix,${openldap.domainSuffix}
-    scope            = sub
-    dereference      = 0
-    query_filter     = (&(mailAlias=%s)(mailEnabled=TRUE))
-    result_format    = %s
-    result_attribute = mail
-  '';
-  mapFiles."ldap-forward.cf" = pkgs.writeText "ldap-forward.cf" ''
-    version          = 3
-    debuglevel       = 0
-    server_host      = ldapi://
-    bind             = sasl
-    sasl_mechs       = EXTERNAL
-    search_base      = ou=posix,${openldap.domainSuffix}
-    scope            = sub
-    dereference      = 0
-    query_filter     = (&(mail=%s)(mailEnabled=TRUE))
-    result_format    = %s
-    result_attribute = mailForwardingAddress
-  '';
-  sslCert = loadFile (../../../sec/openssl + "/${networking.domainBase}/cert.self-signed.pem");
-  sslKey = "/run/keys/postfix.${networking.domainBase}.key.pem";
-  #enableSubmission = true;
-  #enableSmtp = true;
+  hostname ="${networking.hostName}.${networking.domain}";
+  domain = networking.domain;
+  origin = "$myhostname";
   destination = [
     "localhost"
     "localhost.localdomain"
-    networking.hostName
-    "${networking.hostName}.localdomain"
+    "$myhostname"
   ];
+  postmasterAlias = "root";
+  rootAlias = "root@${networking.domain}";
+  sslCert = loadFile (../../../sec/openssl + "/${networking.domain}/cert.self-signed.pem");
+  sslKey = "/run/keys/${networking.domain}.key.pem";
   networks = [
     "127.0.0.0/8"
     "[::1]/128"
   ];
+  setSendmail = true;
+  # Parse the extension in email address, eg. contact+extension@
   recipientDelimiter = "+";
   config = {
-    # Appending .domain is the MUA's job
-    append_dot_mydomain = false;
-    # No console bell on new mail
-    biff = false;
-    body_checks = "";
-    #content_filter = "amavisfeed:[127.0.0.1]:10024";
-    #debug_peer_level = 4;
-    #debug_peer_list = ".$myhostname";
-    default_extra_recipient_limit = "5000";
-    # Uncomment the next line to generate "delayed mail" warnings
-    #delay_warning_time = "4h";
-    # Stops some techniques used to harvest email addresses
-    disable_vrfy_command = true;
-    duplicate_filter_limit = "5000";
-    enable_long_queue_ids = false;
-    # Pass unexisting $mydestination recipients to dovecot
-    fallback_transport = "lmtp:unix:private/dovecot-lmtp";
-    forward_path = [
-      ''$home/.forward''${recipient_delimiter}''${extension}''
-      "$home/.forward"
+    debug_peer_level = "4";
+    debug_peer_list = [
+      #"chomsky.autogeree.net"
+      #"localhost"
+      #"mail.sourcephile.fr"
     ];
-    #header_checks = "regexp:/var/lib/postfix/conf/header_checks";
-    #inet_interfaces = "all";
-    line_length_limit = "2048";
-
-    # Let $fallback_transport check existence of recipients
-    local_recipient_maps = "";
-    #mail_spool_directory = "/var/spool/mail";
-      # NOTE: nixpkgs's default
-    #local_header_rewrite_clients = "";
-    #home_mailbox = "Maildir/";
-    #mailbox_command = ''
-    #  ${pkgs.procmail}/bin/procmail -t -a "$SENDER" -a "$RECIPIENT" -a "$USER" -a "$EXTENSION" -a "$DOMAIN" -a "$ORIGINAL_RECIPIENT" "$HOME/.procmailrc"
-    #'';
-    mailbox_size_limit = "204800000";
 
-    masquerade_classes = [ "envelope_sender" "header_sender" "header_recipient" ];
-    masquerade_domains = "";
-    masquerade_exceptions = "root";
-    maximal_queue_lifetime = "5d";
-    message_size_limit = "20480000";
-    mime_header_checks = "";
-    milter_header_checks = "";
-    nested_header_checks = "";
-    #non_smtpd_milters = "";
-    parent_domain_matches_subdomains = [
-      #"debug_peer_list"
-      #"fast_flush_domains"
-      #"mynetworks"
-      #"permit_mx_backup_networks"
-      #"qmqpd_authorized_clients"
-      #"smtpd_access_maps"
-    ];
-    permit_mx_backup_networks = "";
-    #policy-spf_time_limit = "3600s";
-    propagate_unmatched_extensions = [ "canonical" "virtual" "alias" ];
-    queue_minfree = "0";
-    #receive_override_options = "no_address_mappings";
-      # no_unknown_recipient_checks
-      #         Do not try to reject unknown recipients (SMTP server only).
-      #         This is typically specified AFTER an external content filter.
-      # no_address_mappings
-      #         Disable canonical address mapping, virtual alias map expansion,
-      #         address masquerading, and automatic BCC (blind carbon-copy) recipients.
-      #         This is typically specified BEFORE an external content filter (eg. amavis).
-      # no_header_body_checks
-      #         Disable header/body_checks. This is typically specified AFTER
-      #         an external content filter.
-      # no_milters
-      #         Disable Milter (mail filter) applications.
-      #         This is typically specified AFTER an external content filter.
-    # Parse the extension in email address, eg. contact+extension@
-    relayhost = "";
-    #relay_clientcerts = hash:/var/lib/postfix/conf/relay_clientcerts
-    # This is where to put backup MX domains
-    relay_domains = "$mydestination";
-    relay_recipient_maps = "";
+    #
+    # Sending to the world
+    #
+    # Appending .domain is the MUA's job
+    append_dot_mydomain = false;
     smtp_body_checks = "";
     #smtp_cname_overrides_servername = false;
     smtp_connect_timeout = "60s";
@@ -180,15 +79,40 @@ services.postfix = {
     #smtp_tls_policy_maps = "hash:/var/lib/postfix/conf/tls_policy";
     # Only allow TLSv* protocols
     smtp_tls_protocols = [ "!SSLv2" "!SSLv3" ];
-    smtp_tls_scert_verifydepth = "5";
+    #smtp_tls_scert_verifydepth = "5";
     #smtp_tls_secure_cert_match = [ "nexthop" "dot-nexthop" ];
     smtp_tls_security_level = "may";
     smtp_tls_session_cache_database = "btree:$data_directory/smtp_tls_session_cache";
     #smtp_tls_session_cache_timeout = "3600s";
     #smtp_tls_verify_cert_match = "hostname";
+
+    #
+    # Receiving from the world
+    #
+    message_size_limit = "20480000";
+    maximal_queue_lifetime = "5d";
+    default_extra_recipient_limit = "5000";
+    line_length_limit = "2048";
+    duplicate_filter_limit = "5000";
+    # Stops mail from poorly written software
+    strict_rfc821_envelopes = true;
+    mime_header_checks = [];
+    milter_header_checks = [];
+    nested_header_checks = [];
+    body_checks = [];
+    content_filter = "";
+    permit_mx_backup_networks = [];
+    propagate_unmatched_extensions = [ "canonical" "virtual" "alias" ];
+    #masquerade_classes = [ "envelope_sender" "header_sender" "header_recipient" ];
+    #masquerade_domains = "";
+    #masquerade_exceptions = "root";
+    queue_minfree = "0";
+    # Stops some techniques used to harvest email addresses
+    disable_vrfy_command = true;
+    enable_long_queue_ids = false;
     # Useful to test restrictions
     smtpd_authorized_xclient_hosts = "127.0.0.1";
-    smtpd_banner = "${networking.hostName} ESMTP $mail_name (NixOS)";
+    smtpd_banner = "$myhostname ESMTP $mail_name (NixOS)";
     smtpd_client_connection_count_limit = "50";
     smtpd_client_connection_rate_limit = "0";
     smtpd_client_event_limit_exceptions = "$mynetworks";
@@ -196,102 +120,84 @@ services.postfix = {
     smtpd_client_new_tls_session_rate_limit = "0";
     smtpd_client_port_logging = false;
     smtpd_client_recipient_rate_limit = "0";
-    smtpd_client_restrictions = [
-      #"check_client_access hash:/var/lib/postfix/conf/client_blacklist"
-    ];
-    smtpd_data_restrictions = [
-      "reject_unauth_pipelining"
-        # Force the smtp client to wait OK before sending
-      "permit"
-    ];
-    # Disable opportunistic encryption
-    smtpd_discard_ehlo_keywords = "starttls";
-    #smtpd_end_of_data_restrictions = "";
     # Ban 5 sec on error
     smtpd_error_sleep_time = "5";
+    # Needed to enforce reject_unknown_helo_hostname
     smtpd_helo_required = true;
     smtpd_helo_restrictions = [
       "reject_invalid_helo_hostname"
       "reject_non_fqdn_helo_hostname"
-      #"reject_unknown_helo_hostname"
-        # May be useful to fight spam
+      # Don't talk to mail systems that don't know their own hostname.
+      "reject_unknown_helo_hostname"
       "permit"
     ];
-    #smtpd_milters = "";
-    smtpd_peername_lookup = true;
-    smtpd_recipient_limit = "5000";
-    smtpd_recipient_overshoot_limit = "5000";
+    smtpd_client_restrictions = [
+    ];
+    # Set in postfix/*.nix and used in submissions/smptd
+    # with reject_sender_login_mismatch
+    smtpd_sender_login_maps = [];
+    smtpd_sender_restrictions = [
+      "reject_non_fqdn_sender"
+      "permit"
+    ];
+    smtpd_reject_unlisted_recipient = true;
+    # Check the RCPT TO, before smtpd_recipient_restrictions
+    # Restrictions based on what is allowed or not,
+    # these are applied before smtpd_recipient_restrictions
+    smtpd_relay_restrictions = [
+      "permit_mynetworks"
+      # Check the recipient's address in virtual_mailbox_domains and virtual_mailbox_maps
+      "permit_auth_destination"
+      # The world is only authorized to use our relay for the above destinations.
+      "reject"
+    ];
+    # Restrictions based on what is working or not
     smtpd_recipient_restrictions = [
+      # Reject if the domain is not fully qualified
       "reject_non_fqdn_recipient"
-      #"reject_invalid_hostname"
+      # Reject if the domain is not working, even before bothering to check the address
       "reject_unknown_recipient_domain"
-      #"reject_non_fqdn_sender"
-      "reject_unauth_pipelining"
-      #"check_policy_service inet:localhost:12340"
-      # check quota
-      "permit_mynetworks"
-      #"permit_tls_clientcerts"
-      "permit_sasl_authenticated"
+      # Reject if the address is not working
+      # WARNING: verify(8) has a cache, dumpable if verify(8) is stopped, with:
+      # postmap -s btree:/var/lib/postfix/data/verify_cache
       "reject_unverified_recipient"
-        # $fallback_transport is responsible of checking the existence of the recipient
-        # WARNING: verify(8) has a cache, dumpable if verify(8) is stopped, with:
-        # postmap -s btree:/var/lib/postfix/data/verify_cache
-      # Bypass SPF check and postgrey if the recipient is not for us or someone in backup_mx
-      "reject_unauth_destination"
-      # Check SPF
-      #"check_policy_service unix:private/spfcheck"
-      # Greylisting using postgrey
-      #"check_policy_service unix:${postgrey.socket.path}"
-      "permit_auth_destination"
-      "reject"
-      #"reject_unknown_sender_domain"
-        # Maybe better in smtpd_sender_restrictions
-      #"reject_rbl_client bl.spamcop.net"
-      #"reject_rbl_client list.dsbl.org"
-      #"reject_rbl_client zen.spamhaus.org"
-      #"reject_rbl_client dnsbl.sorbs.net"
+      "permit"
     ];
-    smtpd_relay_restrictions = [
-      "permit_mynetworks"
-      "permit_sasl_authenticated"
-        # NOTE: permit auth through dovecot's SASL
-      "reject_unauth_destination"
+    # Trust the verify database
+    unverified_recipient_reject_code = "550";
+    smtpd_data_restrictions = [
+      # Force the smtpd's client to wait OK before sending
+      "reject_unauth_pipelining"
+      "permit"
     ];
+    smtpd_end_of_data_restrictions = [
+      # Enforce mail volume quota via policy service callouts.
+      #check_policy_service unix:private/policy
+    ];
+    #smtpd_milters = "";
+    smtpd_peername_lookup = true;
+    smtpd_recipient_limit = "5000";
+    smtpd_recipient_overshoot_limit = "5000";
     #smtpd_restriction_classes = "";
-    broken_sasl_auth_clients = false;
     #smtpd_sasl_auth_enable = true;
     #smtpd_sasl_path = "private/auth";
     #smtpd_sasl_security_options = "noanonymous";
     #smtpd_sasl_type = "dovecot";
-    smtpd_sender_restrictions = [
-      "permit_mynetworks"
-      #"permit_tls_clientcerts"
-      "permit_sasl_authenticated"
-        # NOTE: permit auth through dovecot's SASL
-      #"check_sender_access hash:/var/lib/postfix/conf/sender_access"
-      "reject_unauth_pipelining"
-      "reject_non_fqdn_sender"
-      #"reject_sender_login_mismatch"
-      #"reject_unknown_sender_domain"
-      "permit"
-    ];
     smtpd_starttls_timeout = "300s";
     #smtpd_tls_always_issue_session_ids = true;
-    # No SASL AUTH without TLS
-    smtpd_tls_auth_only = true;
     #smtpd_tls_CApath = "/etc/postfix/x509/ca/";
     smtpd_tls_ask_ccert = false;
     #smtpd_tls_ccert_verifydepth = "5";
     smtpd_tls_ciphers = "high";
-    smtpd_tls_eecdh_grade = "ultra";
+    smtpd_tls_eecdh_grade = "auto";
     # Disable weak ciphers as reported by https://ssl-tools.net
     # https://serverfault.com/questions/744168/how-to-disable-rc4-on-postfix
-    smtpd_tls_exclude_ciphers = [ "RC4" "aNULL" ];
+    smtpd_tls_exclude_ciphers = [ "ADH" "MD5" "CAMELLIA" "SEED" "3DES" "DES" "RC4" "eNULL" "aNULL" ];
     smtpd_tls_fingerprint_digest = "sha512";
     # Log only a summary message on TLS handshake completion
     smtpd_tls_loglevel = "1";
     smtpd_tls_mandatory_ciphers = "high";
-    smtpd_tls_mandatory_protocols = "TLSv1"; # FIXME: TLSv1.3
+    smtpd_tls_mandatory_protocols = [ "!SSLv2" "!SSLv3" ];
     # Only allow TLSv*
     smtpd_tls_protocols = [ "!SSLv2" "!SSLv3" ];
     #smtpd_tls_received_header = false;
@@ -304,89 +210,136 @@ services.postfix = {
     smtpd_tls_security_level = "may";
     smtpd_tls_session_cache_database = "btree:$data_directory/smtpd_tls_session_cache";
     #smtpd_tls_session_cache_timeout = "3600s";
-    # Stops mail from poorly written software
-    strict_rfc821_envelopes = true;
-    #sympa_destination_recipient_limit = "1";
-    #sympabounce_destination_recipient_limit = "1";
-    # postconf(5) discourages to change this
-    #tls_high_cipherlist = "AES256-SHA";
-    #tls_random_bytes = "32";
-    # Must not be in a chroot
-    #tls_random_exchange_name = "$data_directory/prng_exch";
-    #tls_random_prng_update_period = "3600s";
-    #tls_random_reseed_period = "3600s";
+    #smtpd_tls_chain_files =
+
+    relayhost = [];
+    #relay_clientcerts = hash:/var/lib/postfix/conf/relay_clientcerts
+    # This is where to put backup MX domains
+    relay_domains = [];
+    relay_recipient_maps = [];
+
     # Use a non blocking source of randomness
     tls_random_source = "dev:/dev/urandom";
-    transport_maps = [
-      #"ldap:transport"
-      #"hash:/etc/postfix/transport-dovecot"
-      #"hash:/etc/postfix/$mydomain/transport"
-      #"hash:/etc/dovecot/transport"
-      #"regexp:/etc/sympa/transport"
+    # Map each domain to a specific X.509 certificate
+    tls_server_sni_maps = "hash:/run/keys/postfix-sni";
+
+    # Only explicitely aliased accounts have a mail, not all the passwd
+    local_recipient_maps = "$alias_maps";
+    # Note that the local transport rewrites the envelope recipient
+    # according to the alias_maps, and thus the aliasing is transparent
+    # to the nexthop (eg. dovecot)
+    #local_transport = local:$myhostname
+    # No console bell on new mail
+    biff = false;
+    forward_path = [
+      /*
+      "$home/.forward''${recipient_delimiter}''${extension}"
+      "$home/.forward"
+      */
     ];
-    # Rejects immediately what $fallback_transport rejects
-    unverified_recipient_reject_code = "550";
-    # Do not specify virtual alias domain names in mydestination
-    # or relay_domains configuration parameters
-    #
-    # With  a  virtual  alias  domain,  the  Postfix SMTP server
-    # accepts  mail  for  known-user@virtual-alias.domain,   and
-    # rejects   mail  for  unknown-user@virtual-alias.domain  as
-    # undeliverable.
-    virtual_alias_domains = [];
-    virtual_alias_maps = [
-      #"hash:/etc/postfix/virtual_alias_maps"
-      #"hash:/etc/postfix/virtual_domain_alias_maps"
-      "ldap:/etc/postfix/ldap-forward.cf"
-      "ldap:/etc/postfix/ldap-virtual_alias_maps.cf"
-      #"hash:/etc/postfix/virtual_alias-dovecot"
-      #"hash:/var/lib/postfix/conf/valias"
-      #"regexp:/etc/sympa/virtual_alias"
+
+    # Filled by the postfix/*.nix
+    virtual_mailbox_domains = [];
+    # Completed by the postfix/*.nix
+    virtual_mailbox_maps = [
+      "hash:/etc/postfix/virtual"
     ];
-    #virtual_uid_maps = "static:5000";
-    #virtual_gid_maps = "static:5000";
-    #virtual_mailbox_base = dovecot2.mailDir;
-    virtual_mailbox_domains = [ networking.domain ] ++ networking.domainAliases;
-    #virtual_mailbox_maps = "hash:/etc/postfix/virtual_mailbox_maps";
     virtual_transport = "lmtp:unix:private/dovecot-lmtp";
+
+    # There is no fallback
+    fallback_transport = "";
+  };
+  virtualMapType = "hash";
+  masterConfig =
+    let
+      mkVal = value:
+        if lib.isList value
+        then concatStringsSep "," value
+        else
+          if value == true then "yes"
+          else if value == false then "no"
+          else toString value;
+      mkKeyVal = opt: val: [ "-o" (opt + "=" + mkVal val) ];
+      mkArgs = args: lib.concatLists (lib.mapAttrsToList mkKeyVal args);
+    in {
+    pickup = {
+      args = mkArgs {
+        cleanup_service_name = "submissions-header-cleanup";
+      };
+    };
+    # Implicit TLS on port 465
+    # https://tools.ietf.org/html/rfc8314#section-3.3
+    submissions = {
+      type = "inet";
+      private = false;
+      command = "smtpd";
+      args = mkArgs {
+        syslog_name = "postfix/submissions";
+        # Implicit TLS, not STARTTLS
+        smtpd_tls_wrappermode = true;
+        smtpd_tls_mandatory_protocols = [
+          "TLSv1.3"
+          # K-9 Mail 5.600 still requires this..
+          "TLSv1.2"
+        ];
+        milter_macro_daemon_name = "ORIGINATING";
+        smtpd_relay_restrictions = [
+          # SASL authorizes to send to the world
+          "permit_sasl_authenticated"
+          "reject"
+        ];
+        smtpd_sasl_auth_enable = true;
+        smtpd_sasl_type = "dovecot";
+        smtpd_sasl_path = "private/auth";
+        smtpd_sasl_local_domain = "";
+        # Offer SASL authentication only after a TLS-encrypted session has been established
+        smtpd_tls_auth_only = true;
+        smtpd_sasl_tls_security_options = [ "noanonymous" ];
+        # Do not put SASL logins in mail headers
+        smtpd_sasl_authenticated_header = false;
+        # Who cares about (old) Outlook
+        broken_sasl_auth_clients = false;
+        smtpd_sender_restrictions = [
+          "reject_non_fqdn_sender"
+          # Check that the SASL user is using only its own
+          # mail addresses on the envelope, as indicated in smtpd_sender_login_maps
+          "reject_sender_login_mismatch"
+          "permit"
+        ];
+        # No X.509 certificates for users, for now
+        smtpd_tls_ask_ccert = false;
+        smtpd_tls_ccert_verifydepth = 0;
+        smtpd_tls_loglevel = 1;
+        smtpd_tls_req_ccert = false;
+        cleanup_service_name = "submissions-header-cleanup";
+      };
+    };
+    submissions-header-cleanup = {
+      type = "unix";
+      private = false;
+      maxproc = 0;
+      command = "cleanup";
+      args = mkArgs {
+        header_checks = "pcre:" + pkgs.writeText "submission_header_cleanup_rules" ''
+          # Removes sensitive headers from mails handed in via the submission or smtps port.
+          # See https://thomas-leister.de/mailserver-debian-stretch/
+          # Uses "pcre" style regex.
+
+          /^Received:/         IGNORE
+          /^User-Agent:/       IGNORE
+          /^X-Enigmail:/       IGNORE
+          /^X-Mailer:/         IGNORE
+          /^X-Originating-IP:/ IGNORE
+        '';
+      };
+    };
   };
-  #submissionOptions = {
-  #  smtpd_tls_security_level     = "encrypt";
-  #  smtpd_sasl_auth_enable       = "yes";
-  #  smtpd_sasl_type              = "dovecot";
-  #  smtpd_sasl_path              = "private/auth";
-  #  smtpd_sasl_security_options  = "noanonymous";
-  #  smtpd_sasl_local_domain      = "$myhostname";
-  #  smtpd_client_restrictions    = "permit_sasl_authenticated,reject";
-  #  smtpd_sender_login_maps      = "hash:/etc/postfix/vaccounts";
-  #  smtpd_sender_restrictions    = "reject_sender_login_mismatch";
-  #  smtpd_recipient_restrictions = "reject_non_fqdn_recipient,reject_unknown_recipient_domain,permit_sasl_authenticated,reject";
-  #  cleanup_service_name         = "submission-header-cleanup";
-  #};
   extraMasterConf = ''
     #spfcheck    unix  -        n       n       -        0        spawn
     #  user=policyd-spf argv=/usr/sbin/postfix-policyd-spf-perl
-    465         inet  n        -       -       -        -        smtpd
-      -o milter_macro_daemon_name=ORIGINATING
-      -o smtpd_client_restrictions=permit_sasl_authenticated,reject
-      -o smtpd_recipient_restrictions=reject_non_fqdn_recipient,reject_unknown_recipient_domain,permit_sasl_authenticated,reject
-      -o smtpd_sasl_auth_enable=yes
-      -o smtpd_sasl_local_domain=$myhostname
-      -o smtpd_sasl_path=private/auth
-      -o smtpd_sasl_security_options=noanonymous
-      -o smtpd_sasl_type=dovecot
-      -o smtpd_tls_ask_ccert=no
-      -o smtpd_tls_auth_only=yes
-      -o smtpd_tls_ccert_verifydepth=0
-      -o smtpd_tls_loglevel=1
-      -o smtpd_tls_req_ccert=no
-      -o smtpd_tls_security_level=encrypt
-      -o smtpd_tls_wrappermode=yes
     # -o smtpd_sender_restrictions=reject_sender_login_mismatch
     # -o smtpd_sender_login_maps=hash:/etc/postfix/vaccounts
-    # -o cleanup_service_name=submission-header-cleanup
-    submission-header-cleanup unix n - n    -       0       cleanup
-      -o header_checks=pcre:${submissionHeaderCleanupRules}
+    # -o cleanup_service_name=submissions-header-cleanup
     #spfcheck  unix  -       n       n       -       0       spawn
     #  user=policyd-spf argv=/usr/bin/postfix-policyd-spf-perl
     #uucp      unix  -       n       n       -       -       pipe
@@ -465,4 +418,5 @@ services.postfix = {
    #noclue    unix  -       n       n       -       -       pipe
    #  flags=q user=noclue argv=/usr/local/bin/noclue-delivery ${recipient} ${sender}
 };
+};
 }