W dzisiejszym przykładzie, przedstawię podstawowe nagłówki które zwiększą bezpieczeństwo web aplikacji. Będzie to w formie sprawdzonego gistu który należy wkleić na końcu pliku /etc/httpd/httpd.conf, bądź stworzyć jako nowy plik w /etc/httpd/conf.modules.d/44-security.conf. Całość będzie dotyczyć systemu Centos/Oracle Linux.
Przygotowanie
Na początku sprawdzamy czy nasz moduł nagłówków jest włączony
apachectl -M | grep headers
W przypadku stwierdzenia jego braku, należy odkomentować interesujący nasz moduł w /etc/httpd/conf.modules.d/00-base.conf
sudo sed -i 's/^#\s*\(LoadModule headers_module modules\/mod_headers.so\)/\1/' /etc/httpd/conf.modules.d/00-base.conf
Po czym sprawdzamy poprawność wykonania powyższego polecenia:
grep 'LoadModule headers_module modules/mod_headers.so' /etc/httpd/conf.modules.d/00-base.conf
*Jeśli brakuje takiego wpisu, należy doinstalować moduł headers za pomocą menadżera pakietów.
Nagłówki
Poniższe nagłówki możemy wpisać do pliku apache2.conf/httpd.conf. Z uwagi na dobre praktyki umieszczamy wszystko w klauzuli IfModule, która zadba o to by w razie problemów/braku modułu apache wystartował normalnie.
<IfModule mod_headers.c>
# Wymuszanie HTTPS
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
# Polityka bezpieczeństwa treści
Header always set Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob:; font-src 'self'; connect-src 'self'; frame-src 'self'; object-src 'self'; media-src 'self'; child-src 'self'; frame-ancestors 'self'; form-action 'self'; manifest-src 'self'; upgrade-insecure-requests; block-all-mixed-content"
W razie problemów można ustawić script-src na 'self' 'unsafe-inline' 'unsafe-eval';
# Blokada osadzania w ramkach
Header always set X-Frame-Options "DENY"
# Zapobieganie sniffingowi MIME
Header always set X-Content-Type-Options "nosniff"
# Ograniczenie przekazywania refererów
Header always set Referrer-Policy "strict-origin-when-cross-origin"
# Ograniczenie API przeglądarki do powiadomień
Header always set Permissions-Policy "geolocation=(), microphone=(), camera=(), fullscreen=(), notifications=(self)"
# Ochrona przed atakami Cross-Origin
Header always set Cross-Origin-Opener-Policy "same-origin"
Header always set Cross-Origin-Embedder-Policy "require-corp"
Header always set Cross-Origin-Resource-Policy "same-origin"
# Ochrona przed fałszywymi certyfikatami SSL
Header always set Expect-CT "max-age=86400, enforce"
# Ukrycie wersji serwera
ServerTokens Prod
ServerSignature Off
# Blokada nieautoryzowanych aplikacji Flash i PDF
Header always set X-Permitted-Cross-Domain-Policies "none"
# Izolacja stron w przeglądarce
Header always set Origin-Agent-Cluster "?1"
# Wyłączenie cache dla dynamicznych treści
Header always set Cache-Control "no-store, no-cache, must-revalidate, max-age=0"
Header always set Pragma "no-cache"
# Ograniczenie CORS (jeśli nie obsługujesz API)
Header always set Access-Control-Allow-Origin "same-origin"
# Blokuje dostęp do geolokalizacji, mikrofonu i kamery w starszych przeglądarkach.
Header always set Feature-Policy "geolocation 'none'; microphone 'none'; camera 'none'"
</IfModule>
Dodatkowe blokady
Dodatkowo możemy również ustawić:
# Wyłącza metodę HTTP TRACE, która może być używana do ataków XST.
TraceEnable off
# Zapobiega nieautoryzowanemu dostępowi do plików takich jak .htaccess, .env, repozytoriów Git/SVN.
<FilesMatch "(\.htaccess|\.env|\.git|\.svn|\.DS_Store)">
Require all denied
</FilesMatch>
# Uniemożliwia przeglądanie zawartości katalogów, jeśli brak pliku index.html/index.php.
Options -Indexes
Testy
Celem testu należy wykonać:
httpd -t
oraz w przypadku braku otrzymania błędu zrestartować usługę:
service httpd restart
Po czym możemy wejść od strony przeglądarki na daną stronę i w sekcji sieć, sprawdzić nagłówki które zostały ustawione dla naszej witryny.
Komentarze