La autenticación más básica que podemos configurar en un Apache es el acceso mediante fichero, pero en esta entrada vamos a ver como configurar Apache para que autentique los usuarios contra un LDAP.
Las ventajas son evidentes, podemos usar un directorio centralizado de autenticación LDAP, ya sea para validarnos en aplicaciones o para acceder a los servicios web de la empresa.
Para los ejemplos se ha usado un Ubuntu 12.04, lo primero que tenemos que hacer es instalar los módulos de Apache necesarios y activarlos:
sudo aptitude install libapache2-mod-ldap-userdir
sudo a2enmod authnz_ldap
La autenticación se requiere al acceder a un directorio declarado en el virtual host de Apache, una configuración básica:
<Directory /var/www/>
AuthType Basic
AuthName "Authentication system: please insert username and password"
AuthBasicProvider ldap
AuthzLDAPAuthoritative on
AuthLDAPURL ldap://s1.test.es:389/ou=Users,dc=zentyal?uid?sub
AuthLDAPBindDN "cn=ebox,dc=zentyal"
AuthLDAPBindPassword ly3sduWefe/BDu
require valid-user
</Directory>
Esto lo que hace es:
1- Definición de proveedor de autenticación, autorización y mensaje que aparecerá en el navegador:
AuthType Basic
AuthName "Authentication system: please insert username and password" #mensaje que aparece en el navegador al solicitar crendeciales
AuthBasicProvider ldap
AuthzLDAPAuthoritative on
2- Definición de ruta de búsqueda de usuarios, con el parámetro:
AuthLDAPURL ldap://s1.test.es:389/ou=Users,dc=zentyal?uid?sub
La sintaxis de este parámetro es:
AuthLDAPURL ldap://host:port/basedn?attribute?scope?filter [NONE|SSL|TLS|STARTTLS]
Si desmenuzamos la sintaxis:
–host y port son evidentes
–basedn es la ruta LDAP donde buscar los usuarios
–attribute, define el nombre atributo que contiene el nombre del usuario (normalmente uid)
–scope, puede ser one (para buscar en un subnivel a partir del basedn) o sub (para buscar en todos los subniveles)
–filter, filtro opcional de búsqueda, por ejemplo: (&(objectClass=inetOrgPerson)(description=*#*test*))
–
, parámetro opcional definiendo el tipo de conexión, por defecto NONE.[NONE|SSL|TLS|STARTTLS]
3-Autentica contra el LDAP en cuestión, con los parámetros:
AuthLDAPBindDN "cn=ebox,dc=zentyal"
AuthLDAPBindPassword ly3sduWefe/BDu
Donde AuthLDAPBindDN, es la ruta LDAP al usuario en cuestión a autenticar para poder acceder al LDAP. Si no se define se intenta realizar de forma anónima el acceso a LDAP.
AuthLDAPBindPassword es el password del usuario apuntado por AuthLDAPBindDN.
4- Requerir usuario válido:
require valid-user
Símplemente requerimos un usuario que se haya podido validar, aunque podríamos fijar una lista de usuarios posibles o un grupo del propio LDAP al que tiene que pertenecer el usuario, por ejemplo:
require ldap-group cn=Administrators,ou=Groups,dc=zentyal
La documentación del módulo la podemos encontrar en:
http://httpd.apache.org/docs/2.2/mod/mod_authnz_ldap.html
Un ejemplo de configuración completo podría ser:
<VirtualHost *:443>
ServerAdmin webmaster@localhost
DocumentRoot /var/www
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/>
AuthType Basic
AuthName "Authentication system: please insert username and password"
AuthBasicProvider ldap
AuthzLDAPAuthoritative on
AuthLDAPURL ldap://s1.test.es:389/ou=Users,dc=zentyal?uid?sub?(&(objectClass=inetOrgPerson)(description=*#*testldap*))
AuthLDAPBindDN "cn=ebox,dc=zentyal"
AuthLDAPBindPassword ly3sduWefe/BDu
require valid-user
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined
SSLEngine on
SSLCertificateFile /vol/certificados/completessl/www.empresa.es.crt
SSLCertificateKeyFile /vol/certificados/completessl/www.empresa.es.key
SSLCACertificateFile /vol/certificados/completessl/www.empresa.es.PositiveSSLCA.crt
</VirtualHost>