Wussten Sie, dass die meisten Sicherheitslücken durch die Implementierung der erforderlichen Header im Antwort-Header behoben werden können?
Sicherheit ist genauso wichtig wie der Inhalt und die Suchmaschinenoptimierung Ihrer Website. Tausende von Websites werden aufgrund von Fehlkonfigurationen oder fehlendem Schutz gehackt. Wenn Sie Besitzer einer Website oder Sicherheitsingenieur sind und Ihre Website vor Clickjacking, Code-Injektion, MIME-Typen, XSS usw. schützen möchten, wird Ihnen dieser Leitfaden helfen
In diesem Artikel spreche ich über verschiedene HTTP-Header(empfohlen von OWASP), die Sie in mehreren Webservern, Netzwerk-Edge- und CDN-Anbietern implementieren sollten, um Ihre Website besser zu schützen
Anmerkungen
- Wir empfehlen Ihnen, ein Backup der Konfigurationsdatei zu erstellen, bevor Sie Änderungen vornehmen.
- Einige der Header werden möglicherweise nicht von allen Browsern unterstützt. Prüfen Sie daher vor der Implementierung die Kompatibilität.
- Mod_headers muss im Apache aktiviert sein, um diese Header zu implementieren. Stellen Sie sicher, dass die folgende Zeile in der Datei
httpd.conf
unkommentiert bleibt.
LoadModule headers_module modules/mod_headers.so
- Nach der Implementierung können Sie das Online-Tool für sichere Header verwenden, um die Ergebnisse zu überprüfen.
Fangen wir an...👨💻
HTTP Strict Transport Security
HSTS (HTTP Strict Transport Security) Header, um sicherzustellen, dass die gesamte Kommunikation von einem Browser über HTTPS (HTTP Secure) gesendet wird. Dies verhindert HTTPS-Klickaufforderungen und leitet HTTP-Anfragen auf HTTPS um
Bevor Sie diesen Header implementieren, müssen Sie sicherstellen, dass alle Seiten Ihrer Website über HTTPS zugänglich sind, da sie sonst blockiert werden
Der HSTS-Header wird von allen gängigen aktuellen Browser-Versionen wie IE, Firefox, Opera, Safari und Chrome unterstützt. Es gibt drei Parameter zur Konfiguration
Parameter Wert | Bedeutung |
max-age | Dauer (in Sekunden), um einem Browser mitzuteilen, dass Anfragen nur über HTTPS möglich sind. |
includeSubDomains | Die Konfiguration ist auch für die Subdomain gültig. |
vorladen | Verwenden Sie diese Option, wenn Sie möchten, dass Ihre Domain in die HSTS-Preload-Liste aufgenommen wird |
Nehmen wir auch ein Beispiel, bei dem HSTS für ein Jahr konfiguriert wurde, einschließlich Preload für Domain und Subdomain
Apache HTTP-Server
Sie können HSTS in Apache implementieren, indem Sie den folgenden Eintrag in der Datei httpd.conf hinzufügen
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Starten Sie Apache neu, um die Ergebnisse zu sehen
Nginx
Um HSTS in Nginx zu konfigurieren, fügen Sie den folgenden Eintrag in nginx.conf
unter der Direktive server (SSL) hinzu
add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains; preload'
Wie üblich müssen Sie Nginx neu starten, um zu überprüfen, ob
Cloudflare
Wenn Sie Cloudflare verwenden, können Sie HSTS mit nur wenigen Klicks aktivieren
- Melden Sie sich bei Cloudflare an und wählen Sie die Website aus
- Gehen Sie auf die Registerkarte "Krypto" und klicken Sie auf "HSTS aktivieren".
Wählen Sie die Einstellungen, die Sie benötigen, und die Änderungen werden sofort übernommen
Microsoft IIS
Starten Sie den IIS-Manager und fügen Sie den Header unter "HTTP Response Headers" für die entsprechende Website hinzu
Starten Sie die Website neu
X-Frame-Optionen
Verwenden Sie den X-Frame-Options-Header, um Clickjacking-Schwachstellen auf Ihrer Website zu verhindern. Durch die Implementierung dieser Kopfzeile weisen Sie den Browser an, Ihre Webseite nicht in einen Frame/iframe einzubetten. Diese Funktion wird von einigen Browsern nur eingeschränkt unterstützt, so dass Sie sie vor der Implementierung überprüfen müssen.
Sie können die folgenden drei Parameter konfigurieren
Parameter Wert | Bedeutung |
SAMEORIGIN | Frames/iframe von Inhalten sind nur von derselben Website erlaubt. |
DENY | Verhindert, dass eine beliebige Domain Ihren Inhalt mit Hilfe eines Frames/iframe einbettet. |
ALLOW-FROM | Erlaubt den Einrahmen von Inhalten nur auf einer bestimmten URI. |
Schauen wir uns an, wie Sie "DENY" implementieren, damit keine Domain die Webseite einbettet
Apache
Fügen Sie die folgende Zeile ein httpd.conf
ein und starten Sie den Webserver neu, um die Ergebnisse zu überprüfen
Header immer X-Frame-Options DENY anhängen
Nginx
Fügen Sie Folgendes in der nginx.conf
unter server directive/block hinzu
add_header X-Frame-Options "DENY"
Starten Sie neu, um die Ergebnisse zu überprüfen
F5 LTM
Erstellen Sie eine iRule mit folgendem Inhalt und verknüpfen Sie sie mit dem entsprechenden virtuellen Server
wenn HTTP_RESPONSE { HTTP::header insert "X-FRAME-OPTIONS" "DENY"
}
Sie brauchen nichts neu zu starten, die Änderungen werden sofort übernommen
WordPress
Sie können diesen Header auch über WordPress implementieren lassen. Fügen Sie Folgendes in eine wp-config.php-Datei ein
header('X-Frame-Optionen: DENY)
Wenn Sie mit der Bearbeitung der Datei nicht vertraut sind, können Sie ein Plugin verwenden , wie hier oder oben beschrieben
Microsoft IIS
Fügen Sie den Header hinzu, indem Sie zu "HTTP Response Headers" für die entsprechende Website gehen
Starten Sie die Website neu, um die Ergebnisse zu sehen
X-Content-Type-Options
Verhindern Sie Sicherheitsrisiken durch MIME-Typen, indem Sie diesen Header zum HTTP-Antwort Ihrer Webseite hinzufügen. Mit diesem Header wird der Browser angewiesen, Dateitypen als definiert zu betrachten und das Ausschnüffeln von Inhalten zu verbieten. Es gibt nur einen Parameter, den Sie hinzufügen müssen: "nosniff"
Sehen wir uns an, wie man diesen Header ankündigt
Apache
Fügen Sie dazu die folgende Zeile in die Datei httpd.conf ein
Header setze X-Content-Type-Options nosniff
Vergessen Sie nicht, den Apache-Webserver neu zu starten, damit die Konfiguration aktiv wird.
Nginx
Fügen Sie die folgende Zeile in der Datei ein nginx.conf
unter dem Server-Block hinzu
add_header X-Content-Type-Options nosniff
Wie üblich müssen Sie Nginx neu starten, um die Ergebnisse zu überprüfen
Microsoft IIS
Öffnen Sie IIS und gehen Sie zu HTTP Response Headers
Klicken Sie auf Hinzufügen und geben Sie den Namen und den Wert ein
Klicken Sie auf OK und starten Sie den IIS neu, um die Ergebnisse zu überprüfen.
Richtlinie für Inhaltssicherheit
Verhindern Sie XSS-, Clickjacking- und Code-Injection-Angriffe, indem Sie den Header Content Security Policy (CSP) in die HTTP-Antwort Ihrer Webseite implementieren. CSP weist den Browser an, nur zugelassene Inhalte auf die Website zu laden
Nicht alle Browser unterstützen CSP, so dass Sie sich vor der Implementierung vergewissern müssen. Es gibt drei Möglichkeiten, wie Sie CSP-Header erreichen können
- Content-Security-Policy - Stufe 2/1.0
- X-Content-Security-Policy - Veraltet
- X-Webkit-CSP - Abgelehnt
Wenn Sie noch die veraltete Version verwenden, sollten Sie ein Upgrade auf die neueste Version in Betracht ziehen
Es gibt mehrere Parameter für die Implementierung von CSP, und Sie können sich bei OWASP einen Überblick verschaffen. Lassen Sie uns jedoch die beiden am häufigsten verwendeten Parameter durchgehen
Parameter Wert | Bedeutung |
standard-src | Lädt alles von einer definierten Quelle |
skript-src | Lädt nur Skripte aus einer definierten Quelle |
Das folgende Beispiel zeigt, wie Sie in verschiedenen Webservern alles von der gleichen Quelle laden
Apache
Fügen Sie Folgendes in die Datei ein httpd.conf
ein und starten Sie den Webserver neu, damit es wirksam wird
Header-Set Content-Security-Policy "default-src 'self';"
Nginx
Fügen Sie im Serverblock der Datei nginx.conf
Folgendes hinzu
add_header Content-Security-Policy "default-src 'self';"
Microsoft IIS
Gehen Sie im IIS-Manager zu den HTTP-Antwort-Headern für Ihre jeweilige Site und fügen Sie Folgendes hinzu
Sehen Sie sich dies an, um frame-ancestors mit CSP zu implementieren. Dies ist eine erweiterte Version von X-Frame-Options
X-Permitted-Cross-Domain-Policies
Verwenden Sie Adobe-Produkte wie PDF, Flash usw.?
Sie können diesen Header implementieren, um dem Browser mitzuteilen, wie er die Anfragen über eine Cross-Domain behandeln soll. Durch die Implementierung dieses Headers schränken Sie das Laden der Assets Ihrer Website von anderen Domains ein, um Ressourcenmissbrauch zu vermeiden.
Es sind einige Optionen verfügbar
Wert | Beschreibung |
keine | keine Richtlinie ist erlaubt |
nur Master-Richtlinie | nur die Master-Richtlinie zulassen |
alle | alles ist erlaubt |
nur nach Inhalt | Lassen Sie nur eine bestimmte Art von Inhalt zu. Beispiel - XML |
by-ftp-only | gilt nur für einen FTP-Server |
Apache
Wenn Sie keine Richtlinie zulassen möchten
Header-Set X-Permitted-Cross-Domain-Policies "keine"
Sie sollten den Header wie folgt sehen
Nginx
Angenommen, Sie möchten Master-only implementieren, dann fügen Sie Folgendes in der nginx.conf
unter dem Server-Block
hinzu
add_header X-Permitted-Cross-Domain-Policies master-only
Und das Ergebnis
Referenten-Richtlinie
Möchten Sie die Referrer-Policy für Ihre Website kontrollieren? Es gibt einige Vorteile für den Datenschutz und die Sicherheit. Allerdings werden nicht alle Optionen von allen Browsern unterstützt. Prüfen Sie daher vor der Implementierung Ihre Anforderungen
Referrer-Policy unterstützt die folgende Syntax
Wert | Beschreibung |
no-referrer | Referrer-Informationen werden nicht mit der Anfrage gesendet. |
no-referrer-when-downgrade | Die Standardeinstellung, bei der der Referrer an dasselbe Protokoll gesendet wird wie HTTP an HTTP, HTTPS an HTTPS. |
unsichere-URL | die vollständige URL wird mit der Anfrage gesendet. |
gleiche Herkunft | Der Referrer wird nur für dieselbe Ursprungsseite gesendet. |
strenge Herkunft | wird nur gesendet, wenn ein Protokoll HTTPS ist |
strikter-ursprung-wenn-quer-ursprung | die vollständige URL wird über ein strenges Protokoll wie HTTPS gesendet |
ursprung | sendet die Ursprungs-URL in allen Anfragen |
herkunft-wenn-quer-ursprung | sendet die VOLLSTÄNDIGE URL über denselben Ursprung. In anderen Fällen senden Sie jedoch nur die Ursprungs-URL. |
Apache
Sie können Folgendes hinzufügen, wenn Sie no-referrer einstellen möchten
Header set Referrer-Policy "no-referrer"
Und nach dem Neustart sollten Sie in den Antwort-Headern haben
Nginx
Angenommen, Sie müssen denselben Ursprung implementieren, dann müssen Sie Folgendes hinzufügen
add_header Referrer-Policy same-origin
Nach der Konfiguration sollten Sie die folgenden Ergebnisse erhalten
Expect-CT
Ein neuer Header, der sich noch im experimentellen Status befindet, soll den Browser anweisen, die Verbindung mit Webservern auf Zertifikatstransparenz (CT) zu überprüfen. Dieses Projekt von Google zielt darauf ab, einige Schwachstellen im SSL/TLS-Zertifikatssystem zu beheben
Die folgenden drei Variablen sind für den Expect-CT-Header verfügbar
Wert | Beschreibung |
max-age | In Sekunden, wie lange der Browser die Richtlinie zwischenspeichern soll. |
erzwingen | Eine optionale Anweisung zur Durchsetzung der Richtlinie. |
report-uri | Browser, der einen Bericht an die angegebene URL sendet, wenn keine gültige Zertifikatstransparenz empfangen wird. |
Apache
Angenommen, Sie möchten diese Richtlinie durchsetzen, melden und 12 Stunden lang zwischenspeichern, dann müssen Sie Folgendes hinzufügen
Header set Expect-CT 'enforce, max-age=43200, report-uri="https://somedomain.com/report"'
Und hier ist das Ergebnis
Nginx
Was, wenn Sie 1 Stunde lang berichten und zwischenspeichern möchten?
add_header Expect-CT 'max-age=60, report-uri="https://mydomain.com/report"'
Die Ausgabe würde lauten
Berechtigungs-Policy
Früher als Feature-Policy bekannt, wurde sie in Permissions-Policy mit erweiterten Funktionen umbenannt. Hier können Sie die wichtigsten Änderungen zwischen Feature-Policy und Permissions-Policy nachlesen
Mit der Permissions-Policy können Sie Browserfunktionen wie Geolokalisierung, Vollbild, Lautsprecher, USB, Autoplay, Lautsprecher, Mikrofon, Zahlung, Batteriestatus usw. innerhalb einer Webanwendung aktivieren oder deaktivieren. Durch die Implementierung dieser Richtlinie ermöglichen Sie Ihrem Server, einen Client (Browser) anzuweisen, die Funktionen der Webanwendung zu befolgen
Apache
Angenommen, Sie möchten die Vollbildfunktion deaktivieren. Dazu können Sie in der Datei httpd.conf
oder apache2.conf
Folgendes hinzufügen, je nachdem, welche Variante des Apache HTTP-Servers Sie verwenden
Header immer setzen Permissions-Policy "fullscreen 'none' "
Wie wäre es, mehrere Funktionen in einer einzigen Zeile hinzuzufügen?
Auch das ist möglich!
Kopfzeile
always set Permissions-Policy "fullscreen 'none'; microphone 'none'"
Starten Sie Apache HTTP neu, um das Ergebnis zu sehen
HTTP/1.1 200 OK
Datum: Thu, 29 Apr 2021 06:40:43 GMT
Server: Apache/2.4.37 (centos)
Permissions-Policy: fullscreen 'none'; microphone 'none'
Last-Modified: Thu, 29 Apr 2021 06:40:41 GMT
ETag: "3-5c116c620a6f1"
Accept-Ranges: bytes
Content-Length: 3
Keep-Alive: timeout=5, max=100
Verbindung: Keep-Alive
Inhalt-Typ: text/html; charset=UTF-8
Der obige Code weist den Browser an, den Vollbildmodus und das Mikrofon zu deaktivieren.
Sie können die Funktion auch ganz deaktivieren, indem Sie die allowlist leer lassen.
Sie können zum Beispiel Folgendes hinzufügen, um die Geolocation-Funktion zu deaktivieren
Kopfzeile setzt immer Permissions-Policy "geolocation=()"
Dies würde im Browser wie folgt ausgegeben werden
HTTP/1.1 200 OK
Datum: Thu, 29 Apr 2021 06:44:19 GMT
Server: Apache/2.4.37 (centos)
Permissions-Policy: geolocation=()
Last-Modified: Thu, 29 Apr 2021 06:40:41 GMT
ETag: "3-5c116c620a6f1"
Accept-Ranges: bytes
Content-Length: 3
Keep-Alive: timeout=5, max=100
Verbindung: Keep-Alive
Inhalt-Typ: text/html; charset=UTF-8
Nginx
Nehmen wir ein anderes Beispiel - deaktivieren Sie die Vibrationsfunktion
add_header Permissions-Policy "vibrate 'none';"
Oder deaktivieren Sie die Geolokalisierung, die Kamera und den Lautsprecher
add_header Permissions-Policy "geolocation 'none'; camera 'none'; speaker 'none';"
Hier ist die Ausgabe nach dem Neustart von Nginx
HTTP/1.1 200 OK
Server: nginx/1.14.1
Datum: Thu, 29 Apr 2021 06:48:35 GMT
Content-Type: text/html
Content-Length: 4057
Last-Modified: Mon, 07 Oct 2019 21:16:24 GMT
Connection: keep-alive
ETag: "5d9bab28-fd9"
Permissions-Policy: geolocation 'keine'; camera 'keine'; speaker 'keine';
Accept-Ranges: bytes
Die gesamte Nginx-Konfiguration wird unter dem http-Block
in der nginx.conf
oder in einer beliebigen benutzerdefinierten Datei gespeichert, die Sie verwenden
Website-Daten löschen
Wie der Name schon vermuten lässt, ist die Implementierung eines Clear-Site-Data-Headers eine gute Möglichkeit, einem Client mitzuteilen, dass er Browserdaten wie Cache, Speicher, Cookies oder alles andere löschen soll. Damit haben Sie mehr Kontrolle darüber, wie Sie die Daten der Website im Browser speichern möchten.
Apache
Angenommen, Sie möchten den Ursprungs-Cache löschen, können Sie Folgendes hinzufügen
Header immer Clear-Site-Data "cache" setzen
Die HTTP-Antwort sieht dann wie folgt aus
HTTP/1.1 200 OK
Datum: Thu, 29 Apr 2021 07:52:14 GMT
Server: Apache/2.4.37 (centos)
Clear-Site-Data: cache
Last-Modified: Thu, 29 Apr 2021 06:40:41 GMT
ETag: "3-5c116c620a6f1"
Accept-Ranges: bytes
Content-Length: 3
Keep-Alive: timeout=5, max=100
Verbindung: Keep-Alive
Inhalt-Typ: text/html; charset=UTF-8
oder, um alles zu löschen
Header immer Clear-Site-Data "*" setzen
Nginx
Lassen Sie uns Nginx so einstellen, dass Cookies gelöscht werden
add_header Clear-Site-Data "Cookies"
Und Sie sehen die folgende Ausgabe
HTTP/1.1 200 OK
Server: nginx/1.14.1
Datum: Thu, 29 Apr 2021 07:55:58 GMT
Content-Type: text/html
Content-Length: 4057
Last-Modified: Mon, 07 Oct 2019 21:16:24 GMT
Connection: keep-alive
ETag: "5d9bab28-fd9"
Clear-Site-Data: cookies
Accept-Ranges: bytes
Schlussfolgerung
Die Absicherung einer Website ist eine Herausforderung, und ich hoffe, dass Sie durch die Implementierung der oben genannten Header eine zusätzliche Sicherheitsebene schaffen. Wenn Sie eine geschäftliche Website betreiben, können Sie auch den Einsatz einer Cloud-WAF wie SUCURI in Betracht ziehen, um Ihr Online-Geschäft zu schützen. Das Gute an SUCURI ist, dass es sowohl Sicherheit als auch Leistung bietet
Wenn Sie sich für SUCURI WAF entscheiden, finden Sie unter der Registerkarte Firewall >> Sicherheit einen Abschnitt mit zusätzlichen Headern