La autenticación básica es la forma más rápida de ocultar un sitio de pruebas, una carpeta de administración o una herramienta privada tras una ventana de acceso. Esta guía cubre Apache y Nginx en tu VPS Linux Infrawire, con un archivo de contraseñas creado con htpasswd.
📋 Requisitos previos
- Un VPS Linux (Ubuntu 24.04 / Debian 12 o AlmaLinux 9 / Rocky 9) con acceso SSH root. La IP y la contraseña root están en tu área de cliente.
- Apache o Nginx sirviendo ya un sitio.
- Un certificado HTTPS válido para
example.com. La autenticación básica envía la contraseña codificada en Base64, lo que no es cifrado: nunca la uses sobre HTTP simple.
📦 Instalar la herramienta htpasswd
El comando htpasswd viene de un paquete pequeño, aunque uses Nginx:
Bash# Debian / Ubuntu sudo apt install -y apache2-utils # AlmaLinux / Rocky sudo dnf install -y httpd-tools
🔐 Crear el archivo de contraseñas
Guarda el archivo fuera de cualquier raíz web, para que nadie pueda descargarlo:
Bashsudo mkdir -p /etc/htpasswd sudo htpasswd -c -B /etc/htpasswd/example.com USER
-B usa bcrypt. -c crea el archivo: úsalo solo con el primer usuario, porque en un archivo existente lo sobrescribe todo (destructivo). Añade más usuarios sin -c:
Bashsudo htpasswd -B /etc/htpasswd/example.com USER2
El servidor web debe poder leer el archivo:
Bash# Debian / Ubuntu (Apache y Nginx se ejecutan como www-data) sudo chown root:www-data /etc/htpasswd/example.com # AlmaLinux / Rocky: grupo apache (Apache) o nginx (Nginx) sudo chmod 640 /etc/htpasswd/example.com
Para eliminar un usuario: sudo htpasswd -D /etc/htpasswd/example.com USER2.
🪶 Opción A: Apache con .htaccess
Coloca un archivo .htaccess en la carpeta que quieras proteger, por ejemplo /var/www/example.com/private/.htaccess:
ApacheAuthType Basic AuthName "Zona restringida" AuthUserFile /etc/htpasswd/example.com Require valid-user
Los archivos .htaccess se ignoran si el virtual host no los permite. En tu bloque <Directory> (archivo en /etc/apache2/sites-available/ en Debian/Ubuntu, /etc/httpd/conf.d/ en AlmaLinux/Rocky):
Apache<Directory /var/www/example.com> AllowOverride AuthConfig </Directory>
Luego prueba y recarga:
Bashsudo apachectl configtest sudo systemctl reload apache2 # Debian / Ubuntu sudo systemctl reload httpd # AlmaLinux / Rocky
Si prefieres no usar .htaccess, pon las cuatro líneas de autenticación directamente en un bloque <Directory> o <Location>: es más rápido y seguro.
🚀 Opción B: Nginx con auth_basic
Nginx no lee .htaccess. Añade las directivas al bloque server:
Nginx1server { 2 listen 443 ssl; 3 server_name example.com; 4 # líneas ssl_certificate aquí 5 6 location /private/ { 7 auth_basic "Zona restringida"; 8 auth_basic_user_file /etc/htpasswd/example.com; 9 } 10}
Para proteger todo el sitio, pon esas dos líneas en el bloque server. Para dejar una ruta pública dentro de un sitio protegido (por ejemplo un webhook), añade auth_basic off; en su propio location. Después:
Bashsudo nginx -t && sudo systemctl reload nginx
✅ Probar
Sin credenciales debes obtener un 401 y con credenciales un 200:
Bashcurl -I https://example.com/private/ curl -I -u USER https://example.com/private/
Primera respuesta esperada:
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Basic realm="Zona restringida"
curl pide la contraseña cuando pasas solo -u USER, lo que evita dejarla en el historial del shell.
🛠️ Solución de problemas
No aparece la ventana de acceso en Apache. AllowOverride sigue en None, o el .htaccess está en la carpeta equivocada. Revisa el bloque <Directory> y recarga.
Siempre 401 con la contraseña correcta. El servidor web no puede leer el archivo (revisa chown y chmod), o la ruta en AuthUserFile o auth_basic_user_file es incorrecta. El registro de errores lo indica: /var/log/apache2/error.log, /var/log/httpd/error_log o /var/log/nginx/error.log.
Error 500 tras añadir el .htaccess. Una directiva no es válida o falta un módulo. Ejecuta sudo apachectl configtest y lee el mensaje.
Petición de contraseña por HTTP. Redirige primero HTTP a HTTPS, para que las credenciales nunca viajen en claro.
🎉 Tu carpeta privada ya pide inicio de sesión, con contraseñas con hash guardadas fuera de alcance y servidas solo por HTTPS.