Wenn es um Sicherheit geht, ist es sehr sinnvoll, diese möglichst früh im Entwicklungsprozess einer Software zu verankern. DefectDojo ist ein Vulnerability-Management-Tool, das Entwicklerteams und Admins dabei hilft, Schwachstellen zu identifizieren, nachzuverfolgen und zu beheben. Unser Workshop stellt Grundlagen, Architektur und praktische Nutzung des freien Werkzeugs vor.
Schon seit Jahren ist DevOps bei den meisten Firmen in der Softwareentwicklung nicht mehr wegzudenken. Der Begriff steht für diverse Praktiken, Tools und eine Art Kulturphilosophie, die dabei helfen sollen, Prozesse zwischen der Entwicklungsabteilung und den IT-Teams zu automatisieren und zu verzahnen. Basierend auf den DevOps-Mechanismen hat sich in den letzten Jahren eine Weiterentwicklung herausgebildet: DevSecOps. Kurz gesagt handelt es sich dabei um DevOps plus Sicherheit. Etwas ausführlicher bedeutet dies, dass Sicherheit in jeder Phase des Software-Entwicklungsprozesses eine Rolle spielen sollte: vom ersten Design über Integration, Test und Bereitstellung bis hin zur Auslieferung.
Das Prinzip, dass die Bearbeitung von Aufgaben – in unserem Fall Security – möglichst zeitlich nach vorne in einer Prozesskette verlagert werden soll, heißt auch Shift-Left-Ansatz. Auf Container bezogen bedeutet dies, Sicherheitsaspekte schon beim Bau von Containern einzubeziehen. Das ergibt Sinn, denn Vorfälle in Produktivumgebungen lassen sich oft nur mit hohen Kosten beheben. Viel kostengünstiger ist es meist, wenn Fehler am Anfang des Entwicklungsprozesses gefunden werden. Im Umfeld von Shift-Left und DevSecOps haben sich in den letzten Jahren viele Tools auf dem Markt etabliert. Ein freies ist DefectDojo [1].
DefectDojo im Überblick
Ursprünglich wurde DefectDojo von Rackspace entwickelt, ist aber mittlerweile Open Source. An der Fortentwicklung der Software arbeitet die Community eifrig: Mittlerweile gibt es über 350 Contributers und das Produkt hat mehr als 2500 GitHub-Stars. Neue Features werden relativ häufig released – laut GitHub-Seite erfolgt etwa alle zwei Wochen eine Aktualisierung. Das Werkzeug integriert sich in eine große Reihe existierender Sicherheitstools – inklusive Security-Scanner, Issue-Tracker und Reporting-Werkzeuge – und zeigt deren Informationen in einer zentralen und leicht nachvollziehbaren Art und Weise an.
Schon seit Jahren ist DevOps bei den meisten Firmen in der Softwareentwicklung nicht mehr wegzudenken. Der Begriff steht für diverse Praktiken, Tools und eine Art Kulturphilosophie, die dabei helfen sollen, Prozesse zwischen der Entwicklungsabteilung und den IT-Teams zu automatisieren und zu verzahnen. Basierend auf den DevOps-Mechanismen hat sich in den letzten Jahren eine Weiterentwicklung herausgebildet: DevSecOps. Kurz gesagt handelt es sich dabei um DevOps plus Sicherheit. Etwas ausführlicher bedeutet dies, dass Sicherheit in jeder Phase des Software-Entwicklungsprozesses eine Rolle spielen sollte: vom ersten Design über Integration, Test und Bereitstellung bis hin zur Auslieferung.
Das Prinzip, dass die Bearbeitung von Aufgaben – in unserem Fall Security – möglichst zeitlich nach vorne in einer Prozesskette verlagert werden soll, heißt auch Shift-Left-Ansatz. Auf Container bezogen bedeutet dies, Sicherheitsaspekte schon beim Bau von Containern einzubeziehen. Das ergibt Sinn, denn Vorfälle in Produktivumgebungen lassen sich oft nur mit hohen Kosten beheben. Viel kostengünstiger ist es meist, wenn Fehler am Anfang des Entwicklungsprozesses gefunden werden. Im Umfeld von Shift-Left und DevSecOps haben sich in den letzten Jahren viele Tools auf dem Markt etabliert. Ein freies ist DefectDojo [1].
DefectDojo im Überblick
Ursprünglich wurde DefectDojo von Rackspace entwickelt, ist aber mittlerweile Open Source. An der Fortentwicklung der Software arbeitet die Community eifrig: Mittlerweile gibt es über 350 Contributers und das Produkt hat mehr als 2500 GitHub-Stars. Neue Features werden relativ häufig released – laut GitHub-Seite erfolgt etwa alle zwei Wochen eine Aktualisierung. Das Werkzeug integriert sich in eine große Reihe existierender Sicherheitstools – inklusive Security-Scanner, Issue-Tracker und Reporting-Werkzeuge – und zeigt deren Informationen in einer zentralen und leicht nachvollziehbaren Art und Weise an.
Eine der Besonderheiten der Software ist die Möglichkeit, Security-Scans automatisiert auszuführen. Dadurch lässt sich in Echtzeit an der Behebung von Sicherheitslücken arbeiten und der aktuelle Stand im Team teilen. Ein weiterer Vorteil ist die Flexibilität des Tools. So erlaubt DefectDojo die Anpassung auf die Bedürfnisse eines Unternehmens. Sie können eigene Workflows implementieren, Vulnerability-Klassifizierungen vornehmen und die Plattform in die eigene Security-Toolchain integrieren.
Unter der Haube besteht DefectDojo aus einer Reihe von Komponenten (Bild 1):
- Sämtlicher statischer Webinhalt wird durch Nginx bereitgestellt. Dies beinhaltet JavaScript, Bilder und andere CSS-Dateien.
- Als Anwendungsserver kommt uWSGI zum Einsatz, das auf dem Python-Framework Django basiert und für sämtliche dynamischen Inhalte verantwortlich ist.
- Für asynchrone Kommunikation ist RabbitMQ als MessageBroker zuständig.
- Mittels Celery Worker laufen Aufgaben wie zum Beispiel JIRA-Synchronisation oder Deduplizierung im Hintergrund ab.
- Celery Beat kommt zum Einsatz, um User zu benachrichtigen.
- Als Datenbank wird MySQL oder PostgreSQL unterstützt – die Empfehlung liegt bei Letzterem.
- Initializer-Skripte werden bei der Installation von Updates aufgerufen und beenden sich automatisch.
Bild 1: DefectDojo besteht aus einer Reihe miteinander verzahnter Open-Source-Komponenten.
Installation per Docker
DefectDojo kommt containerisiert zum Nutzer – dementsprechend geht eine lokale Testinstallation schnell von der Hand und gelingt mit Docker und Docker Compose – diese Umgebung ist auch Voraussetzung für die im Listing-Kasten 1 dargestellte Installation.
Mit dem zugehörigen Kommando führen Sie zuerst einen Klon aus dem öffentlichen DefectDojo-GitHub-Repository aus. Anschließend wechseln Sie in das Programmverzeichnis und starten mit dem Befehl /dc-config.sh den lokalen Bau der Container-Images . Sobald dies erfolgt ist, können Sie die Anwendung aufrufen. Dabei geben Sie ein Profil an, das die Konfiguration des Tools speichert. Sobald die Software gestartet ist, entnehmen Sie aus den Logs das Passwort, das für jede Installation per Zufallsgenerator erzeugt wird. Anschließend öffnen Sie die Anwendung mit der URL "http://localhost:8080" und gelangen zum Dashboard (Bild 2). Als Username geben Sie "admin" und als Passwort das an, das Sie den Logs entnommen haben.
Arbeitsweise von DefectDojo
Obwohl DefectDojo sehr intuitiv ist, sollten Sie sich trotzdem mit den Datenklassen des Produkts beschäftigen. Dabei hat das Projekt eine klare Hierarchie definiert. Auf oberster Ebene finden sich die "Product Types". Dies sind in der Regel Unternehmen, Abteilungen oder Teams wie zum Beispiel das Identity-and-Access-Management-Team. Auf dem nächsten Level befinden sich die entsprechenden "Products" – beispielsweise WordPress. Die dritte Ebene definiert einen Punkt ("Engagement"), an dem das Produkt getestet wird. Dies ist in der Regel ein Zeitpunkt, eine Version, wie zum Beispiel eine Beta-Version, ein regelmäßiger Securitycheck oder Ähnliches. Zu jedem Engagement gehört ein spezifischer Name, ein Zeitpunkt, die Person, die den Lead übernimmt, eine Teststrategie und ein Status.
"Tests" schließlich fassen die Aktivitäten zusammen, um Sicherheitslücken zu identifizieren. Sie sind mit einem Start- und Endpunkt sowie einem Testtyp verbunden. Ein "Finding" bezeichnet dann eine gefundene Schwachstelle. Jedes Finding wird nach Schweregrad kategorisiert: Critical, High, Medium, Low und Informational. Ein Beispiel für ein Finding könnte "OpenSSL 'ChangeCipherSpec' MiTM Potential Vulnerability" lauten. Der "Endpoint" schließlich bezeichnet das getestete System mit IP-Adresse und vollqualifiziertem Domänennamen.
Wenn Sie DefectDojo in einer größeren Organisation nutzen, kann es leicht passieren, dass es viele Products, Engagements, Tests oder andere Objekte gibt. Um Objekte gruppieren zu können, ist es möglich, Tags zu verwenden, die sich dann in der grafischen Oberfläche des Tools wiederfinden.
Sobald ein Finding auftaucht, ist dessen Status ablesbar. Jedes Finding lässt sich einzeln adressieren und Sie können seinen Status ändern. Denn leider kommt es nicht selten vor, dass Findings mehr als einmal erscheinen. Um dem entgegenzuwirken, verfügt DefectDojo über einen Deduplizierungsprozess, der den Status von Findings anpassen kann. In Produktionsumgebungen ist zudem meist das Einhalten von SLAs wichtig. Auch hier bietet das Tool Unterstützung, denn als Administrator lässt sich konfigurieren, wie viele Tage Softwareteams Zeit haben, um Findings zu beheben (Bild 3).
Aktuelle Daten kann DefectDojo als Bericht anzeigen lassen. Für alle Datenklassen existieren vordefinierte Berichte. Bei Bedarf sind auch eigene möglich – es gibt dafür einen dedizierten Report Builder. Dabei können Sie ein Deckblatt, ein Verzeichnis, WYSIWYG-Inhalte, Findings, Vulnerable Endpoints und Seitenumbrüche einbauen. In Sachen Visualisierung sind insbesondere Metriken interessant. Es gibt die Möglichkeit, Product-Type-Metriken, Product-Type-Counts oder andere Zahlenreihen zu visualisieren.
Uploaden aus GitLab CI
In vielen Organisationen sind Securitytools in CI/CD-Pipelines integriert. Aus diesem Grund ist es wünschenswert, Findings daraus direkt in DefectDojo zu veröffentlichen. Im Folgenden zeigen wir in Grundzügen, wie das am Beispiel von Hadolint [3] gelingen kann. In der Regel definieren Sie in einem CI-Skript anfangs immer Konfigurationseinstellungen:
commit_info="[commit ${CI_COMMIT_SHORT_SHA}](${CI_PROJECT_URL}/-/commit/${CI_COMMIT_SHA})\n${branch_tag_info}\ncreated with dashboard-template ${dashboard_template_version}"
DefectDojo lebt von seinen Integrationen. Ein Tool, das in vielen Unternehmen zum Einsatz kommt und das sich problemlos verzahnen lässt, ist Atlassian Jira [2]. Die Anbindung ist in beide Richtungen möglich: Einerseits können Sie Jira-Elemente importieren und auf der anderen Seite Änderungen an Jira zurückgeben. Für die Integration müssen Sie in Jira zuerst einen WebHook definieren. Dies funktioniert wie folgt:
1. Als Erstes öffnen Sie in Ihrem Browser die Seite "https://<Jita-URL>/plugins/ servlet/webhooks".
2. Nun klicken Sie auf "Create a webhook".
3. Im Feld "URL" geben Sie den Wert wie folgt ein: "https://<DefectDojo-Domäne>/jira/webhook/<Webhook-Secret>. Letzteren Wert finden Sie in DefectDojo unter "System settings".
4. Unterhalb von "Comments" aktivieren Sie "Created" und unter "Issues" ist "Updated" die richtige Einstellung.
Als Nächstes wechseln Sie in DefectDojo und dann in das Menü "System settings". Hier entscheiden Sie sich für Klicks auf "Enable Jira integration" und dann auf "Submit". Im Anschluss wählen Sie noch "Enable JIRA web hook" und klicken erneut auf "Submit". Nun steht noch die Feinkonfiguration an. Dazu führen Sie die folgenden Schritte aus:
1. Klicken Sie im Menü links auf "JIRA".
2. Wählen Sie "Add Configuration" aus der Auswahlliste.
3. Nun brauchen Sie einen Usernamen und ein Passwort. Falls Sie JIRA Cloud einsetzen, benötigen Sie die E-Mail-Adresse und einen API-Token.
4. Um an den "open status key" und "closed status key" zu gelangen, öffnen Sie die Seite "https://<Jira-URL>/rest/api/latest/ issue/<Beliebiger gültiger Issue-Key>/ transitions?expand=transitions.fields-"
5. Als "id" für "Todo" tragen Sie "open status key" ein.
6. Als "id" für "Done" geben Sie "closed status key" ein.
7. Um im letzten Schritt an das "epic name id" zu gelangen, benötigen Sie Admin-Zugriff auf JIRA: Dazu öffnen Sie die Seite "https://<Jira-URL>/secure/admin/ViewCustomFields.jspa" und klicken neben "Epic Name" und dann auf "View". Anschließend sehen Sie den numerischen Wert für "epic name id" in der URL.
Listing 2: Abrufen von Nutzerinformationen mit Python
r = requests.get(url, headers=headers, verify=True) # set verify to False if ssl cert is self-signed
for key, value in r.__dict__.items():
print(f"'{key}': '{value}'")
print('------------------')
Arbeiten mit der API
Falls es für ein von Ihnen genutztes System noch keine Integration gibt, lässt sich mit der API arbeiten. Typische Anwendungsfälle sind hier zum Beispiel das automatisierte Hochladen von Berichten aus CI/CD-Pipelines. Um an die Dokumentation zu gelangen, klicken Sie oben rechts in der GUI auf den Benutzer-Avatar.
Für die API stehen darüber hinaus Swagger Definitionen zur Verfügung. Um mit der API zu arbeiten, muss sie sich als Erstes authentifizieren. Die API nutzt dafür einen Authentifizierungs-Header, dessen Format sich so zusammensetzt:
Authorization: Token <api.key>
Beispielsweise kann ein Header-Token wie folgt aussehen:
Der Code im Listing-Kasten 2 zeigt am Beispiel Python, wie Sie mit der API arbeiten, um Userinformationen abzurufen. Dafür importieren Sie als Erstes die Request-API von Python. Anschließend definieren Sie die URL. In der Header-Variable codieren Sie in der folgenden Zeile das Authorization-Token. Damit rufen Sie die API auf und zeigen in einer For-Schleife alle Elemente an. Das Ergebnis schaut dann in etwa aus wie im Listing-Kasten 3. Nicht immer ist es sinnvoll, bei einer Ausgabe alle Elemente angezeigt zu bekommen. Dann können Sie auch mit Filterung arbeiten, wie das Code-Fragment im Listing-Kasten 4 zeigt.
Listing 3: Rückgabe von Nutzerinformationen im JSON-Format
r = requests.get(url, headers=headers, verify=True) # set verify to False if ssl cert is self-signed
for key, value in r.__dict__.items():
print(f"'{key}': '{value}'")
print('------------------')
Fazit
DefectDojo ist ein hilfreiches Tool zum zentralen Verwalten von Schwachstellen. Insbesondere die große Anzahl von Features und Plug-ins stellt einen großen Vorteil dar. Bei Bedarf ist es möglich, die API zu nutzen oder das Produkt zu erweitern. Durch die Orchestrierungsmöglichkeiten mittels CI-Pipelines ist es möglich, Schwachstellen direkt zu veröffentlichen – wie zum Beispiel beim Container-Bau. Lobenswert ist auch die Skalierbarkeit, sodass das Werkzeug gut in großen Teams funktioniert.