Pentests: Perspektive eines Django-Entwicklers

9 Mai 2023

Bei djangsters liegt uns die Sicherheit am Herzen. Wir legen so viel Wert darauf, dass der „Batterien-enthalten“-Ansatz von Django einer der Hauptgründe ist, warum es ein grundlegender Baustein für unsere Webanwendungen ist.

In den letzten Jahren haben wir begonnen, mit externen Sicherheitsprüfungen in Form von Penetrationstests (Pentests) zu arbeiten, um unser Sicherheitsportfolio zu erweitern. Obwohl dies eine neue Erfahrung für uns war, sind wir mit Begeisterung und ein wenig Skepsis an die Sache herangegangen. Dabei haben wir drei wichtige Erkenntnisse gewonnen:

  1. Es lohnt sich.
  2. Sicherheit ist wie eine Zwiebel.
  3. Wenn man das Sicherheits-Framework von Django richtig konfiguriert, kommt man sehr weit.

Aber eins nach dem Anderen: Bevor wir ins Detail gehen, sollten wir uns das Gesamtbild ansehen.

Der Prozess

An einem Pentest sind oft drei Parteien beteiligt. Ein Entwicklungsteam, eine interne Aufsichtsbehörde und eine Sicherheitsprüfstelle.

Das Entwicklungsteam ist für den Code und das Schließen von Sicherheitslücken verantwortlich. Die interne Aufsichtsbehörde schreibt die Tests vor und legt Standards fest, während die Sicherheitsprüfstelle die Probleme findet. Im Grunde handelt es sich also um ein Katz- und Mausspiel mit einem Schiedsrichter.

Es hört sich kompliziert an, ist aber relativ einfach und leicht zu verstehen, wenn man erst einmal angefangen hat.

Bei uns lief es folgendermaßen ab:

  1. Wir haben ein größeres Upgrade abgeschlossen, für das wir einen Pentest bestehen mussten
  2. Das Zeitfenster für den Pentest wurde auf ~ 24 bis 48 Stunden festgelegt
  3. Jede schwerwiegende Sicherheitslücke blockierte die Freigabe und musste innerhalb von 24 Stunden bearbeitet werden
  4. Wir erhielten den detaillierten Bericht innerhalb der nächsten 2 Wochen
  5. Wir kümmern uns um die Probleme mit mittlerer und niedriger Priorität, bis wir grünes Licht bekommen
  6. Freigabe 🚀

Der Bericht

Penetrationstestberichte werden in der Regel halbautomatisch erstellt und sortieren die Probleme in Kategorien mit niedriger, mittlerer und hoher Priorität.

Probleme mit niedriger Priorität sind wünschenswert gelöst zu werden, aber stellen keine aktuelle Gefahr dar. Zum Beispiel eine öffentlich einsehbare Versionsnummer einer beteiligten Software. Diese sind in der Regel nicht blockierend und verhindern kein grünes Licht.

Probleme mittlerer Priorität sind Voraussetzung für grünes Licht und sind oft nicht vollständig umgesetzte Sicherheitsmaßnahmen.

Probleme hoher Priorität oder kritische Probleme sind ausnutzbare Schwachstellen. Diese MÜSSEN vor allen anderen Problemen behoben werden, da sie eine klare und akute Gefahr darstellen.

Eindruck der Entwickler

Jetzt kommt der heikle Teil für jeden Softwareentwickler: Ist ein Pentest eine Bewertung der eigenen Arbeit? Ist jedes gemeldete Problem ein vernichtendes Urteil der Qualität und ein mahnender Fingerzeig auf einen?

Nein.

Pentest-Berichte sind im Grunde nur eine weitere Ebene der Codeüberprüfung. Diese Prioritäten und Bewertungen sind eine externe und unabhängige Sicht auf die eigene Arbeit. Es mag verlockend sein, sie nur als Checkliste zu verwenden, um grünes Licht zu bekommen, aber ein besserer Ansatz ist, sie als Lernerfahrung zu nutzen.

Manche sind vielleicht nicht relevant, manche sind unbedeutend, aber sie sind alle gut gemeinte Vorschläge, wo und wie man sich verbessern kann. Letztendlich hast du natürlich den Code geschrieben und weißt am besten, wo die Leichen im Keller sind, ein Pentest sagt dir nur, wo es müffelt.

Allgemeine Tipps

Wie bereits erwähnt, nimmt Django die Sicherheit sehr ernst. Der beste Tipp, den wir geben können, ist, die Django-Einstellungen durchzugehen und sie auf härtende Sicherheitseinstellungen zu überprüfen. Weil es einfach ist, Debug-Konfiguration zu übersehen, hat es Django so eingerichtet, dass man nicht raten muss, wo diese zu finden sind, großartig. Es gibt ein Sicherheitsdokument, in dem die bewährten Methoden beschrieben sind.

Ein gutes Release-Management und die Verwendung von Umgebungsvariablen sind ebenfalls hilfreich, aber das ist ein Thema für ein anderes Mal.

Hier ein paar nicht offensichtliche Tipps, die helfen können, die Prüfung zu bestehen:

  • Content Security Policy (“Richtlinie für die Sicherheit der Inhalte”) Header - es gibt eine großartige Middleware dafür
  • Passwortrichtlinien - Django bringt eine Menge Standardoptionen mit
  • Halten Sie Ihre Abhängigkeiten auf dem neuesten Stand - Tools wie Dependabot helfen dir hier weiter
  • Stelle angemessene Aufrufbegrenzungen und Timeouts sicher

Lass mich noch einmal betonen, wie großartig nicht nur Django als Framework ist, sondern auch seine Dokumentation. Wenn du nur wenig Zeit für Sicherheitsmaßnahmen hast, genügt es, das Django-Sicherheitsdokument zu befolgen und die konfigurierten Einstellungen zu überprüfen und deren Einfluss auf dein Setup zu verstehen. Dadurch sollte die Sicherheit deines Webanwendungs-Backends bereits auf ein angemessenes Niveau gebracht worden sein.

Fazit

Zurück zu unseren wichtigsten Erkenntnissen. Während ein anständig arbeitendes Entwicklungsteam, das ein anständiges Framework (👋 Django 👋) verwendet und das Testen und Überprüfen ernst nimmt, höchstwahrscheinlich keine kritischen Sicherheitsprobleme übersehen wird, wird es ein paar mittlere geben. Diese scheinen ärgerlich und relativ harmlos zu sein, wie zum Beispiel ein fehlender CSP-Header, ein theoretischer Injektionsvektor oder eine schwache Kennwortrichtlinie, aber sie können als Sprungbrett für gefährlichere Angriffe dienen.

Bei der Entwicklung einer Webanwendung ist es jedoch fast unmöglich, alle Sicherheitsebenen im Blick zu haben. Konzentriere dich daher am besten auf die Anwendungsschicht und lass die Pentester ihre Arbeit machen. Deren Input hilft dir sehr dabei, dein gesamtes Sicherheitskonzept zu verbessern.

Wenn du neugierig auf das Was und Wie des Pentests aus der Perspektive eines Pentesters sind, lesen sie diesen Artikel von unseren Freunden und Partnern bei Lutra Security auf Englisch.

djangsters GmbH

Vogelsanger Straße 187
50825 Köln