Назад | Перейти на главную страницу

Ограничение доступа отправителя Postfix - Нарушение безопасности?

Мы столкнулись с проблемами безопасности на нашем почтовом сервере и хотели бы получить совет.

История за этим

На нашем почтовом сервере (Postfix 2.9.6 + Dovecot 2.1.7) мы хотели бы иметь возможность создавать ограниченные учетные записи электронной почты. Эти учетные записи (используемые слушателями) смогут отправлять / получать электронные письма только на / из локальных доменов (по соображениям безопасности мы не хотим, чтобы они могли отправлять или получать электронные письма на другие почтовые серверы). Чтобы упростить задачу, мы создали специальный субдомен для ограниченных учетных записей электронной почты.

В нашей инфраструктуре все учетные записи электронной почты основаны на LDAP, файлы конфигурации включены ниже.

Что мы сделали

В постфиксе можно создавать правила ограничения в файле /etc/postfix/main.cf и поэтому мы добавили правила:

check_sender_access ldap:/etc/postfix/ldap_restricted_senders.cf
check_recipient_access ldap:/etc/postfix/ldap_restricted_recipients.cf

в раздел:

smtpd_recipient_restrictions

Наверняка были добавлены следующие строчки:

smtpd_restriction_classes =
  local_only,
  insiders_only

local_only = check_recipient_access ldap:/etc/postfix/ldap_virtual_domains_restrict.cf, reject
insiders_only = check_sender_access ldap:/etc/postfix/ldap_virtual_domains_restrict.cf, reject

Содержание /etc/postfix/ldap_restricted_senders.cf является:

bind = yes
bind_dn = uid=postfix,ou=service,dc=example,dc=com
bind_pw = *******
server_host = ldap://127.0.0.1:389
search_base = ou=domain,dc=example,dc=com
query_filter = (&(ObjectClass=DNSDomain)(dc=%s))
result_attribute = description

Это возвращает "ok", если домену разрешено отправлять электронные письма за пределы домена.


Содержание /etc/postfix/ldap_restricted_recipients.cf является:

bind = yes
bind_dn = uid=postfix,ou=service,dc=example,dc=com
bind_pw = ******
server_host = ldap://127.0.0.1:389
search_base = ou=domain,dc=example,dc=com
query_filter = (&(description=local_only)(dc=%s))
result_attribute = description
result_filter = insiders_only

Это возвращает "insiders_only", если домен доступен только локальным доменам.


Содержание /etc/postfix/ldap_virtual_domains_restrict.cf является:

bind = yes
bind_dn = uid=postfix,ou=service,dc=example,dc=com
bind_pw = ******
server_host = ldap://127.0.0.1:389
search_base = ou=domain,dc=example,dc=com
query_filter = (&(ObjectClass=dNSDomain)(dc=%s))
result_attribute = dc
result_filter = OK

Это возвращает «ОК», когда домен является локальным (может отправлять электронные письма в ограниченный поддомен).


Для большей точности постфикс smtpd_recipient_restrictions раздел содержит:

smtpd_recipient_restrictions =
  permit_mynetworks,
  reject_sender_login_mismatch
  check_sender_access ldap:/etc/postfix/ldap_restricted_senders.cf
  check_recipient_access ldap:/etc/postfix/ldap_restricted_recipients.cf
  permit_sasl_authenticated,
  reject_non_fqdn_hostname,
  reject_non_fqdn_sender,
  reject_non_fqdn_recipient,
  reject_unauth_destination,
  reject_unauth_pipelining,
  reject_invalid_hostname,
  check_policy_service unix:private/policy-spf

Это отлично работает в том смысле, что все электронные письма из поддомена могут отправлять электронные письма только в другие локальные домены и могут получать электронные письма только из локальных доменов.

НО...

Поскольку мы включили это, мы заметили, что люди могут использовать почтовый сервер для рассылки СПАМА (поэтому мы временно удалили его).

Мы заметили проблему, потому что файл журнала /var/log/mail.log содержали такие строки, как:

Jul 22 11:59:24 mail postfix/qmgr[366]: F342F42AE4: from=<mnd0gb8@example.com>, size=2171, nrcpt=11 (queue active)
Jul 22 11:59:24 mail postfix/smtp[382]: 1344D42ACC: to=<iraci@*******>, relay=127.0.0.1[127.0.0.1]:10024, delay=1197348, delays=1197334/12/0.17/2.2, dsn=2.0.0, status=sent (250 2.0.0 from MTA(smtp:[127.0.0.1]:10025): 250 2.0.0 Ok: queued as F342F42AE4)
Jul 22 11:59:24 mail postfix/smtp[382]: 1344D42ACC: to=<hugocesar_007@*******>, relay=127.0.0.1[127.0.0.1]:10024, delay=1197348, delays=1197334/12/0.17/2.2, dsn=2.0.0, status=sent (250 2.0.0 from MTA(smtp:[127.0.0.1]:10025): 250 2.0.0 Ok: queued as F342F42AE4)
Jul 22 11:59:24 mail postfix/smtp[382]: 1344D42ACC: to=<reginadanielian@*******>, relay=127.0.0.1[127.0.0.1]:10024, delay=1197348, delays=1197334/12/0.17/2.2, dsn=2.0.0, status=sent (250 2.0.0 from MTA(smtp:[127.0.0.1]:10025): 250 2.0.0 Ok: queued as F342F42AE4)
Jul 22 11:59:24 mail postfix/smtp[382]: 1344D42ACC: to=<thais_jp@*******>, relay=127.0.0.1[127.0.0.1]:10024, delay=1197348, delays=1197334/12/0.17/2.2, dsn=2.0.0, status=sent (250 2.0.0 from MTA(smtp:[127.0.0.1]:10025): 250 2.0.0 Ok: queued as F342F42AE4)
Jul 22 11:59:24 mail postfix/smtp[382]: 1344D42ACC: to=<tropicalfmcomerciais@*******>, relay=127.0.0.1[127.0.0.1]:10024, delay=1197348, delays=1197334/12/0.17/2.2, dsn=2.0.0, status=sent (250 2.0.0 from MTA(smtp:[127.0.0.1]:10025): 250 2.0.0 Ok: queued as F342F42AE4)
Jul 22 11:59:24 mail postfix/smtp[382]: 1344D42ACC: to=<valeria.x@*******>, relay=127.0.0.1[127.0.0.1]:10024, delay=1197348, delays=1197334/12/0.17/2.2, dsn=2.0.0, status=sent (250 2.0.0 from MTA(smtp:[127.0.0.1]:10025): 250 2.0.0 Ok: queued as F342F42AE4)
Jul 22 11:59:24 mail postfix/smtp[382]: 1344D42ACC: to=<veloso1071@*******>, relay=127.0.0.1[127.0.0.1]:10024, delay=1197348, delays=1197334/12/0.17/2.2, dsn=2.0.0, status=sent (250 2.0.0 from MTA(smtp:[127.0.0.1]:10025): 250 2.0.0 Ok: queued as F342F42AE4)
Jul 22 11:59:24 mail postfix/smtp[382]: 1344D42ACC: to=<termopiso@*******>, relay=127.0.0.1[127.0.0.1]:10024, delay=1197348, delays=1197334/12/0.17/2.2, dsn=2.0.0, status=sent (250 2.0.0 from MTA(smtp:[127.0.0.1]:10025): 250 2.0.0 Ok: queued as F342F42AE4)
Jul 22 11:59:24 mail postfix/smtp[382]: 1344D42ACC: to=<rafaelpm84@*******>, relay=127.0.0.1[127.0.0.1]:10024, delay=1197348, delays=1197334/12/0.17/2.2, dsn=2.0.0, status=sent (250 2.0.0 from MTA(smtp:[127.0.0.1]:10025): 250 2.0.0 Ok: queued as F342F42AE4)
Jul 22 11:59:24 mail postfix/smtp[382]: 1344D42ACC: to=<vanessyca@*******>, relay=127.0.0.1[127.0.0.1]:10024, delay=1197348, delays=1197334/12/0.17/2.2, dsn=2.0.0, status=sent (250 2.0.0 from MTA(smtp:[127.0.0.1]:10025): 250 2.0.0 Ok: queued as F342F42AE4)
Jul 22 11:59:24 mail postfix/qmgr[366]: 1344D42ACC: removed

Что мы предполагаем

Поскольку ограничение, которое мы устанавливаем, соответствует только домену (для отправителя), кто-то использовал наш сервер в качестве ретранслятора с электронными письмами, в которых отправитель был подделан для соответствия something@example.com и будет принят.

Мы собираемся изменить настройки, чтобы правило соответствовало всему электронному письму, но мы не уверены, что это предотвратит подделку.

Что вы думаете об этом? Мы что-то сделали не так? Есть ли другой способ (или функциональность) установить такое ограничение?

PS: При необходимости мы можем разместить дополнительную информацию

Поскольку ограничение, которое мы устанавливаем, соответствует только домену (для отправителя), кто-то использовал наш сервер в качестве ретранслятора с электронными письмами, где отправитель был подделан таким образом, чтобы совпадать с something@example.com и поэтому будет принят.

Да, это вызвано этим ограничением в smtpd_recipient_restrictions

check_sender_access ldap:/etc/postfix/ldap_restricted_senders.cf

Вы сказали выше, этот запрос вернет "ОК", когда отправителю будет разрешено отправлять исходящее письмо. Это означает, что постфикс разрешит отправку электронной почты и обойдет ограничение под ним.

  check_recipient_access ldap:/etc/postfix/ldap_restricted_recipients.cf
  permit_sasl_authenticated,
  reject_non_fqdn_hostname,
  reject_non_fqdn_sender,
  reject_non_fqdn_recipient,
  reject_unauth_destination,
  reject_unauth_pipelining,
  reject_invalid_hostname,
  check_policy_service unix:private/policy-spf

Возможно решение - заменить результат запроса «ОК» на «НЕЗНАЧИТЕЛЬНО». Различия между этими двумя параметрами:

  • Когда ОК, postfix завершает список проверки ограничений
  • Когда DUNNO, postfix переместится в следующий список проверки ограничений.

Смотрите также человек 5 доступ.

хорошо Подтвердите адрес и т. Д., Соответствующий образцу.

НЕ ЗНАЮ Представьте, что ключ поиска не найден. Это предотвращает попытку Postfix пробовать подстроки ключа поиска (например, имя поддомена или подсеть сетевого адреса).

Эта функция доступна в Postfix 2.0 и новее.

Для людей, заинтересованных в применении аналогичного ограничения:

Это нормально работает, только если создается дополнительный файл, например /etc/postfix/ldap_virtual_domains_restrict_access.cf со следующим содержанием

bind = yes
bind_dn = uid=postfix,ou=service,dc=example,dc=com
bind_pw = xxxxxx
server_host = ldap://127.0.0.1:389
search_base = ou=domain,dc=example,dc=com
query_filter = (&(ObjectClass=dNSDomain)(dc=%s))
result_attribute = dc
result_filter = dunno
result_format = OK

Затем в файле /etc/postfix/main.cf измените строки как:

local_only = check_recipient_access ldap:/etc/postfix/ldap_virtual_domains_restrict_access.cf, reject
insiders_only = check_sender_access ldap:/etc/postfix/ldap_virtual_domains_restrict_access.cf, reject

Таким образом, функция запроса работает нормально! В противном случае, при сопоставлении «local_only» или «insiders_only», если результатом запроса ldap является «DUNNO», то отправитель или получатель отклоняется (поскольку после следующего правила запроса будет «отклонить»).

С участием result_format = OK когда результат "DUNNO", то результат запроса ldap - "OK".

Надеюсь, это поможет другим