Vollständiges Handbuch zum Konfigurieren von HTTP-Headern für die Sicherheit


Unternehmen, die Security Scorecards verkaufen, nehmen zu, ihr Einfluss auf den Unternehmensumsatz wächst. Darüber hinaus gibt es diejenigen, die durch die niedrige Sicherheitsbewertung der Verkäufer verwirrt sind, und diejenigen, die sich mindestens einmal beim Betrachten der Bewertung geweigert haben, zu kaufen - ich habe mit solchen Leuten gesprochen.


Ich habe mir angesehen, wie diese Unternehmen die Sicherheitsleistung anderer Unternehmen berechnen. Es stellte sich heraus, dass sie eine Kombination aus der Verwendung des HTTP-Headers für die Sicherheit und die Reputation von IP-Adressen in Betracht zogen.


Die Reputation einer IP-Adresse basiert auf Daten der Blacklist und der Spammerliste, kombiniert mit Informationen über den Eigentümer der öffentlichen IP-Adresse. Grundsätzlich sollte es sauber sein, wenn Ihr Unternehmen keinen Spam sendet und in der Lage ist, böswillige Implementierungen schnell zu identifizieren und zu stoppen. Die Verwendung des HTTP-Sicherheitsheaders wird auf dieselbe Weise berechnet wie Mozillas Observatorium .


Daher wird das Rating der meisten Unternehmen hauptsächlich durch die Überschriften bestimmt, die auf öffentlichen Websites für Sicherheitszwecke enthalten sind.


Das richtige Einstellen des Titels dauert nicht lange (es ist keine ernsthafte Überprüfung erforderlich), verbessert jedoch die Sicherheit der Website und hilft, Kunden nicht zu verlieren, für die Sicherheit keine leere Phrase ist


Ich bezweifle den Wert der genannten Überprüfungsmethode, außerdem ist der Preis für den Service exorbitant. Es ist unwahrscheinlich, dass die Anbieter dieses Dienstes die Sicherheit einer Ressource mit der angegebenen Genauigkeit bestimmen können. Die Situation unterstreicht jedoch noch einmal, wie wichtig es ist, sich hinzusetzen und sich Zeit zu nehmen, um die richtigen Überschriften einzuschalten und einzurichten.


In diesem Artikel werde ich über die am häufigsten überprüften Header sprechen, für jeden werde ich Sicherheitswerte empfehlen und ein Beispiel für Einstellungen geben. Am Ende werde ich Beispiele für Einstellungen für gängige Anwendungen und Webserver geben.


Wichtige Sicherheitskopfzeilen


Inhaltssicherheitsrichtlinie


CSP wird verwendet, um Cross-Site-Scripting zu verhindern - indem festgelegt wird, welche Ressourcen heruntergeladen werden können. Aus der gesamten Liste geht hervor, dass diese Überschrift mehr Zeit als die anderen benötigt, um sie zu erstellen und ordnungsgemäß zu unterstützen, und noch mehr andere sind gefährdet. Überprüfen Sie dies bei der Entwicklung eines CSP sorgfältig. Wenn Sie die von Ihnen verwendete Quelle plötzlich blockieren, stören Sie die Funktionalität Ihrer eigenen Site.


Für die vorläufige Version können Sie ein wunderbares Tool verwenden - eine Erweiterung für den Mozilla-Browser Laboratory CSP . Installieren Sie es in einem Browser, studieren Sie sorgfältig die Site, für die Sie einen CSP erstellen möchten, und verwenden Sie dann den generierten CSP auf Ihrer Site. Im Idealfall müssen Sie JavaScript noch überarbeiten, damit Sie die unsichere Inline-Direktive entfernen können.


CSP mag kompliziert und verwirrend erscheinen. Wenn Sie sich also eingehender mit dem Thema befassen möchten, besuchen Sie die offizielle Website .


Sie können CSP wie folgt vorkonfigurieren (auf einer Kampfseite sind höchstwahrscheinlich viele Änderungen erforderlich). Fügen Sie jedem Abschnitt Ihrer Website Domains hinzu.


# Default to only allow content from the current site # Allow images from current site and imgur.com # Don't allow objects such as Flash and Java # Only allow scripts from the current site # Only allow styles from the current site # Only allow frames from the current site # Restrict URL's in the <base> tag to current site # Allow forms to submit only to the current site Content-Security-Policy: default-src 'self'; img-src 'self' https://i.imgur.com; object-src 'none'; script-src 'self'; style-src 'self'; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; 

Strenge Transportsicherheit


Dieser Header teilt dem Browser mit, dass Sie die Site nur über das HTTPS-Protokoll aufrufen können. Aktivieren Sie sie immer, wenn HTTPS auf Ihrer Site aktiviert ist. Fügen Sie es gegebenenfalls in alle verwendeten Subdomains ein.


 Strict-Transport-Security: max-age=3600; includeSubDomains 

X-Content-Type-Optionen


Dank dieses Headers halten sich die Browser an die von der Anwendung installierten MIME-Typen, wodurch einige Cross-Site-Scripting-Angriffe verhindert werden.


Es verringert auch das Risiko eines unerwarteten Anwendungsverhaltens, wenn der Browser den Inhaltstyp auf der Website falsch „errät“ - beispielsweise wenn der Entwickler eine „HTML“ -Seite festlegt und der Browser JavaScript sieht und versucht, die Seite entsprechend zu rendern. Dank dieses Headers behält der Browser außerdem immer die vom Server installierten MIME-Typen bei.


 X-Content-Type-Options: nosniff 

Cache-Kontrolle


Dieser ist ärmer als die anderen, da Sie für verschiedene Arten von Inhalten wahrscheinlich unterschiedliche Caching-Richtlinien benötigen.


Es sollten keine vertraulichen Informationen wie Benutzer- oder Produktzahlungsseiten zwischengespeichert werden. Einer der Gründe dafür ist, dass ein anderer Computerbenutzer die Zurück-Taste nicht drückt, den Verlauf nicht liest und die persönlichen Daten eines anderen Benutzers nicht sieht.


Sie können und sollten jedoch die Seiten zwischenspeichern, die selten aktualisiert werden, z. B. statische Ressourcen (Bilder, CSS- und JS-Dateien). Das Caching kann seitenweise oder mithilfe von Regex in den Servereinstellungen konfiguriert werden.


 # Don't cache by default Header set Cache-Control no-cache # Cache static assets for 1 day <filesMatch ".(css|jpg|jpeg|png|gif|js|ico)$"> Header set Cache-Control "max-age=86400, public" </filesMatch> 

Läuft ab


Dieser Header legt die Zeit fest, zu der die aktuelle Anforderung zwischengespeichert wird. Es wird ignoriert, wenn der Cache-Control-Header für das maximale Alter aktiviert ist. Daher aktivieren wir ihn nur, wenn ein einfacher Scanner ihn überprüft - ausgenommen Caching-Steuerelemente.


Wir gehen davon aus, dass der Browser aus Sicherheitsgründen nichts zwischenspeichert, sodass das Datum in der Kopfzeile immer in der Vergangenheit liegt.


 Expires: 0 

X-Frame-Optionen


Dieser Header ermöglicht die Anzeige der Site in einem iFrame.


Durch das Platzieren Ihrer Website in einem iFrame erhält eine böswillige Ressource die Möglichkeit, einen Clickjacking-Angriff auszuführen. Sie startet eine Art JavaScript, das den Benutzer dazu verleitet, auf den iFrame zu klicken, und beginnt dann mit der Interaktion mit der Ressource über seinen Benutzernamen (d. H. Eine Person klickt auf einen böswilligen Link oder eine schädliche Schaltfläche) ohne es zu wissen!).


Dieser Header sollte immer so konfiguriert sein, dass er fehlschlägt, mit der Ausnahme, dass Sie absichtlich Frames verwenden. Dann muss der Header auf dieselbe Quelle gesetzt werden. Wenn Sie standardmäßig Frames mit einer anderen Site verwenden, führen Sie eine Whitelist für die Domain eines Drittanbieters durch.


Es sollte auch beachtet werden, dass dieser Header durch die CSP-Frame-Ancestors-Direktive ersetzt wird. Ich empfehle, es vorerst einzuschalten, aber nur um die Tools zum Überprüfen der Header zu schließen, werden sie es höchstwahrscheinlich in Zukunft entfernen.


 X-Frame-Options: deny 

Zugriffskontrolle-Zulassen-Ursprung


Dieser Header teilt dem Browser mit, welcher externe Code von Websites von Drittanbietern das Recht hat, Anforderungen an eine bestimmte Seite zu richten. Die Standardeinstellungen sind normalerweise korrekt, Sie können sie jedoch bei Bedarf ändern.


Beispielsweise enthält Site A eine Art JavaScript, das eine Anfrage an Site B stellen möchte. Site B sollte auf diese Anfrage antworten - wenn der Header Site A erlaubt, eine Anfrage zu stellen. Wenn Sie viele Quellen konfigurieren müssen, lesen Sie die Details auf der MDN-Seite .


Hier kann man ein wenig verwirrt sein, deshalb habe ich ein Diagramm erstellt - um zu veranschaulichen, wie dieser Header funktioniert:



Datenstrom mit Access-Control-Allow-Origin


 Access-Control-Allow-Origin: http://www.one.site.com 


Stellen Sie sicher, dass Ihre Cookies nur über das HTTPS-Protokoll (mit Verschlüsselung) gesetzt werden und nicht über JavaScript zugänglich sind. Diese Dateien können nur gesendet werden, wenn Ihre Site auch HTTPS unterstützt, wie es sein sollte. Sie müssen immer diese Flags setzen:


  • Sicher
  • Nur HTTPOn

Beispiel für eine Cookie-Definition:


 Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>; Secure; HttpOnly 

Lesen Sie mehr in der hervorragenden Mozilla-Cookie-Dokumentation .


X-XSS-Schutz


Dieser Header weist den Browser an, die erkannten Cross-Site-Scripting-Angriffe abzubrechen. Wenn Sie es einschalten, gehen Sie kein großes Risiko ein, sondern testen es, bevor Sie es in die Produktionsumgebung starten.


 X-XSS-Protection: 1; mode=block 

Beispiel für Webservereinstellungen


Im Allgemeinen ist es in den Servereinstellungen am besten, der gesamten Site Header hinzuzufügen. Cookies sind eine Ausnahme, da sie in der Anwendung selbst definiert sind.


Ich rate Ihnen, vor dem Hinzufügen von Headern zur Site zunächst das Observatorium zu überprüfen oder die Header manuell zu überprüfen - überprüfen Sie, welche bereits installiert sind. Einige Site- und Server-Engines installieren alles selbst. Implementieren Sie also einfach die benötigten Header oder ändern Sie die Header, die sie benötigen.


Apache-Konfiguration


Beispiel für eine Apache-Konfiguration in .htaccess:


 <IfModule mod_headers.c> ## CSP Header set Content-Security-Policy: default-src 'self'; img-src 'self' https://i.imgur.com; object-src 'none'; script-src 'self'; style-src 'self'; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; ## General Security Headers Header set X-XSS-Protection: 1; mode=block Header set Access-Control-Allow-Origin: http://www.one.site.com Header set X-Frame-Options: deny Header set X-Content-Type-Options: nosniff Header set Strict-Transport-Security: max-age=3600; includeSubDomains ## Caching rules # Don't cache by default Header set Cache-Control no-cache Header set Expires: 0 # Cache static assets for 1 day <filesMatch ".(ico|css|js|gif|jpeg|jpg|png|svg|woff|ttf|eot)$"> Header set Cache-Control "max-age=86400, public" </filesMatch> </IfModule> 

Nginx-Konfiguration


 ## CSP add_header Content-Security-Policy: default-src 'self'; img-src 'self' https://i.imgur.com; object-src 'none'; script-src 'self'; style-src 'self'; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; ## General Security Headers add_header X-XSS-Protection: 1; mode=block; add_header Access-Control-Allow-Origin: http://www.one.site.com; add_header X-Frame-Options: deny; add_header X-Content-Type-Options: nosniff; add_header Strict-Transport-Security: max-age=3600; includeSubDomains; ## Caching rules # Don't cache by default add_header Cache-Control no-cache; add_header Expires: 0; # Cache static assets for 1 day location ~* \.(?:ico|css|js|gif|jpe?g|png|svg|woff|ttf|eot)$ { try_files $uri @rewriteapp; add_header Cache-Control "max-age=86400, public"; } 

Header-Einstellung auf Anwendungsebene


Wenn Sie keinen Zugriff auf den Webserver haben oder die Anforderungen zum Festlegen der Header komplex sind, müssen Sie sie wahrscheinlich in der Anwendung selbst konfigurieren. Normalerweise erfolgt dies für die gesamte Site mithilfe von Middleware oder basierend auf einer einmaligen Einstellung der Header für jede Anforderung.


Der Kürze halber habe ich in jedem Beispiel nur eine Überschrift eingefügt. Sie fügen auf die gleiche Weise alles hinzu, was benötigt wird.


Knoten und Express:


Fügen Sie einen globalen Mount-Pfad hinzu:


 app.use(function(req, res, next) { res.header('X-XSS-Protection', 1; mode=block); next(); }); 

Java und Frühling


Ich habe wenig Erfahrung mit Spring, aber Baeldung hat eine großartige Anleitung zum Einrichten von Headern im Frühjahr.


Php


Ich bin nicht mit verschiedenen PHP-Umgebungen vertraut. Suchen Sie nach Middleware für Abfragen. Für eine einzelne Anfrage ist alles einfach.


 header("X-XSS-Protection: 1; mode=block"); 

Python / Django


Django enthält anpassbare Sicherheits-Middleware , die all dies für Sie erledigt. Aktivieren Sie sie zuerst.


Die Antworten einiger Seiten können als Wörterbuch interpretiert werden. Django hat eine spezielle Methode, um mit Caching zu arbeiten. Wenn Sie Caching-Header auf diese Weise konfigurieren möchten, müssen Sie sich damit vertraut machen.


 response = HttpResponse() response["X-XSS-Protection"] = "1; mode=block" 

Schlussfolgerungen


Das Einrichten von Headern ist relativ einfach und schnell, erhöht jedoch die Sicherheit der Website - im Hinblick auf den Datenschutz durch standortübergreifendes Scripting und Click-Jacking.


In Zukunft schützen Sie sich vor dem Scheitern von Transaktionen, da Ihre Sicherheitsbewertung auf dem Niveau bleibt. Die Praxis, es anhand der von mir untersuchten Parameter zu bewerten, gewinnt zunehmend an Bedeutung, und es scheint mir, dass seine Rolle in den kommenden Jahren im Bereich Vertrieb nur noch zunehmen wird.


Lassen Sie mich wissen, wenn ich eine wichtige Überschrift verpasst habe!

Source: https://habr.com/ru/post/de471746/


All Articles