
Dienst, der Ihre Infrastructure as Code auf häufige Schwachstellen scannt.
| Aspekt | Information |
|---|
| Toolname | IaC Scan Runner |
| Docker-Image | xscanner/runner |
| PyPI-Paket | iac-scan-runner |
| Dokumentation | docs |
| Kontakt | [email protected] |
Der IaC Scan Runner ist ein REST-API-Dienst, der zum Scannen von IaC-Paketen (Infrastructure as Code) und zur Durchführung verschiedener Code-Checks verwendet wird, um mögliche Schwachstellen und Verbesserungen zu finden. Weitere Informationen finden Sie in den docs.
In diesem Abschnitt wird erklärt, wie die REST-API ausgeführt wird.
Sie können die REST-API mit dem öffentlichen Docker-Image xscanner/runner wie folgt ausführen:
# run IaC Scan Runner REST API in a Docker container and
# navigate to localhost:8080/swagger or localhost:8080/redoc
$ docker run --name iac-scan-runner -p 8080:80 xscanner/runner
Oder Sie können das Image lokal erstellen und wie folgt ausführen:
# build Docker container (it will take some time)
$ docker build -t iac-scan-runner .
# run IaC Scan Runner REST API in a Docker container and
# navigate to localhost:8080/swagger or localhost:8080/redoc
$ docker run --name iac-scan-runner -p 8080:80 iac-scan-runner
So führen Sie es mit der IaC Scan Runner CLI aus:
# install the CLI
$ python3 -m venv .venv && . .venv/bin/activate
(.venv) $ pip install iac-scan-runner
# print OpenAPI specification
(.venv) $ iac-scan-runner openapi
# install prerequisites
(.venv) $ iac-scan-runner install
# run IaC Scan Runner REST API
(.venv) $ iac-scan-runner run
So führen Sie es lokal aus dem Quellcode aus:
# Export env variables
export MONGODB_CONNECTION_STRING=mongodb://localhost:27017
export SCAN_PERSISTENCE=enabled
export USER_MANAGEMENT=enabled
# Setup MongoDB
$ docker run --name mongodb -p 27017:27017 mongo
# install prerequisites
$ python3 -m venv .venv && . .venv/bin/activate
(.venv) $ pip install -r requirements.txt
(.venv) $ ./install-checks.sh
# run IaC Scan Runner REST API (add --reload flag to apply code changes on the way)
(.venv) $ uvicorn src.iac_scan_runner.api:app
Dieser Teil zeigt eine der möglichen Bereitstellungen und kurze Beispiele zur Verwendung von API-Aufrufen.
Zuerst klonen wir das Repository iac scan runner und starten die API.
$ git clone https://github.com/xlab-si/iac-scan-runner.git
$ docker compose up
Danach können Sie verschiedene API-Endpunkte durch Aufrufen von localhost:8000 verwenden. Sie können auch zu localhost:8000/swagger oder localhost:8000/redoc navigieren und dort alle API-Endpunkte testen. In diesem Beispiel verwenden wir curl zum Aufrufen von API-Endpunkten.
curl -X 'POST' \
'http://0.0.0.0/project?creator_id=test' \
-H 'accept: application/json' \
-d ''
Die Projekt-ID wird uns zurückgegeben. In diesem Beispiel ist die Projekt-ID 1e7b2a91-2896-40fd-8d53-83db56088026.
curl -X 'PUT' \
'http://0.0.0.0:8000/projects/1e7b2a91-2896-40fd-8d53-83db56088026/checks/ansible-lint/disable' \
-H 'accept: application/json'
curl -X 'POST' \
'http://0.0.0.0:8000/projects/1e7b2a91-2896-40fd-8d53-83db56088026/scan?scan_response_type=json' \
-H 'accept: application/json' \
-H 'Content-Type: multipart/form-data' \
-F '[email protected];type=application/zip'
Das war's.
Irgendwann kann es erforderlich sein, neue Prüfwerkzeuge in den Scan-Workflow aufzunehmen, um eine breitere Abdeckung von IaC-Standards und Projekttypen zu ermöglichen. Daher wird in diesem Unterabschnitt eine Folge der erforderlichen Schritte für diesen Zweck identifiziert und beschrieben. Die Schritte müssen jedoch manuell durchgeführt werden, wie beschrieben, aber es ist geplant, dieses Verfahren in Zukunft über die API zu automatisieren und eine benutzerfreundliche Oberfläche bereitzustellen, die den Benutzer beim Importieren neuer Werkzeuge unterstützt, die Teil des verfügbaren Katalogs werden, der den Scan-Workflow ausmacht. Abbildung 16 zeigt die erforderlichen Schritte, die unternommen werden müssen, um den Scan-Workflow um ein neues Werkzeug zu erweitern.
Schritt 1 – Hinzufügen einer werkzeugspezifischen Klasse zum checks-Verzeichnis
Zuerst muss eine neue werkzeugspezifische Python-Klasse zum checks-Verzeichnis im Quellcode des IaC Scan Runners hinzugefügt werden:
iac-scan-runner/src/iac_scan_runner/checks/new_tool.py
Die Klasse eines neuen Werkzeugs erbt die vorhandene Check-Klasse, die eine Verallgemeinerung der Scan-Workflow-Werkzeuge bereitstellt. Darüber hinaus ist es notwendig, die Implementierung der folgenden Methoden bereitzustellen:
Schritt 2 – Hinzufügen der Check-Tool-Klasseninstanz innerhalb des ScanRunner-Konstruktors Sobald die neue von Check abgeleitete Klasse zum Quellcode des IaC Scan Runners hinzugefügt wurde, muss auch der Quellcode seiner Hauptklasse, genannt ScanRunner, modifiziert werden. Bei Änderungen dieser Klasse ist es erforderlich, zuerst die werkzeugspezifische Klasse zu importieren, eine neue Instanz der werkzeugspezifischen Check-Tool-Klasse zu erstellen und sie zum Wörterbuch der IaC-Checks innerhalb von def init_checks(self) hinzuzufügen. A. Importieren der Check-Tool-Klasse from iac_scan_runner.checks.tfsec import TfsecCheck B. Erstellen einer neuen Instanz des Check-Tool-Objekts innerhalb von init_checks """Initiate predefined check objects""" new_tool = NewToolCheck() C. Hinzufügen zum self.iac_checks-Wörterbuch innerhalb von init_checks
self.iac_checks = {
new_tool.name: new_tool,
…
}
Schritt 3 – Hinzufügen des Check-Tools zur Kompatibilitätsmatrix innerhalb der Compatibility-Klasse Andererseits sollte auch in der Datei src/iac_scan_runner/compatibility.py das Wörterbuch, das die Kompatibilitätsmatrix darstellt, erweitert werden. Es gibt zwei mögliche Fälle: a) ein neuer Dateityp sollte als Schlüssel hinzugefügt werden, zusammen mit der Liste der relevanten Werkzeuge als Wert; b) ein neues Werkzeug sollte zur Kompatibilitätsliste für den vorhandenen Dateityp hinzugefügt werden.
compatibility_matrix = {
"new_type": ["new_tool_1", "new_tool_2"],
…
"old_typeK": ["tool_1", … "tool_N", "new_tool_3"]
}
Schritt 4 – Bereitstellung der Unterstützung für die Ergebniszusammenfassung Schließlich ist der letzte Schritt in der Sequenz der erforderlichen Modifikationen für die Erweiterung des Scan-Workflows die Modifikation der Klasse ResultsSummary (src/iac_scan_runner/results_summary.py). Genauer gesagt ist es erforderlich, einen Teil des Codes an seine Methode summarize_outcome anzuhängen, der nach bestimmten, werkzeugspezifischen Zeichenfolgen sucht, die verwendet werden können, um zu identifizieren, ob der Check bestanden oder fehlgeschlagen ist. Innerhalb der Schleife, die die kompatiblen Checks durchläuft, sollte für jedes neue Werkzeug die folgende if-else-Struktur eingefügt werden:
if check == "new_tool":
if outcome.find("Check pass string") > -1:
self.outcomes[check]["status"] = "Passed"
return "Passed"
else:
self.outcomes[check]["status"] = "Problems"
return "Problems"
Dieses Werk ist lizenziert unter der Apache License 2.0.
Sie können das xOpera-Team per E-Mail an [email protected] kontaktieren.
Dieses Projekt wurde aus dem Forschungs- und Innovationsprogramm Horizont 2020 der Europäischen Union im Rahmen des Finanzhilfevertrags Nr. 101000162 (PIACERE) finanziert.