
Automatisiertes, reproduzierbares Netzwerksicherheits-Testframework, das Ansible und BATS verwendet, um DNS, Hostverfügbarkeit, offene Ports und TLS-Konfiguration von mehreren Standpunkten aus zu überprüfen.
Dieses Projekt verwendet Ansible, um BATS-Testdateien zu generieren, die Sicherheitsannahmen über die Netzwerkinfrastruktur überprüfen. Tests werden von Testmaschinen („Prober-Knoten“) ausgeführt, auf denen Prober bereitgestellt wird.
Dieses Tool ist für reproduzierbare, automatisierte Tests eigener Netzwerke gedacht. Es unterstützt mehrere Prober-Knoten, die Tests ausführen, jeder mit einer anderen Sicht auf das getestete Netzwerk — zum Beispiel eine Sicht aus der externen Zone, eine aus der internen Zone und eine Sicht aus der DMZ.
Die Verwendung von Prober zum Sondieren von Netzwerken, für die Sie nicht autorisiert sind, könnte illegal sein.
Auf dem Ansible-Master, der zum Bereitstellen von Tests auf Prober-Knoten verwendet wird:
ansible (klar!)python*-netaddr (unter GNU/Linux) / py*-netaddr (unter FreeBSD)Auf den Prober-Knoten selbst:
bashsshnmapdig/kdigtestsslAuf einem System, auf dem Sie die Ergebnisse (*.tap-Dateien) überprüfen, möchten Sie vielleicht tappy installieren. Die Ergebnisse werden auf jedem Prober-Knoten in lokalen Git-Repositories gespeichert (standardmäßig in /var/run/prober/results/, siehe unten für Konfigurationsoptionen), mit Commits, die mit dem Datum jedes abgeschlossenen Scan-Durchlaufs getaggt sind, für historische Aufzeichnung und einfachen Vergleich.
Ansible wird verwendet, um Tests auf Prober-Knoten zu generieren. Ein Prober-Knoten kann jeder FreeBSD- oder GNU/Linux-Host sein, solange es möglich ist, Probers Abhängigkeiten zu installieren. Er muss nicht dediziert für Tests sein, wird aber empfohlen — ein Scan eines vernünftig großen Netzwerks wird Stunden dauern, viel CPU verbrauchen und eine beträchtliche Menge an Datenverkehr erzeugen.
Es ist sinnvoll, Prober auf mehreren verschiedenen Maschinen bereitzustellen, um zu überprüfen, wie Ihr Netzwerk von verschiedenen Blickwinkeln aussieht (z.B. internes Netzwerk, DMZ, Internet).
Im Testverzeichnis auf den Prober-Knoten wird ein Skript run-tests.sh erstellt, um die Ausführung der Tests zu erleichtern. Die Tests werden so ausgeführt, dass zu jeder Zeit <simultaneous_tests_count> Tests gleichzeitig laufen — diese Variable ist die Hauptmethode, um zu steuern, wie viele Ressourcen ein Scan verwendet und wie viel Bandbreite er benötigt.
Testergebnisse werden dann in einem lokalen Git-Repository gespeichert, wobei Commits mit dem Datum getaggt sind, an dem ein bestimmter Durchlauf beendet wurde (welches sich vom Startdatum für einige lange Scan-Durchläufe unterscheiden kann).
Wenn Sie mit einer Infrastruktur umgehen, die größer als nur ein paar Hosts ist, kann es sinnvoll sein, ein Tool wie Mitogen zu verwenden, um die Testgenerierung drastisch zu beschleunigen.
Bereiten Sie einen Debian- oder FreeBSD-Server zur Nutzung als Prober-Knoten vor (nennen wir ihn prober.example.com), stellen Sie sicher, dass Sie SSH-Zugriff darauf haben und sudo ausführen können.
Kopieren Sie das Beispiel-Inventar als inventories/test/.
In diesem test-Inventar:
group_vars/all.yml und setzen Sie zone_nameserver, zone_domains, address_blocks nach Ihren Wünschen; nehmen wir an, Sie fügen example.com als einzige zu testende Domain hinzu.hosts und konfigurieren Sie Ihren Prober-Knoten prober.example.com im Abschnitt [prober-nodes]; sagen wir, Sie setzen tested_zone auf test.Kopieren Sie die Beispiel-Zonenkonfiguration als data/<tested_zone>.yml (also in unserem Fall: data/test.yml) und bearbeiten Sie sie; mindestens muss der Schlüssel tested_zone_settings.name den Wert von tested_zone enthalten (also test).
Exportieren Sie Ihre DNS-Zone und speichern Sie sie als data/<dns_zone>.zone (in unserem Fall: example.com).
Führen Sie das Playbook aus:
ansible-playbook prober.yml -i inventories/test/ -vvv
Dadurch werden die Tests auf dem Prober-Knoten generiert und ein Cronjob eingerichtet, der sie jede Nacht um 01:00 Uhr ausführt.
Sie können sich jetzt per ssh in den Prober-Knoten einloggen und die generierten Tests in /opt/prober/ inspizieren. Sobald Sie zufrieden sind, können Sie sie durch Ausführen von /opt/prober/run_tests.sh starten. Die Ergebnisse werden in /var/run/prober/results gespeichert.
Konfigurationsvariablen (definiert in probers.yml):
tests_directory (Standard: /opt/prober):
Verzeichnis auf den Prober-Knoten, in dem die Testdateien (*.bats-Dateien) generiert werden.
results_repo_directory (Standard: /var/run/prober/results):
Verzeichnis des Repositories für Testergebnisse (*.tap-Dateien); dort wird ein git-Repository initialisiert und ein Unterverzeichnis tap/ für die eigentlichen Ergebnisse erstellt;
Ergebnisse werden in das git-Repository committed, Commits werden mit einem Datum im Format yyyy-mm-dd getaggt (der Commit mit Ergebnissen eines Tests, der am 19. März 2020 beendet wurde, ist beispielsweise als 2020-03-19 getaggt).
simultaneous_tests_count (Standard: 20):
Wie viele Tests gleichzeitig ausgeführt werden.
prober_dev (Standard: nicht definiert):
Überspringen bestimmter Aufgaben, die auf einem Entwicklungsrechner keinen Sinn ergeben (wie das Einrichten von cron oder zabbix).
Zonen werden in Dateien ./data/<zone_name>.yml definiert, wobei der oberste Schlüssel die Zeichenkette "tested_zone_settings" ist, die dann folgende Schlüssel enthält:
name: der Name der Zone, passend zum Dateinamen (ohne Erweiterung); z.B. "internal", "external", "dmz"default (optional): die Standardeinstellungen für alle Hosts in dieser Zone^" Zeichen beginnen), die mehrere FQDNs abgleichenDer default-Schlüssel, jeder Regex-Schlüssel und jeder Domain-Schlüssel können wiederum diese Schlüssel enthalten:
resolve: soll der Host zur relevanten IP-Adresse aufgelöst werden (bool true/false oder der String "skip")ping: soll der Host auf Ping antworten (bool true/false oder der String "skip")ports: Liste der TCP- und UDP-Ports, die offen sein dürfen (Unter-Schlüssel "tcp" und "udp", jeweils ein Array von Integern, die offene Ports definieren, oder der String "skip"), und TLS-fähige Ports für eine tiefere Inspektion (der tls-Unter-Schlüssel, der ein Dict mit Portnummern als Schlüsseln und dem Typ des TLS-Dienstes oder dem Wort "skip" als Wert enthält)ports: "skip" ist eine Abkürzung für:
ports:
tcp: "skip"
udp: "skip"
tls: "skip"
TLS-Diensttypen sind alles, was testssl.sh für die Option -t/--starttls unterstützt, "https" für HTTPS-Test (einschließlich Header) oder "tls" für generischen TLS-Test.tcp" als offen markiert.skip: ob der Host vollständig übersprungen werden soll (boolesch)Eine Beispielkonfiguration finden Sie hier.