20.10. Autenticación LDAP #

Este método de autenticación funciona de forma similar a password, salvo que utiliza LDAP como método de verificación de la contraseña. LDAP se emplea únicamente para validar las parejas de nombre de usuario y contraseña. Por lo tanto, el usuario ya debe existir en la base de datos antes de poder utilizar LDAP para la autenticación.

La autenticación LDAP puede funcionar en dos modos. En el primer modo, que llamaremos modo de vinculación simple (simple bind mode), el servidor se vinculará al nombre distinguido (DN) construido como prefix username suffix. Normalmente, el parámetro prefix se utiliza para especificar cn=, o bien DOMAIN\ en un entorno Active Directory. El parámetro suffix se utiliza para especificar la parte restante del DN en un entorno que no sea de Active Directory.

En el segundo modo, que llamaremos modo search+bind, el servidor primero se vincula al directorio LDAP con un nombre de usuario y una contraseña fijos, especificados con ldapbinddn y ldapbindpasswd, y realiza una búsqueda del usuario que intenta iniciar sesión en la base de datos. Si no se configura ningún usuario y contraseña, se intentará un enlace anónimo con el directorio. La búsqueda se realizará sobre el subárbol en ldapbasedn, e intentará hacer una coincidencia exacta del atributo especificado en ldapsearchattribute. Una vez encontrado el usuario en esta búsqueda, el servidor se vuelve a vincular al directorio como este usuario, utilizando la contraseña especificada por el cliente, para verificar que el inicio de sesión es correcto. Este modo es el mismo que el utilizado por los esquemas de autenticación LDAP en otros programas de software, como Apache mod_authnz_ldap y pam_ldap. Este método permite una flexibilidad significativamente mayor en cuanto a la ubicación de los objetos de usuario en el directorio, pero provocará que se realicen dos solicitudes adicionales al servidor LDAP.

Las siguientes opciones de configuración se utilizan en ambos modos:

ldapserver

Nombres o direcciones IP de los servidores LDAP a los que conectarse. Se pueden especificar varios servidores, separados por espacios.

ldapport

Número de puerto del servidor LDAP al que conectarse. Si no se especifica ningún puerto, se utilizará la configuración del puerto por defecto de la biblioteca LDAP.

ldapscheme

Establécelo en ldaps para utilizar LDAPS. Esta es una forma no estándar de utilizar LDAP sobre SSL, compatible con algunas implementaciones de servidores LDAP. Consulta también la opción ldaptls como alternativa.

ldaptls

Establécelo en 1 para que la conexión entre PostgreSQL y el servidor LDAP utilice cifrado TLS. Esto emplea la operación StartTLS según la norma RFC 4513. Consulta también la opción ldapscheme como alternativa.

Ten en cuenta que el uso de ldapscheme o ldaptls solo cifra el tráfico entre el servidor PostgreSQL y el servidor LDAP. La conexión entre el servidor PostgreSQL y el cliente PostgreSQL seguirá sin cifrar a menos que también se utilice SSL en ella.

Las siguientes opciones se utilizan únicamente en el modo de vinculación simple (simple bind):

ldapprefix

Cadena que se antepondrá al nombre de usuario al formar el DN con el que vincularse, cuando se realice la autenticación mediante vinculación simple.

ldapsuffix

Cadena que se añadirá al nombre de usuario al formar el DN con el que vincularse, cuando se realice la autenticación mediante vinculación simple.

Las siguientes opciones se utilizan únicamente en el modo search+bind:

ldapbasedn

DN raíz en el que comenzar la búsqueda del usuario, cuando se realiza la autenticación search+bind.

ldapbinddn

DN del usuario con el que vincularse al directorio para realizar la búsqueda cuando se hace la autenticación search+bind.

ldapbindpasswd

Contraseña del usuario con el que vincularse al directorio para realizar la búsqueda cuando se hace la autenticación search+bind.

ldapsearchattribute

Atributo que debe coincidir con el nombre de usuario en la búsqueda cuando se realiza la autenticación search+bind. Si no se especifica ningún atributo, se utilizará el atributo uid.

ldapsearchfilter

El filtro de búsqueda a utilizar al realizar la autenticación search+bind. Las apariciones de $username se reemplazarán por el nombre de usuario. Esto permite filtros de búsqueda más flexibles que ldapsearchattribute.

La siguiente opción puede utilizarse como forma alternativa de escribir algunas de las opciones LDAP anteriores en un formato más compacto y estándar:

ldapurl

Una URL LDAP de la norma RFC 4516. El formato es:

ldap[s]://host[:port]/basedn[?[attribute][?[scope][?[filter]]]]

El scope debe ser uno de entre base, one o sub, siendo normalmente este último. (El valor por defecto es base, que normalmente no es útil en esta aplicación). El parámetro attribute puede designar un único atributo, en cuyo caso se utiliza como valor para ldapsearchattribute. Si attribute está vacío, entonces se puede utilizar filter como valor para ldapsearchfilter.

El esquema de URL ldaps elige el método LDAPS para realizar conexiones LDAP sobre SSL, equivalente a utilizar ldapscheme=ldaps. Para utilizar conexiones LDAP cifradas empleando la operación StartTLS, utiliza el esquema de URL normal ldap y especifica la opción ldaptls además de ldapurl.

Para enlaces no anónimos, deben especificarse ldapbinddn y ldapbindpasswd como opciones independientes.

Actualmente, las URL de LDAP solo son compatibles con OpenLDAP, no con Windows.

Es un error mezclar opciones de configuración para vinculación simple con opciones para search+bind. Para utilizar ldapurl en el modo de vinculación simple, la URL no debe contener un basedn ni elementos de consulta.

Cuando se utiliza el modo search+bind, la búsqueda se puede realizar utilizando un único atributo especificado con ldapsearchattribute, o utilizando un filtro de búsqueda personalizado especificado con ldapsearchfilter. Especificar ldapsearchattribute=foo equivale a especificar ldapsearchfilter="(foo=$username)". Si no se especifica ninguna de las dos opciones, el valor por defecto es ldapsearchattribute=uid.

Si PostgreSQL se compiló con OpenLDAP como biblioteca cliente LDAP, se puede omitir el ajuste ldapserver. En ese caso, se busca una lista de nombres de host y puertos a través de los registros DNS SRV de la norma RFC 2782. Se busca el nombre _ldap._tcp.DOMAIN, donde DOMAIN se extrae de ldapbasedn.

Aquí tienes un ejemplo de una configuración LDAP de vinculación simple (simple-bind):

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

Cuando se solicita una conexión al servidor de base de datos como usuario de base de datos someuser, PostgreSQL intentará vincularse al servidor LDAP utilizando el DN cn=someuser, dc=example, dc=net y la contraseña proporcionada por el cliente. Si esa conexión tiene éxito, se concede el acceso a la base de datos.

Aquí tienes otra configuración de vinculación simple que utiliza el esquema LDAPS y un número de puerto personalizado, escrita como una URL:

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

Esto es ligeramente más compacto que especificar por separado ldapserver, ldapscheme y ldapport.

Aquí tienes un ejemplo de configuración de search+bind:

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

Cuando se solicita una conexión al servidor de base de datos como usuario de base de datos someuser, PostgreSQL intentará vincularse de forma anónima (ya que no se especificó ldapbinddn) al servidor LDAP y realizará una búsqueda de (uid=someuser) bajo el DN base especificado. Si se encuentra una entrada, intentará entonces vincularse utilizando la información encontrada y la contraseña suministrada por el cliente. Si este segundo enlace tiene éxito, se concede el acceso a la base de datos.

Aquí tienes la misma configuración search+bind escrita como una URL:

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

Otros programas de software que admiten la autenticación con LDAP utilizan el mismo formato de URL, por lo que resultará más fácil compartir la configuración.

Aquí tienes un ejemplo de una configuración search+bind que utiliza ldapsearchfilter en lugar de ldapsearchattribute para permitir la autenticación mediante el ID de usuario o la dirección de correo electrónico:

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

Aquí tienes un ejemplo de una configuración search+bind que utiliza el descubrimiento DNS SRV para encontrar los nombres de host y los puertos para el servicio LDAP para el nombre de dominio example.net:

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

Tip

Dado que LDAP utiliza a menudo comas y espacios para separar las diferentes partes de un DN, a menudo es necesario utilizar valores de parámetros entre comillas dobles al configurar las opciones de LDAP, tal como se muestra en los ejemplos.