Eu tenho uma configuração Postfix/Dovecot e uso OpenLDAP como back-end de usuário/senha. Os usuários devem fazer login com seu endereço de e-mail totalmente qualificado como nome de usuário devido à hospedagem virtual e, portanto, a parte do domínio é necessária para autenticação, ou seja, os nomes de usuário têm a aparência <local-part>@<fqdn-domain>
.
No entanto, existem ataques constantes que tentam autenticar com nomes de usuário sem parte de domínio. Como isso leva a um DN inválido dentro da consulta LDAP, meus logs recebem muitas mensagens de erro devido a um DN LDAP inválido.
Existe alguma opção de configuração que permita ao Dovecot impor algumas verificações de sintaxe iniciais no nome de usuário fornecido e, se isso falhar, o Dovecot abrevia o processo de autenticação com uma resposta de negação imediata em vez de consultar o servidor LDAP e depois falhar?
A configuração LDAP no Dovecot é
uris = ldapi://%2frun%2fopenldap%2fslapd.sock
auth_bind = yes
auth_bind_userdn = uid=%n,ou=users,o=%d,dc=my-host,dc=my-domain,dc=my-tld
base = ou=users,o=%d,dc=server,dc=my-host,dc=my-domain,dc=my-tld
Como você pode ver, minha configuração LDAP usa os chamados "pontos de junção" para fornecer diferentes sub-ramos no DIT para os diferentes domínios hospedados. (A o=%d
-parte no DN.) De acordo com o Manual de configuração do Dovecot - Variáveis do usuário , %d
estará vazio se o nome de usuário não tiver nenhuma parte do domínio após o @
.
Quando um invasor tenta se autenticar com um nome de usuário incompleto, isso leva a mensagens de erro supérfluas em meus registros, como
Dec 26 16:25:54 server dovecot[24946]: auth: Error: ldap(root,187.205.80.184): ldap_bind() failed: Invalid DN syntax
Aqui, um invasor de 187.205.80.184 tentou se autenticar como usuário root
e o Dovecot tentou procurar, uid=root,ou=users,o=,dc=my-host,dc=my-domain,dc=my-tld
o que obviamente é inválido, porque não há nada depois o=
.
Desde o Dovecot v2.2.33, você pode definir um domínio padrão usando condicionais :
%{if;%d;eq;;example.com;%d}
Isso é:
if
usar condicionais%d
valor 1 para comparareq
operador : igualdade de stringexample.com
valor resultante se a condição fortrue
; quando%d
é igual a string vazia (padrão)%d
valor resultante se a condição forfalse
; quando%d
está definido (não vazio)Você pode usá-lo na configuração LDAP em vez de
%d
:Eu mesmo encontrei outra solução que não requer condicionais em variáveis e, portanto, também funciona para versões mais antigas do Dovecot. No caso específico da
%d
-variable, as seguintes diretivas de configuração resolvem o problemaA primeira linha é uma lista separada por espaços dos domínios de autenticação suportados. Dependendo do método de autenticação SASL escolhido pelo cliente, isso informa o cliente sobre os domínios de autenticação existentes. É claro que isso não impede que invasores com scripts (burros) ainda usem nomes de usuários sem uma parte de domínio. No entanto, é uma boa ideia ter essa configuração definida corretamente.
A segunda linha define o domínio padrão (ou domínio no meu caso) que o Dovecot anexa automaticamente, se o cliente não fornecer um. Aqui eu configurei para o nome inventado
nowhere.notld
. O valor realmente não importa, só deve ser diferente de qualquer domínio real.Nota final: claro, isso não impede mensagens de log sobre falhas nas tentativas de autenticação. Mas tudo bem. No entanto, evita erros fatais do LDAP devido a DNs inválidos. Em vez disso, há avisos adequados do Dovevot sobre falhas nas autenticações.