En uno de los servidores Web que administro, una nueva aplicación requirió proteger el acceso a un directorio mediante autenticación Digest. En el artículo Proteger con contraseña un directorio Web expliqué cómo configurar la autenticación Basic en Apache. Pero para el caso de Digest, el procedimiento es levemente diferente ya que se debe configurar correctamente el Realm de cada usuario y directorio.



A modo de ejemplo, supongamos que en la configuración del sitio "pepe.org" se desea proteger el acceso al directorio "pepe" (pepe.org/pepe) utilizando autenticación Digest. En el archivo de configuración del VirtualHost (por ejemplo /etc/apache2/sites-available/pepe.org si se trata de Debian y derivados) existe una directiva "Directory" donde se configura el directorio de trabajo base del sitio, que puede contener algo similar a lo siguiente:

        <Directory /var/www/pepe.org>
                Options FollowSymLinks MultiViews +Indexes
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>

Para proteger el acceso al directorio "pepe", agregar una nueva directiva "Directory" para configurar la autenticación Digest:

        <Directory /var/www/pepe.org>
                Options FollowSymLinks MultiViews +Indexes
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>
        
        <Directory /var/www/pepe.org/pepe>
                Options FollowSymLinks MultiViews +Indexes
                AllowOverride None
                Order allow,deny
                allow from all
                
                AuthType Digest
                AuthName "restringido"
                AuthUserFile /usr/local/apache/passwd/digest
                Require user pepe
        </Directory>

De forma alternativa se podría crear un archivo .htaccess (archivo de configuración distribuida) dentro del directorio "pepe", y permitir modificar la configuración de autenticación (cambiar AllowOverride None por AllowOverride AuthConfig FileInfo en el directorio base). Tal como expliqué en el artículo Proteger con contraseña un directorio Web.

Las directivas AuthType, AuthName, AuthUserFile y Require configuran la autenticación Digest. En el ejemplo se indica que se va a utilizar autenticación Digest, que el Realm es "restringido", que el archivo /usr/local/apache/passwd/digest posee la configuración de usuarios y contraseñas, y que se requiere autenticar al usuario "pepe".

Una diferencia entre los mecanismos de autenticación Basic y Digest (además del nivel de seguridad ofrecido por cada uno), es que en Basic los usuarios no pertenecen a ningún Realm (el archivo de configuración de usuarios generado por la herramienta htpasswd sólo almacena usuario y contraseña) y en Digest sí (un usuario debe pertenecer a al menos un Realm, y puede tener diferentes contraseñas para cada uno).

Para generar o modificar el archivo de configuración de usuarios con autenticación Digest, se utiliza la herramienta htdigest. Ya que en el ejemplo anterior la directiva AuthName utiliza el Realm "restringido" y se requiere autenticar al usuario "pepe", será necesario crear el usuario "pepe" en el Realm "restringido".

Si el archivo /usr/local/apache/passwd/digest existe, y posee la configuración de otros usuarios, es posible agregar al usuario "pepe" en el Realm "restringido", sin alterar la configuración previa, ejecutando el comando:

# htdigest /usr/local/apache/passwd/digest restringido pepe

Solicitará crear una contraseña para el usuario "pepe". Es importante que el Realm coincida con el configurado en el directorio. Si el archivo no existiese, es posible crearlo utilizando el parámetro -c (htdigest -c /usr/local/apache/passwd/digest restringido pepe).

Habiendo creado el archivo de configuración de usuarios Digest y configurado el VirtualHost correctamente, sólo basta recargar la configuración de Apache (previamente el sitio debe haber sido habilitado mediante a2ensite pepe.org):

# service apache2 reload

Al ingresar al directorio http://pepe.org/pepe, el servidor Apache solicitará autenticar en el Realm "restringido", por lo que se deberá ingresar las credenciales del usuario "pepe" (tal como se ha requerido en la configuración). Además de requerir un determinado usuario, es posible requerir un grupo de usuarios (para ello se deberán configurar los grupos en un archivo separado), o cualquier usuario válido (mediante la directiva Require valid-user). Para mayor información sobre los mecanismos de autenticación en Apache, revisar la documentación oficial: Authentication and Authorization.

Listar directorios protegidos

Algo que descubrí luego de proteger el directorio "pepe", es que Apache dejó de mostrarlo en el listado de directorios (índice) del directorio padre (pepe.org/). Esto se debe a que, por defecto, Apache oculta los directorios que tienen protección de acceso.

En el artículo Cómo permitir y denegar listado de directorios en Apache expliqué como habilitar el indexado de directorios en Apache. Esto sirve para que, cuando no existe un archivo índice de directorio (como por ejemplo "index.html" o "index.php"), Apache muestre el contenido del directorio:

Para que Apache muestre los archivos protegidos, luego de la directiva Options +Indexes es necesario agregar IndexOptions +ShowForbidden:

        <Directory /var/www/pepe.org>
                Options FollowSymLinks MultiViews +Indexes
                IndexOptions +ShowForbidden
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>
        
        <Directory /var/www/pepe.org/pepe>
                Options FollowSymLinks MultiViews +Indexes
                AllowOverride None
                Order allow,deny
                allow from all
                
                AuthType Digest
                AuthName "restringido"
                AuthUserFile /usr/local/apache/passwd/digest
                Require user pepe
        </Directory>

Espero que sea útil.


Tal vez pueda interesarte


Compartí este artículo