Proteger un directorio con contraseña (htpasswd) en VPS

2 min
Hosting VPS/VDS

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:

Bash
sudo 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:

Bash
sudo 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:

Apache
AuthType 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:

Bash
sudo 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:

Nginx
1server { 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:

Bash
sudo nginx -t && sudo systemctl reload nginx

✅ Probar

Sin credenciales debes obtener un 401 y con credenciales un 200:

Bash
curl -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.

Mantente al día con las últimas ofertas, descuentos y promociones especiales.

Ver promociones

Utilizamos cookies

Utilizamos cookies analíticas para mejorar su experiencia en nuestro sitio. No vendemos datos a terceros. Más información en nuestra política de privacidad.