A autenticação básica é a forma mais rápida de esconder um site de testes, uma pasta de administração ou uma ferramenta privada atrás de um pedido de login. Este guia cobre Apache e Nginx no seu VPS Linux Infrawire, com um ficheiro de palavras-passe criado com htpasswd.
📋 Pré-requisitos
- Um VPS Linux (Ubuntu 24.04 / Debian 12 ou AlmaLinux 9 / Rocky 9) com acesso SSH root. O IP e a palavra-passe root estão na sua área de cliente.
- Apache ou Nginx a servir já um site.
- Um certificado HTTPS válido para
example.com. A autenticação básica envia a palavra-passe codificada em Base64, o que não é cifragem: nunca a use em HTTP simples.
📦 Instalar a ferramenta htpasswd
O comando htpasswd vem de um pequeno pacote, mesmo que use Nginx:
Bash# Debian / Ubuntu sudo apt install -y apache2-utils # AlmaLinux / Rocky sudo dnf install -y httpd-tools
🔐 Criar o ficheiro de palavras-passe
Guarde o ficheiro fora de qualquer raiz web, para que ninguém o possa descarregar:
Bashsudo mkdir -p /etc/htpasswd sudo htpasswd -c -B /etc/htpasswd/example.com USER
-B usa bcrypt. -c cria o ficheiro: use-o só para o primeiro utilizador, pois num ficheiro existente apaga tudo (destrutivo). Adicione mais utilizadores sem -c:
Bashsudo htpasswd -B /etc/htpasswd/example.com USER2
O servidor web tem de conseguir ler o ficheiro:
Bash# Debian / Ubuntu (Apache e Nginx correm como www-data) sudo chown root:www-data /etc/htpasswd/example.com # AlmaLinux / Rocky: grupo apache (Apache) ou nginx (Nginx) sudo chmod 640 /etc/htpasswd/example.com
Para remover um utilizador: sudo htpasswd -D /etc/htpasswd/example.com USER2.
🪶 Opção A: Apache com .htaccess
Coloque um ficheiro .htaccess na pasta a proteger, por exemplo /var/www/example.com/private/.htaccess:
ApacheAuthType Basic AuthName "Área restrita" AuthUserFile /etc/htpasswd/example.com Require valid-user
Os ficheiros .htaccess são ignorados se o virtual host não os permitir. No seu bloco <Directory> (ficheiro em /etc/apache2/sites-available/ no Debian/Ubuntu, /etc/httpd/conf.d/ no AlmaLinux/Rocky):
Apache<Directory /var/www/example.com> AllowOverride AuthConfig </Directory>
Depois teste e recarregue:
Bashsudo apachectl configtest sudo systemctl reload apache2 # Debian / Ubuntu sudo systemctl reload httpd # AlmaLinux / Rocky
Se preferir não usar .htaccess, coloque as quatro linhas de autenticação diretamente num bloco <Directory> ou <Location>: é mais rápido e seguro.
🚀 Opção B: Nginx com auth_basic
O Nginx não lê .htaccess. Adicione as diretivas ao bloco server:
Nginx1server { 2 listen 443 ssl; 3 server_name example.com; 4 # linhas ssl_certificate aqui 5 6 location /private/ { 7 auth_basic "Área restrita"; 8 auth_basic_user_file /etc/htpasswd/example.com; 9 } 10}
Para proteger o site todo, ponha essas duas linhas no bloco server. Para deixar um caminho público dentro de um site protegido (por exemplo um webhook), adicione auth_basic off; no seu próprio location. Depois:
Bashsudo nginx -t && sudo systemctl reload nginx
✅ Testar
Sem credenciais deve obter um 401 e com credenciais um 200:
Bashcurl -I https://example.com/private/ curl -I -u USER https://example.com/private/
Primeira resposta esperada:
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Basic realm="Área restrita"
O curl pede a palavra-passe quando indica apenas -u USER, o que evita deixá-la no histórico da shell.
🛠️ Resolução de problemas
Não aparece o pedido de login no Apache. O AllowOverride continua em None, ou o .htaccess está na pasta errada. Reveja o bloco <Directory> e recarregue.
Sempre 401 com a palavra-passe certa. O servidor web não consegue ler o ficheiro (verifique chown e chmod), ou o caminho em AuthUserFile ou auth_basic_user_file está errado. O registo de erros indica-o: /var/log/apache2/error.log, /var/log/httpd/error_log ou /var/log/nginx/error.log.
Erro 500 depois de adicionar o .htaccess. Uma diretiva é inválida ou falta um módulo. Execute sudo apachectl configtest e leia a mensagem.
Pedido de palavra-passe em HTTP. Redirecione primeiro HTTP para HTTPS, para que as credenciais nunca circulem em claro.
🎉 A sua pasta privada pede agora login, com palavras-passe em hash guardadas fora de alcance e servidas apenas por HTTPS.