Правильный порядок обработки ограничений postfix smtp

Правильный порядок обработки ограничений postfix smtp

У меня есть следующее ограничение smtp в файле конфигурации postfix:

smtpd_sender_restrictions = permit_sasl_authenticated, check_policy_service inet:127.0.0.1:10031,permit_mynetworks, warn_if_reject reject_non_fqdn_sender, reject_unauth_pipelining, reject_authenticated_sender_login_mismatch, reject_unknown_sender_domain

Насколько мне известно, если permit_sasl_authenticatedговорится, что конкретный пользователь аутентифицирован, то остальные ограничения не проверяются?

Что делать, если я хочу убедиться, что permit_sasl_authenticatedи check_policy_service inet:127.0.0.1:10031если они оба скажут «да», только тогда электронное письмо должно быть передано, в противном случае — нет?

На самом деле я пытаюсь настроить cluebringer, но возникает проблема, он пишет Sender address rejected, даже после того, как отправитель правильно аутентифицирован с помощью SASL.

Вот мой postconf -nвывод:

append_dot_mydomain = no
biff = no
broken_sasl_auth_clients = yes
config_directory = /etc/postfix
disable_vrfy_command = yes
inet_interfaces = 91.91.98.67, localhost
mailbox_command = procmail -a "$EXTENSION"
mailbox_size_limit = 0
mydestination = mauth.fdomain.co.uk, localhost
myhostname = mauth.fdomain.co.uk
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
myorigin = /etc/mailname
readme_directory = no
recipient_delimiter = +
relay_domains = mysql:/etc/postfix/relaydomains.cf
relayhost =
smtp_bind_address = 91.91.9.7
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = mysql:/etc/postfix/authsmtp.conf
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_banner = $myhostname Freezone Internet ESMTP
smtpd_client_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_rbl_client sbl.spamhaus.org, reject_rbl_client blackholes.easynet.nl, reject_rbl_client bl.spamcop.net
smtpd_data_restrictions = permit_sasl_authenticated, reject_unauth_pipelining
smtpd_delay_reject = yes
smtpd_end_of_data_restrictions = check_policy_service inet:127.0.0.1:10031
smtpd_helo_required = yes
smtpd_helo_restrictions = permit_sasl_authenticated, permit_mynetworks, warn_if_reject reject_non_fqdn_hostname, reject_invalid_hostname, permit
smtpd_recipient_restrictions = permit_sasl_authenticated, check_policy_service inet:127.0.0.1:10031, permit_mynetworks, reject_unauth_destination
smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain =
smtpd_sasl_security_options = noanonymous
smtpd_sender_restrictions = permit_sasl_authenticated, check_policy_service inet:127.0.0.1:10031,permit_mynetworks, warn_if_reject reject_non_fqdn_sender, reject_unauth_pipelining, reject_authenticated_sender_login_mismatch, reject_unknown_sender_domain
smtpd_tls_CAfile = /etc/postfix/ssl/freezonewc.ca
smtpd_tls_auth_only = no
smtpd_tls_cert_file = /etc/postfix/ssl/freezonewc.crt
smtpd_tls_key_file = /etc/postfix/ssl/freezonewc.key
smtpd_tls_loglevel = 2
smtpd_tls_received_header = yes
smtpd_tls_security_level = may
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtpd_tls_session_cache_timeout = 3600s
smtpd_use_tls = yes
transport_maps = mysql:/etc/postfix/transport.cf
unknown_local_recipient_reject_code = 450

решение1

Честно говоря, ваши ограничения сейчас немного запутаны. Список рассылки postfix-users обычно рекомендует собирать все ограничения в smtpd_recipient_restrictionsили smtpd_relay_restrictions(только Postfix 2.10). Причина в том, что это улучшает читаемость и не имеет большого значения для smtpd_delay_reject=yes.

Кроме того, служба политики редко должна отвечать утверждением accept/ok, а скорее DUNNO. Так что в вашем случае сначала запросить службу политики, дать ей возможность сказать REJECT, а затем проверить SASL, кажется лучшим способом, если только ваша служба политики не возвращает OK в некоторых случаях.

Не зная ни точной сути вашей страховой услуги, ни ваших требований, я бы начал примерно с этого:

smtpd_relay_restrictions =
  # subject even authenticated users and trusted networks
  # to the policy check
  check_policy_service inet:127.0.0.1:10031
  permit_mynetworks
  reject_unknown_sender_domain
  permit_sasl_authenticated
  defer_unauth_destination

smtpd_recipient_restrictions =
  permit_mynetworks
  permit_sasl_authenticated
  # we exclude our networks and SASL authenticated users
  # from all further checks.
  # since I don't know if the policy service is relevant
  # for unauthenticated mail, I commented it out here
  # check_policy_service inet:127.0.0.1:10031
  warn_if_reject reject_non_fqdn_hostname
  warn_if_reject reject_non_fqdn_sender
  reject_invalid_hostname
  reject_unknown_sender_domain

smtpd_data_restrictions = reject_unauth_pipelining

Некоторые предостережения см. в комментариях к моему фрагменту конфигурации.

решение2

Насколько мне известно, если permit_sasl_authenticated говорит, что конкретный пользователь аутентифицирован, то остальные ограничения не проверяются.

Вы правы, но только в текущих ограничениях smtpd_xxx_restrictions

Просто удалите permit_sasl_authenticated из smtpd_sender_restrictions и перенесите все проверки в службу политик.

smtpd_sender_restrictions = check_policy_service inet:127.0.0.1:10031, ...

Будут доступны следующие варианты:

sasl_method
sasl_username
sasl_sender

Эти атрибуты будут пустыми в случае отсутствия аутентификации SASL. На логическом уровне это может быть что-то вроде следующего

if [ policy_service_return_code == OK && sasl_username not empty ]
   return OK
else
   return REJECT

Связанный контент