HSTS i nagłówki bezpieczeństwa dla Państwa strony internetowej
Wraz z każdą stroną serwer WWW wysyła nagłówki: krótkie wiersze z instrukcjami dla przeglądarki. Częściowo decydują one o tym, jak bezpiecznie przeglądarka obchodzi się z Państwa witryną. W tym artykule wyjaśniamy, czym jest HSTS, jakie są inne nagłówki bezpieczeństwa oraz jak je skonfigurować i przetestować.
Najpierw witryna musi mieć działający certyfikat i przekierowywać odwiedzających na https. Więcej na ten temat w artykułach Aktywacja i odnawianie certyfikatu SSL oraz rozwiązywanie problemów oraz Obowiązkowe przekierowanie odwiedzających na https.
Jak działa HSTS?
Przekierowanie na https ma jeden słaby punkt: pierwsze żądanie przez http jest jeszcze nieszyfrowane. Ktoś w tej samej sieci, na przykład w publicznym wifi, może je przechwycić. HSTS (HTTP Strict Transport Security) rozwiązuje ten problem. Witryna wysyła przez https następujący nagłówek:
Strict-Transport-Security: max-age=31536000
Przeglądarka zapamiętuje wtedy, że może otwierać Państwa witrynę wyłącznie przez https. Jeśli odwiedzający wpisze później http://, przeglądarka sama zamieni to na https, zanim cokolwiek zostanie wysłane przez sieć. Nagłówek HSTS odebrany przez zwykłe http przeglądarka ignoruje.
| Element | Znaczenie |
|---|---|
max-age | Jak długo przeglądarka pamięta instrukcję, w sekundach. Test internet.nl uznaje za wystarczający okres co najmniej jednego roku (31536000). |
includeSubDomains | Obowiązuje również dla wszystkich subdomen, takich jak shop.twojadomena.pl i mail.twojadomena.pl. |
preload | Prośba o wpisanie na listę wbudowaną w przeglądarki (hstspreload.org). Wtedy chroniona jest nawet pierwsza wizyta. Wymaga to m.in. okresu jednego roku, includeSubDomains oraz https na wszystkich subdomenach. Usunięcie z listy trwa długo. |
max-age=0 | Usuwa zapamiętaną instrukcję przy następnej wizycie przez https. |
includeSubDomains dotyczy to również każdej subdomeny, na przykład starej strony kamery lub drukarki bez certyfikatu. Dlatego warto wdrażać to stopniowo: zacząć od krótkiego max-age, na przykład jednego dnia (86400), sprawdzić, czy wszystko działa, i stopniowo zwiększać wartość do jednego roku.HSTS w WebOké
Na większości naszych serwerów serwer WWW domyślnie wysyła HSTS dla każdej witryny otwieranej przez https: Strict-Transport-Security: max-age=31536000. Oznacza to jeden rok, bez includeSubDomains i bez preload. Nie muszą Państwo nic w tym celu robić. Na kilku serwerach ta funkcja nie jest domyślnie włączona; tam należy włączyć ją samodzielnie. Czy witryna już wysyła HSTS i z jaką wartością max-age, można sprawdzić w narzędziach deweloperskich przeglądarki lub w teście internet.nl (patrz niżej).
Przełącznik HSTS w DirectAdmin
W DirectAdmin należy przejść do Domeny i kliknąć nazwę domeny. Jeśli opcja Bezpieczne połączenie SSL jest włączona, przy HSTS widoczny jest przełącznik Włącz HTTP Strict Transport Security. Następnie należy kliknąć Zapisz, aby zachować zmiany. Instrukcję krok po kroku znajdą Państwo w artykule Zawsze przekierowuj odwiedzających na https.
Jeśli witryna już wysyła HSTS, przełącznik nie jest potrzebny. Prosimy włączać go tylko wtedy, gdy witryna jeszcze nie wysyła HSTS. HSTS należy konfigurować w jednym miejscu: w DirectAdmin albo w .htaccess, nie w obu. Jeśli przeglądarka otrzyma dwa nagłówki HSTS, użyje tylko pierwszego.
Pozostałe nagłówki bezpieczeństwa
| Nagłówek | Przed czym chroni | Wartość na początek |
|---|---|---|
X-Content-Type-Options | Przeglądarka sama zgaduje, czym jest plik, przez co przesłany „obrazek” może zostać wykonany jako skrypt. | nosniff (jedyna poprawna wartość) |
Content-Security-Policy: frame-ancestors lub X-Frame-Options | Clickjacking: inna witryna niewidocznie ładuje Państwa stronę w ramce, tak że odwiedzający nieświadomie klikają Państwa przyciski. | frame-ancestors 'self' lub starszy nagłówek X-Frame-Options: SAMEORIGIN |
Referrer-Policy | Po kliknięciu linku do innej witryny przeglądarka przesyła adres poprzedniej strony, czasem zawierający wyszukiwaną frazę lub numer zamówienia. | strict-origin-when-cross-origin lub bardziej restrykcyjne same-origin albo no-referrer. Internet.nl uznaje za prawidłowe tylko wartości restrykcyjne. |
Permissions-Policy | Określa, z jakich funkcji przeglądarki mogą korzystać strona i osadzone ramki, np. kamery, mikrofonu i lokalizacji. | camera=(), microphone=(), geolocation=() wyłącza te trzy funkcje. Jeśli witryna korzysta z którejś z nich, należy ją pominąć. |
Content-Security-Policy (pełna) | Ogranicza, skąd mogą być ładowane skrypty, style i obrazy. Znacznie utrudnia to wstrzykiwanie złośliwych skryptów (XSS). | Indywidualnie dla każdej witryny. Należy unikać unsafe-inline, unsafe-eval i symboli wieloznacznych. |
Konfiguracja w .htaccess
Poniższe wiersze należy umieścić na początku pliku .htaccess w katalogu public_html domeny. Najpierw prosimy wykonać kopię pliku.
<IfModule mod_headers.c> Header always set X-Content-Type-Options "nosniff" Header always set Content-Security-Policy "frame-ancestors 'self'" Header always set Referrer-Policy "strict-origin-when-cross-origin" Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()" # Alleen als je site nog geen HSTS meestuurt (zie hierboven): # Header always set Strict-Transport-Security "max-age=31536000" </IfModule>
Wiersz z HSTS jest zakomentowany: prosimy usunąć znak # tylko wtedy, gdy witryna jeszcze nie wysyła HSTS (patrz wyżej). includeSubDomains należy dodać dopiero wtedy, gdy mają Państwo pewność, że każda subdomena obsługuje https. W przypadku WordPressa nagłówki można też skonfigurować za pomocą wtyczki. Prosimy wybrać znaną, nadal aktualizowaną wtyczkę i konfigurować każdy nagłówek w jednym miejscu: we wtyczce albo w .htaccess.
Content-Security-Policy-Report-Only. Nie blokuje on niczego, ale pokazuje w konsoli przeglądarki, co zostałoby zablokowane. W razie wątpliwości warto powierzyć to twórcy strony lub zacząć tylko od frame-ancestors.Na VPS z nginx lub Caddy
Na VPS nie korzystają Państwo z DirectAdmin, a często również z .htaccess. Nagłówki ustawia się wtedy w konfiguracji serwera WWW. Żaden z tych serwerów nie wysyła HSTS ani tych nagłówków automatycznie.
nginx: w bloku server dla portu 443:
add_header Strict-Transport-Security "max-age=31536000" always; add_header X-Content-Type-Options "nosniff" always; add_header Content-Security-Policy "frame-ancestors 'self'" always; add_header Referrer-Policy "strict-origin-when-cross-origin" always;
Dzięki always nagłówki są wysyłane również ze stronami błędów. Uwaga: jeśli w bloku location znajduje się własna dyrektywa add_header, reguły z bloku server przestają obowiązywać dla tej lokalizacji. Należy je wtedy powtórzyć lub umieścić w osobnym pliku dołączanym wszędzie za pomocą include. Konfigurację można przetestować poleceniem nginx -t i przeładować poleceniem systemctl reload nginx.
Caddy: w bloku witryny w pliku Caddyfile:
header {
Strict-Transport-Security "max-age=31536000"
X-Content-Type-Options "nosniff"
Content-Security-Policy "frame-ancestors 'self'"
Referrer-Policy "strict-origin-when-cross-origin"
}
Zmianę należy załadować poleceniem systemctl reload caddy. Informacje o konfiguracji witryny z nginx lub Caddy znajdą Państwo w artykułach nginx z certyfikatem Let's Encrypt oraz Caddy: witryna z automatycznym https w przewodniku po VPS.
Testowanie
- Internet.nl: prosimy wpisać domenę w teście witryny na internet.nl.
- Przeglądarka: należy otworzyć witrynę, nacisnąć F12 (lub wybrać Zbadaj), przejść do karty Sieć, ponownie załadować stronę i kliknąć pierwsze żądanie. W sekcji Nagłówki odpowiedzi (Response Headers) widać wszystko, co wysyła serwer.
- Wiersz poleceń:
curl -sI https://twojadomena.pl/wyświetla nagłówki.
Po każdej zmianie prosimy sprawdzić, czy witryna, formularze i strona płatności nadal działają. Ponadto warto na bieżąco aktualizować CMS, wtyczki i motywy. Zobacz Zabezpieczanie wp-login.php w WordPressie.
Dalsza lektura
- MDN: Strict-Transport-Security (w języku angielskim)
- MDN: Content-Security-Policy (w języku angielskim)
- MDN: Permissions-Policy (w języku angielskim)
- Lista preload HSTS (w języku angielskim)
Chcą Państwo dowiedzieć się więcej? Zapraszamy na bezpłatny kurs Bezpiecznie online dla przedsiębiorców, lekcja 4.2 Państwa witryna: https, HSTS i nagłówki bezpieczeństwa, lub na bezpłatny kurs WordPressa, lekcja 7.4 Wzmacnianie witryny: uprawnienia, nagłówki i wtyczki bezpieczeństwa.
