Generator nagłówków bezpieczeństwa Nginx
HSTS, X-Frame-Options, CSP, Referrer-Policy, Permissions-Policy i COOP z walidacją składni i plikiem .conf
-
1Wprowadź dane
Wpisz treść, wklej tekst lub załaduj plik z dysku. -
2Kliknij przycisk
Narzędzie natychmiast przetworzy Twoje dane w przeglądarce. -
3Pobierz wynik
Skopiuj gotowy tekst lub zapisz plik na urządzeniu.
return "Wynik gotowy w 0.1s";
}
Zalecane nagłówki bezpieczeństwa
Konfiguracja zawiera wszystkie 6 podstawowych zabezpieczeń. Wklej ją do bloku server i sprawdź poleceniem nginx -t.
Dyrektywy Nginx
HSTS
CSP
Uwagi
Konfiguracja Nginx
/etc/nginx/snippets/ i dołączenia przez include.
Co warto poprawić
- OK: nie znaleziono typowych słabych punktów w tej konfiguracji.
| Nagłówek | W konfiguracji | Chroni przed |
|---|---|---|
| Strict-Transport-Security | Tak, 365 dni | Degradacja do HTTP, przechwycenie ruchu |
| X-Frame-Options | SAMEORIGIN | Clickjacking (osadzanie w ramce) |
| X-Content-Type-Options | nosniff | Wykonanie pliku o podmienionym typie |
| Referrer-Policy | strict-origin-when-cross-origin | Wyciek adresów i parametrów do innych stron |
| Permissions-Policy | Tak | Nadużycie kamery, mikrofonu, lokalizacji |
| Content-Security-Policy | Tak, 3 dyrektyw | XSS, wstrzyknięte skrypty i style |
| Cross-Origin-Opener-Policy | Nie (opcjonalny) | Ataki przez okna otwarte z innej domeny |
| server_tokens | off | Ujawnienie wersji serwera |
Ściąga: max-age HSTS w sekundach
| Okres | max-age (s) | Kiedy używać |
|---|---|---|
| 5 minut | 300 | Pierwszy test po włączeniu HTTPS |
| 1 tydzień | 604800 | Drugi etap wdrażania |
| 30 dni | 2592000 | Trzeci etap wdrażania |
| 1 rok | 31536000 | Minimum dla listy preload |
| 2 lata | 63072000 | Docelowa wartość dla stabilnego HTTPS |
Gdzie wkleić i pułapka dziedziczenia
Dyrektywy wstaw do bloku server (HTTPS). Nginx dziedziczy add_header z wyższego poziomu tylko wtedy, gdy na bieżącym nie ma żadnego add_header. Jeśli location dodaje własny nagłówek, nagłówki z server w nim znikają. Najprościej zapisać je w pliku i dołączać przez include w każdym takim miejscu. Po zmianie: nginx -t, potem przeładowanie.
Po co parametr always
Bez always Nginx dodaje nagłówek tylko do odpowiedzi z kodami 200, 201, 204, 206, 301, 302, 303, 304, 307 i 308. Z always trafia też do odpowiedzi z błędami (np. 404, 500), więc ochrona obejmuje każdą odpowiedź serwera. Dlatego generator dodaje go do każdego nagłówka.
HSTS i preload ostrożnie
Przeglądarka zapamiętuje HSTS na czas max-age i do tego czasu nie wejdzie na stronę po HTTP. includeSubDomains obejmuje każdą subdomenę, więc wszystkie muszą mieć ważny certyfikat. Zacznij od krótkiego max-age i wydłużaj go etapami. Wpis na listę preload trudno cofnąć: wymaga max-age co najmniej roku i includeSubDomains.
CSP: najpierw tryb raportowania
Zbyt ostra polityka potrafi wyłączyć skrypty, czcionki czy analitykę. Włącz Report-Only, sprawdź w konsoli przeglądarki, co jest blokowane, i dopiero wtedy przełącz na wymuszanie. 'unsafe-inline' w script-src znosi większość ochrony przed XSS. Nagłówek X-XSS-Protection jest przestarzały, dlatego generator go nie dodaje.
Oceń to narzędzie:
Powiązane narzędzia
Inne narzędzia, które mogą Ci się przydaćGenerator nagłówków bezpieczeństwa Nginx
Nagłówki bezpieczeństwa Nginx to kilka dyrektyw add_header w bloku server, które chronią użytkowników przed przechwyceniem połączenia, clickjackingiem, XSS i wyciekiem adresów URL. Generator składa je z formularza, sprawdza składnię CSP i Permissions-Policy, ocenia konfigurację w skali 6 podstawowych zabezpieczeń i pozwala pobrać gotowy plik security-headers.conf.
Najważniejsze nagłówki
| Nagłówek | Chroni przed |
|---|---|
| Strict-Transport-Security | degradacją do HTTP (MITM) |
| X-Frame-Options | clickjackingiem |
| X-Content-Type-Options | MIME sniffing |
| Content-Security-Policy | XSS, wstrzykiwaniem zasobów |
| Referrer-Policy | wyciekiem adresów URL |
| Permissions-Policy | dostępem do API przeglądarki (kamera, mikrofon, lokalizacja) |
| Cross-Origin-Opener-Policy | atakami przez okna otwarte z innej domeny (opcjonalny) |
| server_tokens off | ujawnieniem wersji Nginx w nagłówku Server i na stronach błędów |
Przykład: konfiguracja z zestawu „Zalecany”
Tak wygląda wynik ustawień domyślnych po wyłączeniu komentarzy. Generator liczy tu 7 dyrektyw, pokazuje HSTS na 365 dni i ocenia pokrycie na 6 z 6:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always;
add_header Content-Security-Policy "default-src 'self'; img-src 'self' data:; style-src 'self' 'unsafe-inline'" always;
server_tokens off;
Zestaw „Restrykcyjny” podnosi max-age do 63072000 s (730 dni), ustawia DENY, no-referrer, COOP same-origin i CSP z object-src 'none' oraz frame-ancestors 'none'. „Łagodny” zostawia w CSP 'unsafe-inline' i 'unsafe-eval', więc generator od razu ostrzega, że taka polityka słabo chroni przed XSS.
Uwagi
alwaysdodaje nagłówek także do odpowiedzi błędów,- HSTS włączaj dopiero, gdy HTTPS działa poprawnie — jest „lepki” w przeglądarce,
- CSP testuj najpierw w trybie
Content-Security-Policy-Report-Only(w generatorze: pole „Tryb Report-Only”), - nagłówka X-XSS-Protection generator nie dodaje, bo jest przestarzały; ochronę przed XSS daje CSP.
Jak działa generator nagłówków bezpieczeństwa Nginx
Generator zbiera wartości z formularza i zamienia je na gotowy blok dyrektyw add_header. Każda linia to jeden nagłówek: nazwa, wartość w cudzysłowie oraz flaga always, która sprawia, że nagłówek trafia także do odpowiedzi błędów. Na końcu może dojść server_tokens off, a nad każdą dyrektywą opcjonalny komentarz po polsku. Wynik kopiujesz albo pobierasz jako security-headers.conf, zapisujesz np. w /etc/nginx/snippets/ i dołączasz przez include.
Przed zbudowaniem konfiguracji narzędzie sprawdza dane. W CSP wykrywa fragmenty bez nazwy dyrektywy, nieznane nazwy (zwykle literówki), powtórzone dyrektywy, słowa kluczowe bez apostrofów (self zamiast 'self'), brak default-src oraz 'unsafe-inline', 'unsafe-eval' i zbyt szerokie źródła skryptów, jak *, https: czy data:. W Permissions-Policy pilnuje formatu funkcja=(…) z przecinkami. Opcję preload odrzuca, gdy max-age jest krótszy niż 31536000 s albo wyłączono includeSubDomains. Ostrzega też przed znakiem $, który Nginx traktuje jako zmienną.
Najważniejsza zasada mechanizmu siedzi w samym Nginx, nie w generatorze: dyrektywy add_header dziedziczą się z poziomu nadrzędnego tylko wtedy, gdy na niższym poziomie nie zdefiniowano ani jednej takiej dyrektywy. Jeśli w bloku location pojawi się choćby jedno add_header, nagłówki ustawione w server przestają tam obowiązywać. Dlatego wygenerowany zestaw najlepiej trzymać w osobnym pliku i dołączać przez include w każdym bloku, który dodaje własne nagłówki.
Wartość max-age w HSTS liczy się w sekundach i jest odświeżana przy każdym poprawnym żądaniu po HTTPS — im większa liczba, tym dłużej przeglądarka pamięta zakaz łączenia się po HTTP. Wzór jest prosty: max-age podzielone przez 86400 daje liczbę dni. Dla 31536000 sekund to dokładnie 365 dni, dla 63072000 – 730 dni. Ściągę z typowymi wartościami znajdziesz bezpośrednio pod formularzem.
Przykład krok po kroku: od formularza do działającej konfiguracji
- Wybierasz zestaw „Zalecany”. HSTS dostaje wartość max-age=31536000; includeSubDomains, czyli 31536000 / 86400 = 365 dni, i tyle pokazuje kafelek HSTS.
- Jeśli HTTPS dopiero uruchamiasz, zmieniasz max-age na 300 (5 minut) albo 604800 (7 dni). Generator doda uwagę, że wartość krótsza niż rok nadaje się na testy, ale jest za krótka dla listy preload.
- Zaznaczasz tryb Report-Only. Nagłówek zmienia się na Content-Security-Policy-Report-Only, a ocena spada do 5 z 6, bo taka polityka tylko zgłasza naruszenia i niczego nie blokuje.
- Klikasz „Generuj nagłówki”, pobierasz security-headers.conf do /etc/nginx/snippets/ i dopisujesz w bloku server linię include snippets/security-headers.conf;. Uruchamiasz nginx -t i przeładowujesz usługę, np. systemctl reload nginx.
- Sprawdzasz realną odpowiedź serwera poleceniem curl -I https://twojadomena.pl. Powinny być widoczne wszystkie wygenerowane nagłówki, a nagłówek Server bez numeru wersji.
- Po kilku dniach przeglądasz naruszenia CSP w konsoli przeglądarki i dopisujesz brakujące źródła skryptów, stylów i fontów. Gdy naruszeń nie ma, wyłączasz Report-Only i etapami wydłużasz max-age: 30 dni, rok, docelowo 2 lata (63072000 s).
Tabela referencyjna: nagłówek, wartość, co sprawdzić przed włączeniem
| Nagłówek | Wartość domyślna w generatorze | Co sprawdzić przed włączeniem |
|---|---|---|
| Strict-Transport-Security | max-age=31536000; includeSubDomains | czy wszystkie subdomeny mają ważny certyfikat i odpowiadają po HTTPS |
| X-Frame-Options | SAMEORIGIN | czy strona nie jest osadzana w ramce na innej domenie, np. przez widget lub panel klienta |
| X-Content-Type-Options | nosniff | czy serwer wysyła poprawne typy dla plików CSS i JavaScript |
| Content-Security-Policy | default-src 'self'; img-src 'self' data:; style-src 'self' 'unsafe-inline' | skąd ładowane są skrypty, style, fonty, obrazy i ramki oraz czy używasz kodu inline |
| Content-Security-Policy-Report-Only | ta sama polityka w trybie raportowania | czy naruszenia widać w konsoli przeglądarki lub w endpoincie z report-uri |
| Referrer-Policy | strict-origin-when-cross-origin | czy zewnętrzna analityka lub API potrzebują pełnego adresu w nagłówku Referer |
| Permissions-Policy | geolocation=(), microphone=(), camera=() | czy strona lub osadzone ramki nie korzystają z tych API przeglądarki |
| Cross-Origin-Opener-Policy | brak (do wyboru same-origin, same-origin-allow-popups, unsafe-none) | czy logowanie lub płatności nie otwierają okienek, które muszą komunikować się ze stroną |
Praktyczne wskazówki wdrożenia
- Trzymaj nagłówki w jednym pliku. Zestaw z generatora dołącz przez include w bloku server i powtórz ten sam include w każdym bloku location, który ma własne add_header, bo inaczej nagłówki z server w nim znikną.
- Wdrażaj warstwami. Zacznij od nagłówków, które nie zmieniają działania strony, potem dodaj ograniczenia ramek, a na końcu HSTS i politykę treści — każdy z tych etapów może ujawnić inny problem.
- HSTS wprowadzaj stopniowo: zacznij od krótkiego max-age, np. 604800, czyli 7 dni licząc po 86400 sekund na dobę, i wydłuż go do 31536000 dopiero wtedy, gdy HTTPS działa stabilnie na wszystkich hostach.
- Sprawdzaj odpowiedź, nie tylko konfigurację. Nagłówki mogą zostać nadpisane przez aplikację, reverse proxy lub CDN, dlatego po każdym wdrożeniu zrób curl -I i porównaj wynik z plikiem.
Ograniczenia narzędzia
- Nie zna Twojej infrastruktury. Generator nie sprawdzi, czy przed Nginx stoi proxy lub CDN, który dokłada albo nadpisuje nagłówki, ani czy aplikacja wysyła własne.
- Nie ustali listy dozwolonych źródeł. Sprawdza składnię CSP, ale nie wie, z jakich domen ładujesz skrypty, style czy fonty, więc zbyt wąska polityka zablokuje działające elementy strony.
- Nie obsługuje wartości dynamicznych. Polityka treści oparta na nonce wymaga generowania losowej wartości przy każdym żądaniu po stronie aplikacji, czego statyczna konfiguracja nie zrobi.
- Nie weryfikuje subdomen i certyfikatów. Nie sprawdzi, czy wszystkie hosty objęte includeSubDomains mają poprawny certyfikat i odpowiadają po HTTPS.
- Nie usuwa podatności. Nagłówki ograniczają skutki niektórych ataków, ale nie naprawiają błędów w kodzie, słabego uwierzytelniania ani wycieków danych.
Najczęstsze pytania
Czy nagłówki spowalniają stronę?
Nie — to kilka bajtów w odpowiedzi. Efekt jest pomijalny.
Dlaczego po włączeniu CSP strona przestała działać?
Najczęściej polityka blokuje skrypty lub style, których źródła nie zostały dopisane. Włącz tryb Report-Only, zbierz listę naruszeń z konsoli przeglądarki i dopiero potem wymuszaj reguły.
Gdzie wkleić wygenerowaną konfigurację w Nginx?
Do bloku server (HTTPS) danej domeny, bezpośrednio albo przez include pobranego pliku security-headers.conf. Po zapisie sprawdź składnię poleceniem nginx -t i przeładuj usługę.
Czy includeSubDomains jest bezpieczne?
Tylko wtedy, gdy każda subdomena ma ważny certyfikat i obsługuje HTTPS. Jeśli któraś działa wyłącznie po HTTP, przeglądarki odetną do niej dostęp na czas zapisany w max-age.
Czy dodawać nagłówek X-XSS-Protection?
Nie. To przestarzały nagłówek, który nowe przeglądarki ignorują, dlatego generator go pomija. Przed XSS chroni Content-Security-Policy bez 'unsafe-inline' w skryptach.
Jak potwierdzić, że nagłówki faktycznie działają?
Sprawdź surową odpowiedź serwera poleceniem curl -I albo zakładką sieci w narzędziach deweloperskich przeglądarki. Brak nagłówka oznacza, że konfiguracja nie została wczytana albo nadpisał ją blok location, aplikacja lub CDN.