Страница 1 из 1

SMTP аутентификация и Outlook Express

Добавлено: 2010-03-26 15:38:01
blade_007
Добрый день.

Решил запретить внешним пользователям авторизоваться по нешифрованному каналу или без использования cram-md5.
Написал аутентификатор

Код: Выделить всё

check_auth: 
 
.ifdef CERTNAME 
#  accept hosts          =  +auth_over_tls_hosts 
    accept 
        encrypted      = * 
        endpass
        condition = ${if eq {${uc:$smtp_command_argument}}{CRAM-MD5}{yes}{no}} 
        message        = STARTTLS required before AUTH 
.endif 
 
    deny 
        message = DENY: Encrytped connection for smtp authentication mandatory. \
          Please enable TLS/SSL support in your mailclient in order to relay to this host.
Сегодня заметил интересную вещь при аутентификации с помощью Outlook Express с параметрами без tls/ssl. Письмо отправляется без шифрования и без использования tls. Может я чего не понимаю.

Код: Выделить всё

14:30:14  5851 SMTP<< AUTH LOGIN
14:30:14  5851 using ACL "check_auth"
14:30:14  5851 processing "accept"
14:30:14  5851 check encrypted = *
14:30:14  5851 accept: condition test failed
14:30:14  5851 processing "deny"
14:30:14  5851 deny: condition test succeeded
14:30:14  5851 SMTP>> 503-DENY: Encrytped connection for smtp authentication mandatory. Please enable
14:30:14  5851 SMTP>> 503 TLS/SSL support in your mailclient in order to relay to this host.
14:30:14  5851 LOG: MAIN REJECT
14:30:14  5851   H=v****-dc02.********com [172.27.1.2]:1236 I=[10.1.16.119]:25 rejected AUTH LOGIN: DENY: Encrytped connection for smtp authentication mandatory. Please enable TLS/SSL support in your mailclient in order to relay to this host.
14:30:14  5851 SMTP<< MAIL FROM: <jack@**********>
14:30:14  5851 using ACL "check_mail"
14:30:14  5851 processing "accept"
14:30:14  5851 accept: condition test succeeded
14:30:14  5851 SMTP>> 250 OK
14:30:14  5851 SMTP<< RCPT TO: <jack@************>
Попробовал аутентифицироваться с помощью thunderbird с параметрами (без tls и без cram-md5)

Лог thunderbird3, по которому видно что на условии DENY дальнейшая обработка прерывается

Код: Выделить всё

14:22:24  5813 SMTP<< AUTH PLAIN AGphY2tAYmFkbWx0ZC5kbi51YQBBZG1pbl9BMQ==
14:22:24  5813 using ACL "check_auth"
14:22:24  5813 processing "accept"
14:22:24  5813 check encrypted = *
14:22:24  5813 accept: condition test failed
14:22:24  5813 processing "deny"
14:22:24  5813 deny: condition test succeeded
14:22:24  5813 SMTP>> 503-DENY: Encrytped connection for smtp authentication mandatory. Please enable
14:22:24  5813 SMTP>> 503 TLS/SSL support in your mailclient in order to relay to this host.
14:22:24  5813 LOG: MAIN REJECT
14:22:24  5813   H=v**-dc02.****com [172.27.1.2]:1221 I=[10.1.16.119]:25 rejected AUTH PLAIN AGphY2tAYmFkbWx0ZC5kbi51YQBBZG1pbl9BMQ==: DENY: Encrytped connection for smtp authentication mandatory. Please enable TLS/SSL support in your mailclient in order to relay to this host.
14:22:24  5813 SMTP<< AUTH LOGIN
14:22:24  5813 host in smtp_accept_max_nonmail_hosts? yes (matched "*")
14:22:24  5813 using ACL "check_auth"
14:22:24  5813 processing "accept"
14:22:24  5813 check encrypted = *
14:22:24  5813 accept: condition test failed
14:22:24  5813 processing "deny"
14:22:24  5813 deny: condition test succeeded
14:22:24  5813 SMTP>> 503-DENY: Encrytped connection for smtp authentication mandatory. Please enable
14:22:24  5813 SMTP>> 503 TLS/SSL support in your mailclient in order to relay to this host.
14:22:24  5813 LOG: MAIN REJECT
14:22:24  5813   H=v***-dc02.*********com [172.27.1.2]:1221 I=[10.1.16.119]:25 rejected AUTH LOGIN: DENY: Encrytped connection for smtp authentication mandatory. Please enable TLS/SSL support in your mailclient in order to relay to this host.
Сертификаты и ключи сгенерированы и при их использовании все проходит на "ура" и в Thunderbird3, и в Outlook Express.
Вопрос как бы побороть этот Outlook Express. Если есть идеи - wellcom.

Re: SMTP аутентификация и Outlook Express

Добавлено: 2010-03-26 16:45:41
blade_007
Взято из документации:

33. SMTP-аутентификация

"Если аутентификация неудачна, клиент может отключиться, или может попробовать другой аутентификационный механизм, или может попробовать передать почту по неаутентифицированному соединению."

38. Шифрование соединений с использованием TLS/SSL

"Когда exim собран с поддержкой TLS, он извещает клиентские хосты, совпадающие с “tls_advertise_hosts” о доступности команды STARTTLS, но не какие-либо другие хосты. Дефолтовое значение этой опции - незадано, что означает, что о STARTTLS никто не извещается. Такое значение по умолчанию выбрано поскольку вы должны привести в порядок некоторые другие опции, чтобы сделать доступным TLS, и, также, это разумно для систем, которые хотят использовать TLS лишь в роли клиента.
Если клиент выдаёт команду STARTTLS, и на сервере существует какая-то конфигурационная проблема, команда отклоняется с ошибкой 454. Если клиент упорствует в попытках подавать команды SMTP, все они, кроме QUIT, отклняются с ошибкой:
554 Security failure"

Хм, возможно это багофича Outlook Express, а может и я чего-то пока не понял.
Как бы запретить таким клиентам отправку сообщения?

Re: SMTP аутентификация и Outlook Express

Добавлено: 2010-03-26 20:48:59
dikens3
Да писал я уже, что вы требуете ТОЛЬКО аутентификацию по TLS.

Заблокируйте, в чём проблема то?

Re: SMTP аутентификация и Outlook Express

Добавлено: 2010-03-27 13:12:09
blade_007
А можно более подробно?

Мне необходимо извещать о возможности аутентификации (приглашение AUTH) с ЛЮБОГО IP, при этом пользователи локальной сети (список localadds) может как использовать, так и не использовать TLS, но аутентифицироваться ОБЯЗАН. Остальные пользователи (не из локальной сети) должны использовать шифрованное соединение ЛИБО аутентификатор CRAM-MD5.
В моем случае OUtlook Express пытается отправить сообщение сначала попытавшись авторизоваться по LOGIN, но правила (encrypted=* и условие об CRAM_MD5 аутентификации) запрещают ему авторизоваться и клиент далее пытается отправить без аутентификации сообщение (для пользователей домена ему это будет позволено сделать, но не для остальных).

Это ход моих мыслей, если где неправ - поправьте.
Возможно такая проверка:

check_auth:

.ifdef CERTNAME
# accept hosts = +auth_over_tls_hosts
accept
encrypted = *
endpass
condition = ${if eq {${uc:$smtp_command_argument}}{CRAM-MD5}{yes}{no}}
message = STARTTLS required before AUTH
.endif

deny
message = DENY: Encrytped connection for smtp authentication mandatory. \
Please enable TLS/SSL support in your mailclient in order to relay to this host.

check_rcpt:

deny
!hosts = +localadds
sender_address_domain = +local_domains : +relay_to_domains
!authenticated=*
message = bla bla bla

Re: SMTP аутентификация и Outlook Express

Добавлено: 2010-03-27 18:18:27
dikens3
http://www.lissyara.su/doc/exim/4.62/ma ... ion/#14.13
auth_advertise_hosts main host list† *

Если сконфигурированы какие-либо серверный аутентификационные механизмы, exim информирует о них в ответе на команду HELO, лишь если хост запроса соответствует этому списку. Иначе, exim не информирует AUTH. Exim не принимает команды AUTH от клиентов, которым не сообщалось о доступности AUTH. Информированием о индивидуальных аутентификационных механизмах можно управлять использованием общей аутентификационной опции “server_advertise_condition” в индивидуальных аутентификаторах. Для дополнительных деталей смотрите раздел 33.
Определённые почтовые клиенты (например Netscape) требуют, чтобы пользователь предоставил имя пользователя и пароль для идентификации, если информируется AUTH, даже при том, что может не являться необходимым (хост может принимать сообщения от хостов из своей LAN без аутентификации, например). Опция “auth_advertise_hosts” может быть использована чтобы сделать этих клиентов более дружелюбными, путём исключения их из хостов к которым выводиться информация о AUTH.
Если вы хотите информировать о доступности AUTH лишь когда подключение зашифровано с использованием TLS, вы можете использовать тот факт, что значение этой опции раскрывается, установкой типа такой:

auth_advertise_hosts = ${if eq{$tls_cipher}{}{}{*}}

Если “$tls_cipher” пуста, сессия не шифрованная, и результат раскрытия пуст, таким образом, не соответствуя никаким хостам. Иначе, разультат раскрытия “*”, соответствующая всем хостам.
при этом пользователи локальной сети (список localadds) может как использовать, так и не использовать TLS
Начните с простого, потом усложняйте.
должны использовать шифрованное соединение ЛИБО аутентификатор CRAM-MD5
Уберите другие аутентификаторы.

Re: SMTP аутентификация и Outlook Express

Добавлено: 2010-03-30 14:49:25
blade_007
Приветствуется критика такого решения.
Логика такая: проверяется переменная auth_advertise_hosts, которая разрешает выдавать приглашение AUTH всем, затем для каждого серверного механизма аутентификации (в моем случае PLAIN, LOGIN, CRAM-MD5) проверяется server_advertise_condition. server_advertise_condition для PLAIN и LOGIN проверяет является ли хост локальным, является ли соединение с хостом шифрованным, в случае выполнения любого из условий уведомляется о соот. механизме. Уведомление о возможности аутентификации по CRAM-MD5 выдается всегда для пользователей локальной сети и поверх шифрованного соединения с хостом.
Если хост, попадающий под вышеуказанные правила, пытается авторизоваться с помощью выбранного механизма запускается check_auth, чтобы решить - принять ли команду.
Если команда отклоняется, но хост все равно пытается отправить сообщение давая команду MAIL FROM, то хост натыкается на проверку check_rcpt.

Код: Выделить всё

auth_advertise_hosts = *
hostlist localadds = 10.0.0.0/8

###########################################################
check_auth:

    accept
        hosts = +localadds
 
    accept 
        encrypted      = * 

    accept 
        condition = ${if eq {${uc:$smtp_command_argument}}{CRAM-MD5}} 

    deny 
        message = DENY: Encrytped connection for smtp authentication mandatory. \
          Please enable TLS/SSL support in your mailclient in order to relay to this host.

################################################################
check_rcpt:
...................
# собственно правило, которое срезает всех внешних отправителей, пытающихся в команде MAIL FROM указать адрес моего домена
    deny
        condition = ${if eq{$sender_address_domain}{***your_domain.ru}}
        !hosts = +localadds 
        !authenticated = * 
        message = DENY: Authentication for remote users allowed only over SSL/TSL.

# принимается почта от внешних отправителей, не пытавшихся авторизоваться и при наличие конечного получателя в моем домене
    accept
        domains        = +local_domains 
        endpass 
        message        = Unknown user 
        verify         = recipient 

# принимается почта от аутентифицировавшихся пользователей локальной сети
    accept  
        hosts  = +localadds 
        authenticated = * 
        verify         = recipient 

    deny  
        message        = Relay not permitted 
    .ifdef TEERGRUBE 
          delay          = TEERGRUBE 
    .endif

############################################################
begin authenticators:

# Для каждого типа аутентификации можно делать свои списки хостов, которым будет сообщаться о данном типе аутентификации
# AUTH PLAIN authentication method used by Netscape Messenger.
plain: 
    driver = dovecot
    public_name = PLAIN 
    server_advertise_condition = ${if or{\
        {match_ip{$sender_host_address}{iplsearch;/etc/exim/allow_auth_hosts}}\
        {!eq{$tls_cipher}{}}\
        }\
        }
    server_socket = /var/run/dovecot/auth-client 
    server_set_id = $auth1

# AUTH LOGIN authentication method used by MS Outlook.
login: 
    driver = dovecot
    public_name = LOGIN 
    server_advertise_condition = ${if or{\
        {match_ip{$sender_host_address}{iplsearch;/etc/exim/allow_auth_hosts}}\
        {!eq{$tls_cipher}{}}\
        }\
        }
    server_socket = /var/run/dovecot/auth-client 
    server_set_id = $auth1 

# AUTH CRAM-MD5 authentication method used by Eudora/TheBat!. 
# Закоментировал условие server_advertise_condition потому, как CRAM-MD5 обеспечивает достаточно надежный алгоритм хеширования пароля.
cram_md5: 
    driver = cram_md5 
    public_name = CRAM-MD5 
    server_secret = ${lookup mysql{SELECT passwd FROM users \ 
        WHERE id = '${quote_mysql:${local_part:$1}}' \ 
        AND active = 'Y'}{$value}fail} 
#    server_advertise_condition = ${if or{\
#        {match_ip{$sender_host_address}{iplsearch;/etc/exim/allow_auth_hosts}}\
#        {!eq{$tls_cipher}{}}\
#        }\
#        }
    server_set_id = $auth1
Содержимое файла /etc/exim/allow_auth_hosts

Код: Выделить всё

10.0.0.0/8

Re: SMTP аутентификация и Outlook Express

Добавлено: 2010-03-31 12:58:31
dikens3

Код: Выделить всё

# собственно правило, которое срезает всех внешних отправителей, пытающихся в команде MAIL FROM указать адрес моего домена
    deny
        condition = ${if eq{$sender_address_domain}{***your_domain.ru}}
        !hosts = +localadds
        !authenticated = *
        message = DENY: Authentication for remote users allowed only over SSL/TS
А если я аутентифицировался и указал любой е-мэйл отправитель, например director@mydomain.ru?

Или нет, лучше отправлю письмо на postmaster@mydomain.ru от имени postmaster@mydomain.ru ?

Re: SMTP аутентификация и Outlook Express

Добавлено: 2010-03-31 13:54:02
blade_007
ДО этой проверки (с deny) есть правило

Код: Выделить всё

accept
      authenticated = *
      logwrite = auth = $authenticated_id, sender_address = $sender_address, host=$sender_host_address

Re: SMTP аутентификация и Outlook Express

Добавлено: 2010-03-31 19:16:15
dikens3
blade_007 писал(а):ДО этой проверки (с deny) есть правило

Код: Выделить всё

accept
      authenticated = *
      logwrite = auth = $authenticated_id, sender_address = $sender_address, host=$sender_host_address
Ну лог есть, по факту разораться можно. Я блокирую, если левый отправной адрес указывают.