20.10. Autenticação LDAP #

Este método de autenticação opera de forma semelhante ao método password, exceto por usar o LDAP como método de verificação da senha. O LDAP é usado apenas para validar os pares nome de usuário/senha. Portanto, o usuário já deverá existir no banco de dados antes que o LDAP possa ser usado para autenticação.

A autenticação LDAP pode operar de dois modos. No primeiro modo, que chamaremos de modo de vinculação simples, o servidor vincula-se ao nome distinto (DN) [139] formado como prefixo nome_do_usuário sufixo. Normalmente, o parâmetro prefixo é usado para especificar cn= ou DOMAIN\ em um ambiente de diretório ativo (Active Directory). O sufixo é usado para especificar a parte restante do DN em um ambiente não-diretório ativo.

No segundo modo, que chamaremos de modo de busca e vinculação (search+bind), o servidor primeiro se vincula ao diretório LDAP com um nome de usuário e senha fixos, especificados com ldapbinddn e ldapbindpasswd, e realiza uma busca pelo usuário que está tentando se conectar ao banco de dados. Se este usuário e senha não estiver configurado, será tentada uma vinculação anônima ao diretório. A busca será realizada na subárvore em ldapbasedn, e tentará fazer uma correspondência exata do atributo especificado em ldapsearchattribute. Uma vez encontrado o usuário nesta busca, o servidor se vincula novamente ao diretório como este usuário, usando a senha especificada pelo cliente, para verificar se o login está correto. Este modo é idêntico ao usado pelos esquemas de autenticação LDAP em outros softwares, como Apache mod_authnz_ldap e pam_ldap. Este método permite uma flexibilidade significativamente maior em relação à localização dos objetos de usuário no diretório, mas irá resultar na criação de duas conexões separadas com o servidor LDAP.

As seguintes opções de configuração são usadas nos dois modos:

ldapserver

Nomes ou endereços IP de servidores LDAP aos quais se conectar. Podem ser especificados vários servidores separados por espaços.

ldapport

Número da porta no servidor LDAP a qual se conectar. Se não for especificada nenhuma porta, será usada a configuração de porta padrão da biblioteca LDAP.

ldapscheme

Definido como ldaps para usar LDAPS. Esta é uma forma fora do padrão de usar LDAP sobre SSL, com suporte por algumas implementações do servidor LDAP. Veja também a opção ldaptls para uma alternativa.

ldaptls

Definido como 1 para fazer a conexão entre o PostgreSQL e o servidor LDAP usar a encriptação TLS. Usa a operação StartTLS do RFC 4513 [140]. Veja também a opção ldapscheme para uma alternativa.

Note-se que usar ldapscheme ou ldaptls apenas encripta o tráfego entre o servidor PostgreSQL e o servidor LDAP. A conexão entre o servidor PostgreSQL e o cliente PostgreSQL ainda não será encriptada, a menos que também seja usado SSL.

As opções a seguir são usadas apenas no modo de vinculação simples:

ldapprefix

Cadeia de caracteres a ser prefixada ao nome do usuário ao formar o DN para autenticação por vinculação simples.

ldapsuffix

Cadeia de caracteres a ser anexada ao nome do usuário ao formar o DN para autenticação por vinculação simples.

As seguintes opções são usadas apenas no modo busca e vinculação (search+bind)

ldapbasedn

DN raiz para iniciar a busca pelo usuário, ao fazer a autenticação por busca e vinculação.

ldapbinddn

DN do usuário para vincular ao diretório para executar a busca, ao fazer a autenticação por busca e vinculação.

ldapbindpasswd

Senha para o usuário vincular ao diretório para realizar a busca, ao fazer a autenticação por busca e vinculação.

ldapsearchattribute

Atributo para corresponder ao nome de usuário na busca, ao fazer a autenticação por busca e vinculação. Se não for especificado nenhum atributo, será usado o atributo uid.

ldapsearchfilter

Filtro de busca a ser usado ao fazer a autenticação por busca e vinculação. As ocorrências de $username serão substituídas pelo nome do usuário. Permite filtros de busca mais flexíveis do que ldapsearchattribute.

A seguinte opção pode ser usada como uma forma alternativa de escrever algumas das opções LDAP acima de maneira mais compacta e padronizada:

ldapurl

Uma URL RFC 4516. O formato é:

ldap[s]://hospedeiro[:porta]/dn_base[?[atributo][?[escopo][?[filtro]]]]

O escopo deve ser um entre base, one e sub, e normalmente é este último. (O padrão é base, que normalmente não é útil nesta aplicação.) O atributo pode especificar um único atributo, caso em que é usado como valor para ldapsearchattribute. Se o atributo estiver vazio, então o filtro poderá ser usado como valor para ldapsearchfilter.

O esquema da URL ldaps escolhe o método LDAPS para fazer conexões LDAP sobre SSL, equivalente a usar ldapscheme=ldaps. Para usar conexões LDAP encriptadas usando a operação StartTLS, deve-se usar o esquema de URL normal ldap, e especificar a opção ldaptls além de ldapurl.

Para vinculações não anônimas, ldapbinddn e ldapbindpasswd devem ser especificados como opções separadas.

No momento, as URLs LDAP têm suporte apenas no OpenLDAP, não no Windows.

É errado misturar opções de configuração para vinculação simples com opções para busca e vinculação. Para usar ldapurl no modo de vinculação simples, a URL não deve conter um basedn ou elementos de consulta.

Ao usar o modo busca e vinculação, a busca pode ser realizada usando um único atributo especificado com ldapsearchattribute, ou usando um filtro de busca personalizado especificado com ldapsearchfilter. Especificar ldapsearchattribute=foo equivale a especificar ldapsearchfilter="(foo=$username)". Se não for especificada nenhuma opção, o padrão será ldapsearchattribute=uid.

Se o PostgreSQL foi construído com OpenLDAP como a biblioteca cliente LDAP, a configuração ldapserver poderá ser omitida. Neste caso, uma lista de nomes de hospedeiro e portas é buscada por meio de registros RFC 2782 DNS SRV. O nome _ldap._tcp.DOMAIN é buscado, onde DOMAIN é extraído de ldapbasedn.

A seguir está um exemplo de configuração LDAP de vinculação simples:

host ... ldap ldapserver=ldap.example.net ↵
              ldapprefix="cn=" ↵
              ldapsuffix=", ↵
              dc=example, ↵
              dc=net"

Quando uma conexão com o servidor de banco de dados como usuário do banco de dados someuser é solicitada, o PostgreSQL tentará se vincular ao servidor LDAP usando o DN cn=someuser, dc=example, dc=net e a senha fornecida pelo cliente. Se esta conexão for bem-sucedida, o acesso ao banco de dados será concedido.

A seguir está uma configuração vinculação simples diferente, que usa o esquema LDAPS e um número de porta personalizado, escrito como uma URL:

host ... ldap ldapurl="ldaps://ldap.example.net:49151" ↵
              ldapprefix="cn=" ↵
              ldapsuffix=", ↵
              dc=example, ↵
              dc=net"

Isto é um pouco mais compacto do que especificar ldapserver, ldapscheme e ldapport separadamente.

A seguir está um exemplo para configuração LDAP de busca e vinculação:

host ... ldap ldapserver=ldap.example.net ↵
              ldapbasedn="dc=example, ↵
              dc=net" ↵
              ldapsearchattribute=uid

Quando é solicitada uma conexão com o servidor de banco de dados, como o usuário do banco de dados someuser, o PostgreSQL irá tentar se vincular anonimamente (já que ldapbinddn não foi especificado) ao servidor LDAP, e executar uma busca por (uid=someuser) sob o DN base especificado. Se for encontrada uma entrada, então se tentará fazer uma vinculação usando as informações encontradas e a senha fornecida pelo cliente. Se esta segunda vinculação for bem-sucedida, será concedido o acesso ao banco de dados.

A seguir está um exemplo para configuração LDAP de busca e vinculação:

host ... ldap ldapurl="ldap://ldap.example.net/dc=example,dc=net?uid?sub"

LDAP usam o mesmo formato de URL, então será mais fácil compartilhar a configuração.

A seguir está um exemplo para configuração de busca e vinculação que usa ldapsearchfilter em vez de ldapsearchattribute, para permitir autenticação por ID de usuário ou endereço de e-mail:

host ... ldap ldapserver=ldap.example.net ↵
              ldapbasedn="dc=example, ↵
              dc=net" ↵
              ldapsearchfilter="(|(uid=$username)(mail=$username))"

A seguir está um exemplo para configuração de busca e vinculação que usa a descoberta de DNS SRV para encontrar o(s) nome(s) do hospedeiro e porta(s) para o serviço LDAP para o nome de domínio example.net:

host ... ldap ldapbasedn="dc=example,dc=net"

Dica

Como o LDAP geralmente usa vírgulas e espaços para separar as diferentes partes do DN, geralmente é necessário usar valores de parâmetro entre aspas ao configurar as opções do LDAP, conforme mostrado nos exemplos.



[139] Distinguished Name (DN): Semelhante a um endereço, o nome distinto é uma nomenclatura usada para descrever onde o objeto pode ser encontrado no diretório. What Is LDAP (Lightweight Directory Access Protocol)? (N. T.)

[140] RFC 4513: Este documento descreve os métodos de autenticação e os mecanismos de segurança do Lightweight Directory Access Protocol (LDAP), e detalha o estabelecimento da Transport Layer Security (TLS) usando a operação StartTLS. (N. T.)