Uwierzytelnianie podstawowe to najszybszy sposób, by ukryć stronę testową, katalog administracyjny lub prywatne narzędzie za oknem logowania. Ten poradnik obejmuje Apache i Nginx na Twoim VPS Linux Infrawire, z plikiem haseł utworzonym przez htpasswd.
📋 Wymagania wstępne
- VPS z Linuxem (Ubuntu 24.04 / Debian 12 lub AlmaLinux 9 / Rocky 9) z dostępem SSH jako root. Adres IP i hasło roota są w panelu klienta.
- Apache lub Nginx obsługujący już stronę.
- Ważny certyfikat HTTPS dla
example.com. Uwierzytelnianie podstawowe wysyła hasło zakodowane w Base64, co nie jest szyfrowaniem: nigdy nie używaj go przez zwykły HTTP.
📦 Instalacja narzędzia htpasswd
Polecenie htpasswd pochodzi z małego pakietu, nawet jeśli używasz Nginx:
Bash# Debian / Ubuntu sudo apt install -y apache2-utils # AlmaLinux / Rocky sudo dnf install -y httpd-tools
🔐 Tworzenie pliku z hasłami
Trzymaj plik poza katalogiem głównym serwisu, aby nikt nie mógł go pobrać:
Bashsudo mkdir -p /etc/htpasswd sudo htpasswd -c -B /etc/htpasswd/example.com USER
-B używa bcrypt. -c tworzy plik: stosuj go tylko dla pierwszego użytkownika, bo przy istniejącym pliku nadpisuje całą zawartość (operacja destrukcyjna). Kolejnych użytkowników dodawaj bez -c:
Bashsudo htpasswd -B /etc/htpasswd/example.com USER2
Serwer WWW musi móc odczytać plik:
Bash# Debian / Ubuntu (Apache i Nginx działają jako www-data) sudo chown root:www-data /etc/htpasswd/example.com # AlmaLinux / Rocky: grupa apache (Apache) lub nginx (Nginx) sudo chmod 640 /etc/htpasswd/example.com
Aby usunąć użytkownika: sudo htpasswd -D /etc/htpasswd/example.com USER2.
🪶 Opcja A: Apache z .htaccess
Umieść plik .htaccess w chronionym katalogu, np. /var/www/example.com/private/.htaccess:
ApacheAuthType Basic AuthName "Strefa zastrzeżona" AuthUserFile /etc/htpasswd/example.com Require valid-user
Pliki .htaccess są ignorowane, dopóki wirtualny host ich nie dopuszcza. W bloku <Directory> (plik w /etc/apache2/sites-available/ w Debianie/Ubuntu, /etc/httpd/conf.d/ w AlmaLinux/Rocky):
Apache<Directory /var/www/example.com> AllowOverride AuthConfig </Directory>
Następnie przetestuj i przeładuj:
Bashsudo apachectl configtest sudo systemctl reload apache2 # Debian / Ubuntu sudo systemctl reload httpd # AlmaLinux / Rocky
Jeśli wolisz nie używać .htaccess, wstaw cztery linie uwierzytelniania bezpośrednio do bloku <Directory> lub <Location>: jest szybciej i bezpieczniej.
🚀 Opcja B: Nginx z auth_basic
Nginx nie czyta .htaccess. Dodaj dyrektywy do bloku server:
Nginx1server { 2 listen 443 ssl; 3 server_name example.com; 4 # linie ssl_certificate tutaj 5 6 location /private/ { 7 auth_basic "Strefa zastrzeżona"; 8 auth_basic_user_file /etc/htpasswd/example.com; 9 } 10}
Aby chronić całą stronę, umieść te dwie linie w bloku server. Aby zostawić publiczną ścieżkę w chronionej witrynie (np. webhook), dodaj auth_basic off; w jej własnym location. Następnie:
Bashsudo nginx -t && sudo systemctl reload nginx
✅ Test
Bez danych logowania powinieneś dostać 401, z danymi 200:
Bashcurl -I https://example.com/private/ curl -I -u USER https://example.com/private/
Oczekiwana pierwsza odpowiedź:
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Basic realm="Strefa zastrzeżona"
curl pyta o hasło, gdy podasz samo -u USER, dzięki czemu nie trafia ono do historii powłoki.
🛠️ Rozwiązywanie problemów
Apache nie wyświetla okna logowania. AllowOverride nadal ma wartość None albo .htaccess leży w złym katalogu. Sprawdź ponownie blok <Directory> i przeładuj.
Zawsze 401 mimo poprawnego hasła. Serwer WWW nie może odczytać pliku (sprawdź chown i chmod) albo ścieżka w AuthUserFile lub auth_basic_user_file jest błędna. Wskaże to log błędów: /var/log/apache2/error.log, /var/log/httpd/error_log lub /var/log/nginx/error.log.
Błąd 500 po dodaniu .htaccess. Dyrektywa jest nieprawidłowa lub brakuje modułu. Uruchom sudo apachectl configtest i przeczytaj komunikat.
Pytanie o hasło przez HTTP. Najpierw przekieruj HTTP na HTTPS, aby dane logowania nigdy nie podróżowały jawnie.
🎉 Twój prywatny katalog wymaga teraz logowania, a zahaszowane hasła leżą poza zasięgiem i są obsługiwane wyłącznie przez HTTPS.