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.
Este tutorial te mostrará los recursos de protección de contraseña en un servidor web de Apache que se ejecuta en Ubuntu 18.04 a fin de brindarle más seguridad a tu 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 servicios de Apache
Comencemos por actualizar nuestro servidor e instalar un paquete que necesitaremos. Para completar este tutorial, usaremos una herramienta llamada htpasswd
, parte del paquete de apache2-utils
, para crear el archivo y administrar el nombre de usuario y las contraseñas necesarias para acceder a contenido restringido.
- sudo apt update
- sudo apt install apache2-utils
Una vez instalada, tenemos 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 usemos esta utilidad, debemos añadir la opción -c
para crear el _passwdfile _especificado. Especificamos un nombre de usuario (sammy
en este ejemplo) al final del comando para crear una entrada nueva dentro del archivo:
- sudo htpasswd -c /etc/apache2/.htpasswd sammy
Se le solicitará que proporcione y confirme una contraseña para el usuario.
Deje el argumento -c
para cualquier usuario adicional que desee añadir, de manera de no tener que 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 de cada registro:
- cat /etc/apache2/.htpasswd
Output
sammy:$apr1$.0CAabqX$rb8lueIORA/p8UzGPYtGs/
another_user:$apr1$fqH7UG8a$SrUxurp/Atfq6j7GL/VEC1
Ahora, tenemos nuestros usuarios y contraseñas 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 divulgar 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 colocación de archivos .htaccess
en los directorios que requieren restricción. Generalmente, es mejor usar el archivo 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 use archivos .htaccess
ya para otros fines, consulte la segunda opción.
Seleccione la opción que mejor se adapte a 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 de contraseña al archivo de host virtual. Esto, generalmente, brindará un mejor desempeño 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 opción recomendada.
Comience por abrir el archivo de host virtual al que le 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, con los comentarios vaciados, el archivo debería verse parecido a esto:
/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 registro de modo de 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 que ingrese las credenciales. Utilice la directiva AuthUserFile
para guiar 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, lo que 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ña. Debido a que systemctl
no muestra el resultado de todos los comandos de gestión de servicio, usaremos el 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 desempeño, la Opción 1 es la preferida, pero 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 usted puede colocar 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 le solicite que ingrese las credenciales. Utilice la directiva AuthUserFile
para guiar a Apache al archivo de contraseña que creamos. Por último, solicitaremos que este recurso sea accesible para un valid-user
, lo que 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 o debajo del directorio con el archivo .htaccess
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 su contenido restringido desde un navegador web. Debería aparecer una ventana para que ingrese nombre de usuario y contraseña, que luce como esta:

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

Conclusión
¡Felicitaciones! Si siguió estas instrucciones, configuró 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 el poder disponibles en la configuración de Apache, consulte uno de los siguientes tutoriales: