Introducción

Cuando se configura un servidor web, a menudo hay secciones del sitio a las que se desea restringir el acceso. Las aplicaciones web a menudo proporcionan sus propios métodos de autenticación y autorización, pero el propio servidor web se puede utilizar para restringir el acceso si estos son inadecuados o no están disponibles.

En esta guía, vamos a demostrar cómo proteger con contraseña los activos en un servidor web Apache que se ejecuta en Ubuntu 14.04.

Requisitos previos

Para empezar, necesitará acceso a un entorno de servidor Ubuntu 14.04. Necesitará un usuario no root con privilegios sudo para poder realizar tareas administrativas. Para aprender a crear dicho usuario, siga nuestra guía de configuración inicial del servidor Ubuntu 14.04.

Instalar el paquete de utilidades de Apache

Para crear el archivo que almacenará las contraseñas necesarias para acceder a nuestro contenido restringido, utilizaremos una utilidad llamada htpasswd. Esta se encuentra en el paquete apache2-utils dentro de los repositorios de Ubuntu.

Actualiza la caché local de paquetes e instala el paquete escribiendo este comando. Aprovecharemos para coger también el servidor Apache2 en caso de que aún no esté instalado en el servidor:

  • sudo apt-get update
  • sudo apt-get install apache2 apache2-utils

Crear el fichero de contraseñas

Ahora tenemos acceso al comando htpasswd. Podemos utilizarlo para crear un archivo de contraseñas que Apache pueda utilizar para autenticar a los usuarios. Crearemos un archivo oculto para este propósito llamado .htpasswd dentro de nuestro directorio de configuración /etc/apache2.

La primera vez que usamos esta utilidad, necesitamos añadir la opción -c para crear el archivo especificado. Especificamos un nombre de usuario (sammy en este ejemplo) al final del comando para crear una nueva entrada dentro del archivo:

  • sudo htpasswd -c /etc/apache2/.htpasswd sammy

Se le pedirá que proporcione y confirme una contraseña para el usuario.

Olvida el argumento -c para cualquier usuario adicional que desees añadir:

  • sudo htpasswd /etc/apache2/.htpasswd another_user

Si vemos el contenido del archivo, podemos ver el nombre de usuario y la contraseña encriptada para cada registro:

  • cat /etc/apache2/.htpasswd
Output
sammy:$apr1$lzxsIfXG$tmCvCfb49vpPFwKGVsuYz.another_user:$apr1$p1E9MeAf$kiAhneUwr.MhAE2kKGYHK.

Configurar la autenticación de contraseñas de Apache

Ahora que tenemos un fichero con nuestros usuarios y contraseñas en un formato que Apache puede leer, necesitamos configurar Apache para que compruebe este fichero antes de servir nuestro contenido protegido. Podemos hacer esto de dos maneras diferentes.

La primera opción es editar la configuración de Apache y añadir nuestra protección por contraseña al archivo del host virtual. Esto generalmente dará un mejor rendimiento porque evita el gasto de leer los archivos de configuración distribuidos. Si tiene esta opción, se recomienda este método.

Si no tiene la capacidad de modificar el archivo de host virtual (o si ya está usando archivos .htaccess files for other purposes), you can restrict access using an.htaccessfile. Apache uses.htaccess` para permitir que ciertos elementos de configuración se establezcan dentro de un archivo en un directorio de contenido. La desventaja es que Apache tiene que volver a leer estos archivos en cada solicitud que involucra el directorio, lo que puede afectar el rendimiento.

Elija la opción que mejor se adapte a sus necesidades a continuación.

Configurar el control de acceso dentro de la definición de host virtual

Comience por abrir el archivo de host virtual al que desea agregar una restricción. Para nuestro ejemplo, usaremos el archivo 000-default.conf que contiene el host virtual por defecto instalado a través del paquete apache de Ubuntu:

  • sudo nano /etc/apache2/sites-enabled/000-default.conf

Dentro, con los comentarios eliminados, el archivo debería tener un aspecto similar al siguiente:

/etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined</VirtualHost>

La autenticación se realiza por directorios. Para configurar la autenticación, tendrá que apuntar al directorio que desea restringir con un bloque <Directory ___>. En nuestro ejemplo, restringiremos toda la raíz del documento, pero puede modificar este listado para que sólo se dirija a un directorio específico dentro del espacio web:

/etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined <Directory "/var/www/html"> </Directory></VirtualHost>

Dentro de este bloque de directorio, especifique que deseamos configurar la autenticación Basic. Para el AuthName, elija un nombre de reino que se mostrará al usuario cuando se le soliciten las credenciales. Utilice la directiva AuthUserFile para dirigir a Apache al archivo de contraseñas que hemos creado. Finalmente, requeriremos un valid-user para acceder a este recurso, lo que significa que cualquiera que pueda verificar su identidad con una contraseña podrá entrar:

/etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined <Directory "/var/www/html"> AuthType Basic AuthName "Restricted Content" AuthUserFile /etc/apache2/.htpasswd Require valid-user </Directory></VirtualHost>

Guarda y cierra el archivo cuando hayas terminado. Reinicie Apache para implementar su política de contraseñas:

  • sudo service apache2 restart

El directorio que ha especificado debería estar ahora protegido por contraseña.

Configuración del control de acceso con archivos .htaccess

Si desea configurar la protección por contraseña utilizando archivos .htaccess en su lugar, debe comenzar editando el archivo de configuración principal de Apache para permitir los archivos .htaccess:

  • sudo nano /etc/apache2/apache2.conf

Busque el bloque <Directory> para el directorio /var/www que contiene la raíz del documento. Active el procesamiento de .htaccess cambiando la directiva AllowOverride dentro de ese bloque de «Ninguno» a «Todos»:

/etc/apache2/apache2.conf
. . .<Directory /var/www/> Options Indexes FollowSymLinks AllowOverride All Require all granted</Directory>. . .

Guarde y cierre el archivo cuando haya terminado.

A continuación, tenemos que añadir un archivo .htaccess al directorio que deseamos restringir. En nuestra demostración, restringiremos toda la raíz del documento (todo el sitio web) que se encuentra en /var/www/html, pero puede colocar este archivo en cualquier directorio al que desee restringir el acceso:

  • sudo nano /var/www/html/.htaccess

Dentro de este archivo, especifique que deseamos configurar la autenticación Basic. Para la directiva AuthName, elija un nombre de dominio que se mostrará al usuario cuando se le soliciten las credenciales. Utilice la directiva AuthUserFile para dirigir a Apache al archivo de contraseñas que hemos creado. Por último, requeriremos un valid-user para acceder a este recurso, lo que significa que cualquiera que pueda verificar su identidad con una contraseña podrá entrar:

/var/www/html/.htaccess
AuthType BasicAuthName "Restricted Content"AuthUserFile /etc/apache2/.htpasswdRequire valid-user

Guarda y cierra el archivo. Reinicie el servidor web para proteger con contraseña todo el contenido dentro o debajo del directorio con el archivo .htaccess:

  • sudo service apache2 restart

Confirme la autenticación con contraseña

Para confirmar que su contenido está protegido, intente acceder a su contenido restringido en un navegador web. Deberá aparecer un mensaje con el nombre de usuario y la contraseña con el siguiente aspecto:

Si introduce las credenciales correctas, podrá acceder al contenido. Si introduce las credenciales incorrectas o pulsa «Cancelar», verá la página de error «No autorizado»:

Conclusión

Ahora debería tener todo lo que necesita para configurar la autenticación básica de su sitio. Tenga en cuenta que la protección de la contraseña debe combinarse con el cifrado SSL para que sus credenciales no se envíen al servidor en texto plano. Para aprender a crear un certificado SSL autofirmado para utilizarlo con Apache, siga esta guía. Para aprender a instalar un certificado comercial, siga esta guía.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.