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.
Para completar este tutorial, necesitará acceso a un servidor de Ubuntu 18.04.
Además, necesitará la siguiente configuración para poder comenzar:
Un usuario sudo
en su servidor: puede crear un usuario con privilegios sudo
siguiendo la guía de configuración inicial para servidores de Ubuntu 18.04.
Un servidor web de Apache2: si aún no configuró uno, el tutorial Cómo instalar el servidor web de Apache en Ubuntu 18.04 le servirá.
Un sitio protegido con SSL: la forma de configurarlo depende de que cuente o no con un nombre de dominio para su sitio.
Cuando todo esto esté en orden, inicie sesión en su servidor como usuario sudo
y continúe con lo siguiente.
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
.
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
Outputsammy:$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.
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.
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:
<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:
<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:
<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.
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
:
. . .
<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:
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.
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:
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”:
¡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:
Para comprender mejor [missing text] con el archivo de configuración principal, consulte la sección Información sobre directorios y archivos importantes de Apache, que se encuentra en nuestra guía de instalación de Apache.
Podrá obtener más información sobre los archivos de host virtual en Cómo configurar hosts virtuales de Apache en Ubuntu 16.04.
Aprenda a reescribir URL, personalizar páginas de error, como el mensaje previo “Unauthorized”, o incluir elementos comunes en todas sus páginas con Server Side Includes a través de nuestra guía Cómo usar el archivo .htaccess.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!