Mediante el módulo, mod_authnz_ldap, podremos autorizar el acceso a determinados sitios web en base a la pertenencia del usuario a un grupo determinado del Directorio Activo de Windows.
Para ello, dentro de las directivas <Directory> o <Location> tendremos que incluir la siguiente configuración:
Especificamos que usaremos ldap como método de autenticación:
AuthBasicProvider ldap
Las contraseñas irán en claro pero ya veremos al final del post como hacer que la comunicación sea sobre SSL para evitar «miradas indiscretas»:
AuthType Basic
Si falla el ldap no permitimos otros métodos de autenticación. Si queremos permitirlos, lo dejaremos en «off«:
AuthzLDAPAuthoritative on
Mensaje que verá el usuario al entrar en el sitio web:
AuthName "Acceso restringido"
En el proceso, podemos distinguir dos fases. En la primera de ellas (fase bind, autenticación) el cliente se conecta al servidor LDAP para lo cual necesitamos especificar unas credenciales:
AuthLDAPBindDN "CN=consultas,CN=Users,DC=midominio,DC=local" AuthLDAPBindPassword password
Además, necesitaremos especificar el atributo a buscar que, en el caso del Directorio Activo, es «sAMAccountName«:
AuthLDAPURL "ldap://dcserver.midominio.local/CN=Users,DC=midominio,DC=local?sAMAccountName?sub?(objectClass=*)"
En la fase II (compare, autorización) se intenta determinar si el usuario tiene derecho para acceder al recurso (por ejemplo, la web de administración de Nagios):
require ldap-group CN=Nagios_users,CN=Users,DC=midominio,DC=local
Por último, decimos que se use el «Distinguished Name» (DN) del usuario al comprobar si pertenece a un dominio:
AuthLDAPGroupAttributeIsDN on
Resumiendo, la configuración requerida es:
# Parámetros básicos de configuración para la autenticación contra LDAP AuthBasicProvider ldap AuthType Basic # Si falla el LDAP el usuario no se puede autentica con otros métodos (ej. htaccess) AuthzLDAPAuthoritative off AuthName "Acceso restringido" # Fase I: AUTENTICACIÓN contra LDAP AuthLDAPBindDN "CN=consultas,CN=Users,DC=midominio,DC=local" AuthLDAPBindPassword password AuthLDAPURL "ldap://dcserver.midominio.local/CN=Users,DC=midominio,DC=local?sAMAccountName?sub?(objectClass=*)" # Fase II: AUTORIZACIÓN contra LDAP AuthLDAPGroupAttributeIsDN on # Autorización a los miembros del grupo Nagios_users require ldap-group CN=backend_cert,CN=Users,DC=midominio,DC=local
LDAP sobre SSL
Para habilitar la comunicación LDAP sobre SSL, en primer lugar será necesario que el servidor Windows esté configurado para ofrecer un certificado en el puerto 636, tal como vimos en Habilitar LDAP sobre SSL con Active Directory en Windows 2003.
Subimos el certificado de la CA exportado al servidor Apache y lo dejamos, por ejemplo en:
/etc/apache2/ssl/winca.cer
Este fichero debe poder ser leído por Apache, por lo tanto ojo a los permisos, tanto de él como del directorio que lo contiene (por experiencia…).
Podemos testear que tenemos comunicación desde el servidor Apache al servidor Windows usando el cliente de openssl:
openssl s_client -connect dcserver.midominio.local:636 -CAfile /etc/apache2/ssl/winca.cer
Si la comunicación es correcta, aparte de ver el certificado ofrecido por el servidor, deberemos ver que obtenemos «Verify return code: 0 (ok)«:
SSL handshake has read 4875 bytes and written 315 bytes --- New, TLSv1/SSLv3, Cipher is RC4-MD5 Server public key is 1024 bit Compression: NONE Expansion: NONE SSL-Session: Protocol : TLSv1 Cipher : RC4-MD5 Session-ID: 16190000F8034733DCC09F44EB63398C011213CF3A918CF2C45ABBEDDF918B0F Session-ID-ctx: Master-Key: 270E0E1A4BDED85F149D7CF214A2ED647A968A7CE9F162B1C78449F06BA86E8136887AB8C06CCE14D6EE2F07B078CB0B Key-Arg : None Start Time: 1318344445 Timeout : 300 (sec) Verify return code: 0 (ok)
Para habilitar LDAPS en Apache, en la configuración global de Apache (no en un VirtualHost o un Directory) añadiremos la directiva:
LDAPTrustedGlobalCert CA_BASE64 /etc/apache2/ssl/winca.cer
y modificaremos AuthLDAPURL para que use ldaps en vez de ldap, dejándola como sigue:
AuthLDAPURL "ldaps://dcserver.midominio.local/CN=Users,DC=midominio,DC=local?sAMAccountName?sub?(objectClass=*)"
Reiniciamos Apache y ya sólo nos queda probar que funciona.
En honor al gran SuperCoco,
:wq