
Ein pythonisches Framework für die Bedrohungsmodellierung
Traditionelles Threat Modeling kommt oft zu spät oder manchmal gar nicht. Darüber hinaus kann die manuelle Erstellung von Datenflüssen und Berichten extrem zeitaufwändig sein. Das Ziel von pytm ist es, Threat Modeling nach links zu verschieben und es automatisierter und entwicklerzentrierter zu machen.
Basierend auf Ihren Eingaben und der Definition des Architekturdesigns kann pytm automatisch die folgenden Elemente generieren:
Die tm.py ist ein Beispielmodell. Sie können sie ausführen, um den Bericht und die Diagrammbilddateien zu generieren, auf die sie verweist:
mkdir -p tm
./tm.py --report docs/basic_template.md | pandoc -f markdown -t html > tm/report.html
./tm.py --dfd | dot -Tpng -o tm/dfd.png
./tm.py --seq | java -Djava.awt.headless=true -jar $PLANTUML_PATH -tpng -pipe > tm/seq.png
Es gibt auch ein Beispiel-Makefile, das all dies in Targets verpackt, die leicht für mehrere Modelle geteilt werden können. Wenn Sie GNU make installiert haben (standardmäßig auf Linux-Distributionen verfügbar, aber nicht auf OSX), führen Sie einfach aus:
make MODEL=the_name_of_your_model_minus_.py
Du solltest entweder plantuml.jar im selben Verzeichnis wie dein Modell haben oder PLANTUML_PATH setzen.
Um die Installation aller Abhängigkeiten wie pandoc oder Java zu vermeiden, kann das Skript in einem Container ausgeführt werden:
# do this only once
export USE_DOCKER=true
make image
# call this after every change in your model
make
Um die Nutzung zu vereinfachen, können die Host-Abhängigkeiten von pytm vollständig isoliert werden
mit Devbox. Dies ist normalerweise eine
geringerer Overhead und eine bequemere Alternative zum OCI-Container-Ansatz.
curl -fsSL https://get.jetify.com/devbox | bashdevbox version update~/.config/nix/nix.conf: access-tokens = github.com=YOUR_TOKEN_HEREdevbox.json-Datei des Projekts angegeben sind: devbox shellpython in deinem Terminal eingibst, indem du den Befehl which python verwendest. Die Ausgabe sollte der folgende Pfad sein: .devbox/nix/profile/default/bin/pythonsample.png generieren sollte: ./tm.py --dfd | dot -Tpng -o sample.pngexit"Aber ich dachte, wir wären mit diesem 'Code schreiben'-Ding durch!" - diese hier ist für diejenigen unter uns, die es genießen, zu viel mit KI-Assistenten zu reden: schau dir https://github.com/izar/tm_skills an, um einige Möglichkeiten zu finden, OWASP pytm zu deinem Coding-Assistenten hinzuzufügen (du benötigst trotzdem eine funktionierende Installation von pytm!).
Alle verfügbaren Argumente:
usage: tm.py [-h] [--debug] [--dfd] [--report REPORT] [--exclude EXCLUDE]
[--seq] [--list] [--colormap] [--describe DESCRIBE]
[--list-elements] [--json JSON] [--levels LEVELS [LEVELS ...]]
[--stale_days STALE_DAYS]
options:
-h, --help show this help message and exit
--debug print debug messages
--dfd output DFD
--report REPORT output report using the named template file (sample
template file is under docs/basic_template.md)
--exclude EXCLUDE specify threat IDs to be ignored
--seq output sequential diagram
--list list all available threats
--colormap color the risk in the diagram
--describe DESCRIBE describe the properties available for a given element
--list-elements list all elements which can be part of a threat model
--json JSON output a JSON file
--levels LEVELS [LEVELS ...]
Select levels to be drawn in the threat model (int
separated by comma).
--stale_days STALE_DAYS
checks if the delta between the TM script and the code
described by it is bigger than the specified value in
days
Das Argument stale_days versucht zu bestimmen, wie viele Tage das Modellskript (das Sie schreiben) von dem Code entfernt ist, der das modellierte System implementiert. Idealerweise sollten sie in den meisten Fällen eines aktiv entwickelten Systems ziemlich nahe beieinander liegen. Sie können dies regelmäßig ausführen, um den Puls Ihres Projekts und die „Aktualität“ Ihres Bedrohungsmodells zu messen.
Derzeit verfügbare Elemente sind: TM, Element, Server, ExternalEntity, Datastore, Actor, Process, Dataflow, Boundary, Lambda, LLM und Agent.
Die verfügbaren Eigenschaften eines Elements können mit --describe gefolgt vom Namen eines Elements aufgelistet werden: