Introducción

Al tener rol de administrador web, puede resultarle útil restringir el acceso de los visitantes a algunas partes de un sitio web, ya sea de forma temporal o permanente. Aunque puede ser que las aplicaciones web proporcionen sus propios métodos de autenticación y autorización, también puede confiar en el servidor web en sí a la hora de restringir el acceso si los otros no son adecuados o no están disponibles.

En este tutorial, verá los recursos de protección con contraseña en un servidor web de Apache activo en Ubuntu 18.04 para lograr más seguridad en su servidor.

Requisitos previos

Para completar este tutorial, necesitará acceso a un servidor de Ubuntu 18.04.

Además, necesitará la siguiente configuración para poder comenzar:

Cuando todo esto esté en orden, inicie sesión en su servidor como usuario sudo y continúe con lo siguiente.

Paso 1: Instalar el paquete de utilidades de Apache

Comenzaremos por actualizar nuestro servidor e instalar un paquete que necesitaremos. Para completar este tutorial, usaremos una herramienta llamada htpasswd, que forma parte del paquete apache2-utils, a fin de crear el archivo y administrar el nombre de usuario y las contraseñas que se necesitarán para acceder a contenido restringido.

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

Una vez instalado esto, tendremos acceso al comando htpasswd.

Paso 2: Crear el archivo de contraseña

El comando htpasswd nos permitirá crear un archivo de contraseña que Apache puede usar para autenticar usuarios. Crearemos un archivo oculto para este propósito, llamado .htpasswd dentro de nuestro directorio de configuración /etc/apache2.

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

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

Se le solicitará proporcionar y confirmar una contraseña para el usuario.

Deje el argumento -c para cualquier usuario adicional que desee añadir, a fin de no sobreescribir el archivo:

  • sudo htpasswd /etc/apache2/.htpasswd another_user

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

  • cat /etc/apache2/.htpasswd
Output
sammy:$apr1$.0CAabqX$rb8lueIORA/p8UzGPYtGs/ another_user:$apr1$fqH7UG8a$SrUxurp/Atfq6j7GL/VEC1

Ahora, nuestros usuarios y nuestras contraseñas se encuentran en un formato que Apache puede leer.

Paso 3: Configurar la autenticación de contraseña de Apache

En este paso, debemos configurar Apache para que verifique este archivo antes de proporcionar nuestro contenido protegido. Podemos hacerlo de una de estas dos formas: ya sea directamente en el archivo de host virtual de un sitio o mediante la disposición de archivos .htaccess en los directorios que requieren restricción. Generalmente, es mejor usar el archivo de host virtual, pero si necesita que los usuarios no root puedan administrar sus propias restricciones de acceso, verificar las restricciones de control de versiones junto con el sitio web o contar con una aplicación web que ya use archivos .htaccess para otros fines, consulte la segunda opción.

Seleccione la opción que mejor satisfaga sus necesidades.

Opción 1: Configurar el control de acceso dentro de la definición de host virtual (preferida)

La primera opción es editar la configuración de Apache y añadir la protección con contraseña al archivo de host virtual. Esto generalmente proporcionará un mejor rendimiento porque evita el esfuerzo de leer archivos de configuración distribuida. Esta opción requiere acceso a la configuración, que no siempre está disponible, pero si tiene acceso es la que se recomienda.

Comience por abrir el archivo de host virtual al que desea añadir una restricción. Para nuestro ejemplo, usaremos el archivo default-ssl.conf que contiene el host virtual predeterminado instalado a través del paquete de apache de Ubuntu. Abra el archivo con un editor de texto de línea de comandos como nano:

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

Dentro de este, sin los comentarios vaciados, el archivo debería tener un aspecto similar al siguiente:

/etc/apache2/sites-enabled/default-ssl.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 directorio. Para configurar la autenticación, necesitará apuntar al directorio que desea restringir con un bloque <Directory ___>. En nuestro ejemplo, restringiremos el root de todo el documento, pero puede modificar este listado para apuntar solo a un directorio específico dentro del espacio web:

/etc/apache2/sites-enabled/default-ssl.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, especificaremos que configuraremos la autenticación Basic. Para el AuthName, seleccione un nombre de territorio que el usuario verá cuando se le solicite ingresar las credenciales. Utilice la directiva AuthUserFile para orientar a Apache al archivo de contraseña que creamos. Por último, cree un requisito para que solo un valid-user pueda tener acceso a este recurso. Esto significa que podrá ingresar quien sea capaz que verificar su identidad con una contraseña:

/etc/apache2/sites-enabled/default-ssl.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>

Guarde y cierre el archivo cuando termine. Si utiliza nano, puede hacerlo presionando CTRL+X seguido de Y y ENTER.

Antes de reiniciar el servidor web, puede verificar la configuración con el siguiente comando:

  • sudo apache2ctl configtest

Si todo está comprobado y el resultado es Syntax OK, puede reiniciar el servidor para implementar su política de contraseñas. Debido a que systemctl no muestra el resultado de todos los comandos de gestión de servicios, usaremos status para asegurarnos de que el servidor esté en ejecución:

  • sudo systemctl restart apache2
  • sudo systemctl status apache2

Ahora, el directorio que especificó debe estar protegido con contraseña.

Opción 2: Configurar el control de acceso con archivos .htaccess

Apache puede usar archivos .htaccess para que determinados elementos de configuración se puedan establecer dentro de un directorio de contenido. Debido a que Apache debe volver a leer estos archivos por cada solicitud relacionada con el directorio, lo cual puede tener un efecto negativo en el rendimiento, la opción 1 es la preferida. No obstante, si ya usa el archivo .htaccess o necesita permitir que los usuarios no root puedan administrar restricciones, convienen los archivos .htaccess.

Para habilitar la protección con contraseña usando archivos .htaccess, abra el archivo de configuración principal de Apache con un editor de texto de línea de comandos como nano:

  • sudo nano /etc/apache2/apache2.conf

Encuentre el bloque <Directory> del directorio /var/www que contiene la root del documento. Active el procesamiento de .htaccess cambiando la directiva AllowOverride dentro de ese bloque de None a All:

/etc/apache2/apache2.conf
. . .

<Directory /var/www/>
  Options Indexes FollowSymLinks
  AllowOverride All
  Require all granted
</Directory>

. . .

Guarde y cierre el archivo cuando termine. Si utiliza nano, puede hacerlo presionando CTRL+X seguido de Y y ENTER.

A continuación, debemos añadir un archivo .htaccess al directorio que deseamos restringir. En nuestra prueba, restringiremos la root de todo el documento (todo el sitio web), que tiene base en /var/www/html, pero puede disponer este archivo en cualquier directorio en que desee restringir el acceso:

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

Dentro de este archivo, especifique que deseamos establecer la autenticación Basic. Para el AuthName, seleccione un nombre de territorio que el usuario verá cuando se soliciten credenciales. Utilice la directiva AuthUserFile para orientar a Apache al archivo de contraseña que creamos. Por último, solicitaremos que este recurso sea accesible para un valid-user, lo cual significa que podrá ingresar quien sea capaz de verificar su identidad con una contraseña:

/var/www/html/.htaccess
AuthType Basic
AuthName "Restricted Content"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user

Guarde y cierre el archivo. Reinicie el servidor web para que proteja con contraseña todo el contenido que se encuentre en el directorio con el archivo .htaccess, o debajo de este, y utilice systemctl status para verificar el éxito del reinicio:

  • sudo systemctl restart apache2
  • sudo systemctl status apache2

El directorio que especificó debe estar protegido con contraseña.

Paso 4: Confirmar la autenticación con contraseña

Para confirmar que su contenido esté protegido, intente acceder a la parte restringida de este desde un navegador web. Debería ver una solicitud de ingreso de nombre de usuario y contraseña con el siguiente aspecto:

Apache2 password prompt

Si introduce las credenciales correctas, se le permitirá acceder al contenido. Si escribe credenciales incorrectas o presiona “Cancel”, verá la página de error “Unauthorized”:

Apache2 unauthorized error

Conclusión

¡Felicitaciones! Si siguió estas instrucciones, habrá configurado la autenticación básica de su sitio.

Se puede hacer mucho más con la configuración de Apache y .htaccess. Para obtener más información sobre la flexibilidad y la capacidad disponibles en la configuración de Apache, consulte uno de los siguientes tutoriales:

0 Comments

Creative Commons License