Flask Standort penetration tests: security headers und die session cookie
Penetration testing ist eine einfache Möglichkeit, um zu überprüfen, ob Ihre Website für böswillige Angriffe anfällig ist.
Sie haben eine Flask Webanwendung erstellt, sie läuft einwandfrei und verwendet https. Aber ist es sicher genug? Haben Sie alles getan, um Ihre Besucher zu schützen, haben Sie alles getan, um böswillige Angriffe zu verhindern?
Ein guter Weg, dies zu tun, ist pentest Ihre Website. Penetration testing Tools oder Stift-Test-Tools können Sicherheitsschwächen identifizieren. Sie identifizieren Schwachstellen in der Webanwendung, die eine Sicherheitsverletzung verursachen können.
Wikipedia: Der National Cyber Security Center, beschreibt den Penetrationstest wie folgt: "Eine Methode, um die Sicherheit eines IT-Systems zu gewährleisten, indem versucht wird, die Sicherheit dieses Systems teilweise oder ganz zu verletzen, wobei die gleichen Werkzeuge und Techniken wie bei einem Gegner verwendet werden.
Die meisten pentest -Tools müssen installiert sein und natürlich nicht auf Ihrem lokalen Rechner, sondern irgendwo im Internet, damit Sie Ihre Produktionsstätte testen können, ohne firewalls, NAT. Irgendwann werde ich diese Tools genauer unter die Lupe nehmen, aber vorerst wollte ich nur einen Hinweis auf mögliche Schwachstellen haben.
Ich habe einen Online-Test von Pentest-Tools.com verwendet, siehe Link unten, Sie erhalten zwei kostenlose Tests. Wählen Sie die Website Vulnerability Scanner, geben Sie die URL Ihrer Website ein und lehnen Sie sich zurück und warten Sie auf die Ergebnisse. Natürlich ist dies nur ein sehr, sehr, sehr einfacher Test, aber immerhin hat er mir gezeigt, dass meine Seite security headers fehlte und dass der session cookie nicht sicher war. Ich habe auch Dareboost benutzt, siehe Link unten, ihr Website Speed Test and Website Analysis Test gab mir einen schönen Quality and Performance Bericht.
Fehlende security headers ergänzen
Es ist sehr einfach, die fehlende security headers zu Ihrer Flask Seite hinzuzufügen. Zuerst habe ich eine Funktion, die die zusätzlichen Header hinzufügt, ich benutze das Flag include_security_headers für Sites, die tatsächlich im Internet sind.
from werkzeug.http import http_date
import datetime
def prepare_response_extra_headers(include_security_headers):
response_extra_headers = {
# always
'Cache-Control': 'no-cache, no-store, must-revalidate',
'Pragma': 'no-cache',
'Expires': '0',
'Last-Modified': http_date(datetime.datetime.now()),
}
if include_security_headers:
response_security_headers = {
# X-Frame-Options: page can only be shown in an iframe of the same site
'X-Frame-Options': 'SAMEORIGIN',
# ensure all app communication is sent over HTTPS
'Strict-Transport-Security': 'max-age=63072000; includeSubdomains',
# instructs the browser not to override the response content type
'X-Content-Type-Options': 'nosniff',
# enable browser cross-site scripting (XSS) filter
'X-XSS-Protection': '1; mode=block',
}
response_extra_headers.update(response_security_headers)
return response_extra_headers
Dann, in create_app() füge ich die zusätzlichen Header der Antwort in after_request hinzu:
...
include_security_headers = config_name in ['staging', 'production']
...
# prepare extra response headers, see after_request
response_extra_headers = prepare_response_extra_headers(include_security_headers)
...
@app.after_request
def after_request(response):
# after_request is not called for 500 error
response.headers.extend(response_extra_headers)
return response
Bitte beachten Sie, dass wir Extend statt Update verwenden, siehe die Informationen zu Werkzeugdatenstrukturen.
Sichern des session cookie
Über die session cookie, meine Website ist mit https, http-Anfragen werden auf https umgeleitet, was ist also das Problem? Das Problem ist, dass das Cookie nicht bei der ersten (!) Anfrage von Ihrem Browser kommen muss. Sie können den HTTP Strict Transport Security (HSTS)-Header setzen und https erzwingen, aber das löst das Problem nicht, da nicht alle Browser diesen Header unterstützen.
Der einzige Weg, wie Sie Ihre session cookie sichern können, ist das Hinzufügen des Attributs "Cookie-Secure". Ich bin immer noch nicht sicher, ob damit alles gelöst ist, aber es ist kein Aufwand zur Umsetzung. In Flask machen wir einfach:
SESSION_COOKIE_SECURE = True
Wenn Sie Flask-Login und die 'remember me'-Funktionalität verwenden, dann fügen Sie auch hinzu:
REMEMBER_COOKIE_SECURE = True
REMEMBER_COOKIE_HTTPONLY = True
Ein weiteres (unlösbares) Sicherheitsproblem: Passwörter im Speicher
Es gibt noch ein weiteres Sicherheitsproblem, wenn Sie eine Website auf einem VPS betreiben (Virtual Private Server). Passwörter werden über https gesendet, aber auf dem Server entschlüsselt. Anschließend werden sie nach bewährten Verfahren verschlüsselt und in der Datenbank gespeichert.
Selbst wenn der Server gepatcht wurde, um Schwachstellen wie Zombieload zu beseitigen, kann eine Person, die Zugriff auf den Server hat, den Speicher des Servers überwachen und die unverschlüsselten Passwörter sehen. Sie können das Kennwort auf dem Client mit Javascript verschlüsseln, aber dann kann sich der Angreifer trotzdem mit diesem verschlüsselten Wert anmelden. Das Minimum, das Sie tun können, ist einen zuverlässigen VPS-Provider zu bekommen.
Zusammenfassung
Ohne Penetrationstest hoffen Sie nur das Beste. Penetration testing ist eine sehr gute Möglichkeit, die Schwachstellen Ihrer Website zu überprüfen. Es ist nicht sehr schwierig, benötigt aber einige/mehrere Zeit. Denken Sie daran, dass das Betreiben einer Website auf einem VPS nie völlig sicher ist.
Links / Impressum
40 Best Penetration Testing (Pen Testing) Tools in 2020
https://www.guru99.com/top-5-penetration-testing-tools.html
Cookie Security for Flask Applications
https://blog.miguelgrinberg.com/post/cookie-security-for-flask-applications
Dareboost
https://www.dareboost.com/en
Data Structures
https://werkzeug.palletsprojects.com/en/0.15.x/datastructures/
HTTP Security Headers Analysis of Top One Million Websites
https://ccdcoe.org/uploads/2018/10/Art-18-HTTP-Security-Headers-Analysis-of-Top-One-Million-Websites.pdf
Mozilla Observatory
https://observatory.mozilla.org/
Penetration test
https://en.wikipedia.org/wiki/Penetration_test
Pentest-Tools.com
https://pentest-tools.com
Secure your Cookies (Secure and HttpOnly flags)
https://blog.dareboost.com/en/2019/03/secure-cookies-secure-httponly-flags/
Securing Cookies with HttpOnly and secure Flags
https://resources.infosecinstitute.com/securing-cookies-httponly-secure-flags/
Security Headers
https://securityheaders.com/
ZombieLoad attack lets hackers steal data from Intel chips
https://www.theverge.com/2019/5/14/18623708/zombieload-attack-intel-processors-speculative-execution
Mehr erfahren
Flask Pentesting
Neueste
- Ausblenden der Primärschlüssel der Datenbank UUID Ihrer Webanwendung
- Don't Repeat Yourself (DRY) mit Jinja2
- SQLAlchemy, PostgreSQL, maximale Anzahl von Zeilen pro user
- Anzeige der Werte in den dynamischen Filtern SQLAlchemy
- Sichere Datenübertragung mit Public Key Verschlüsselung und pyNaCl
- rqlite: eine hochverfügbare und distverteilte SQLite -Alternative
Meistgesehen
- Verwendung von Pythons pyOpenSSL zur Überprüfung von SSL-Zertifikaten, die von einem Host heruntergeladen wurden
- Verwendung von UUIDs anstelle von Integer Autoincrement Primary Keys mit SQLAlchemy und MariaDb
- PyInstaller und Cython verwenden, um eine ausführbare Python-Datei zu erstellen
- Verbindung zu einem Dienst auf einem Docker -Host von einem Docker -Container aus
- SQLAlchemy: Verwendung von Cascade Deletes zum Löschen verwandter Objekte
- Flask RESTful API Validierung von Anfrageparametern mit Marshmallow-Schemas