Eine „offizielle“ Version dieser Anwendung mit zusätzlichen Pipeline-Integrationen finden Sie unter https://github.com/fortify/IWA-Java.
IWA (Insecure Web App) Pharmacy Direct ist eine beispielhafte Java/Spring-Webanwendung zur Verwendung in DevSecOps- Szenarien und -Demonstrationen. Es enthält einige Beispiele für fehlerhaften und unsicheren Code, der mit statischen und dynamischen Tools zum Testen der Anwendungssicherheit gefunden werden kann, wie sie beispielsweise von Micro Focus Fortify bereitgestellt werden.
Eines der Hauptziele dieses Projekts ist es zu veranschaulichen, wie Sicherheit frühzeitig („Shift-Left“) und kontinuierlich („CI/CD“) in den Entwicklungslebenszyklus eingebettet werden kann. Daher werden eine Reihe von Beispielen für „Integrationen“ in gängige CI/CD-Pipeline-Tools bereitgestellt.
Die Anwendung soll die Funktionalität einer typischen „Online-Apotheke“ bereitstellen, einschließlich des Kaufs von Produkten (Medikamenten) und der Anforderung von Dienstleistungen (Rezepte, Gesundheitschecks usw.). Es verfügt über ein modernes HTML-Frontend (mit etwas JavaScript) und eine Swagger-basierte API.
Bitte beachten Sie: Die Anwendung sollte nicht in einer Produktionsumgebung verwendet werden!
Eine aktuelle Version der laufenden Anwendung finden Sie unter https://iwa.onfortify.com.
Um Beispielszenarien selbst auszuführen, empfiehlt es sich, eine Kopie dieses Repositorys in Ihr eigenes GitHub-Konto zu „forken“. Der Vorgang des „Forkens“ ist in der GitHub-Dokumentation ausführlich beschrieben – Sie können den Vorgang starten, indem Sie oben rechts auf die Schaltfläche „Fork“ klicken.
Um die Anwendung erfolgreich erstellen und ausführen zu können, muss Java JDK 11 installiert und auf Ihrem Weg sein.
Um die Anwendung mit Gradle zu erstellen, führen Sie Folgendes über die Befehlszeile aus:
.gradlew clean build
Abhängig von den Szenarios, die Sie ausführen möchten, gibt es verschiedene Möglichkeiten, die Anwendung auszuführen.
Um lokal im Entwicklungsmodus auszuführen (und zu testen), führen Sie Folgendes über die Befehlszeile aus:
.gradlew bootRun
Navigieren Sie dann zur URL: http://localhost:8888. Sie können eine Reihe von Aktionen ohne Authentifizierung ausführen. Wenn Sie sich jedoch anmelden möchten, können Sie dies wie folgt tun:
Es gibt auch einen administrativen Benutzer:
Beachten Sie, dass Sie bei der Anmeldung mit user2
anschließend nach einem Multi-Faktor-Authentifizierungscode (MFA) gefragt werden. Sie können diesen Code finden, indem Sie die Konsolenausgabe untersuchen.
Wenn Sie einen Entwicklungs-E-Mail-Server verwenden möchten, würde ich die Verwendung von (smtp4dev)[https://github.com/rnwood/smtp4dev.git] empfehlen. Der einfachste Ansatz besteht darin, es als Docker-Container zu starten:
docker run --rm -it -p 5000:80 -p 2525:25 rnwood/smtp4dev
Entfernen Sie --rm -it
, wenn Sie smtp4dev im Hintergrund laufen lassen möchten. Andernfalls wird es ausgeführt, bis Sie STRG+C drücken.
Die Datei (application-dev.yml)[./src/main/resources/application-dev.yml] ist bereits für die Verwendung dieser Konfiguration vorkonfiguriert. Navigieren Sie zu http://localhost:5000
um die E-Mails anzuzeigen.
Die JAR-Datei kann mit der bereitgestellten Dockerfile
und den folgenden Befehlen in ein Docker-Image integriert werden:
docker build - t iwa -f Dockerfile .
oder unter Windows:
docker build - t iwa -f Dockerfile.win .
Dieses Image kann dann mit den folgenden Befehlen ausgeführt werden:
docker run - d - p 8888 : 8888 iwa
Es gibt auch eine Beispieldatei docker-compose.yml
, die veranschaulicht, wie die Anwendung mit HTTPS/SSL unter Verwendung von Nginx und Certbot ausgeführt wird. Bitte beachten Sie, dass dies nur als Referenz dient, da ein „fest codierter“ Domänenname verwendet wird.
Für die meisten der folgenden Beispiele sind umgebungs- und benutzerspezifische Anmeldeinformationen erforderlich. Diese werden aus einer Datei namens .env
im Projektstammverzeichnis geladen. Diese Datei wird nicht standardmäßig erstellt (und sollte niemals in der Quellcodeverwaltung gespeichert werden). Nachfolgend ist ein Beispiel mit allen möglichen Einstellungen für die folgenden Szenarien dargestellt:
# Application URL (locally)
APP_URL=http://localhost:8888
# Software Security Center
SSC_URL=http://[YOUR-SSC-SERVER]
SSC_USERNAME=admin
SSC_PASSWORD=password
SSC_AUTH_TOKEN=XXX
SSC_APP_NAME=IWA-Java
SSC_APP_VER_NAME=main
# ScanCentral SAST/DAST
SCANCENTRAL_CTRL_URL=http://[YOUR-SCANCENTRAL-SERVER]/scancentral-ctrl
SCANCENTRAL_CTRL_TOKEN=XXX
SCANCENTRAL_POOL_ID=00000000-0000-0000-0000-000000000002
[email protected]
SCANCENTRAL_DAST_API=http://[YOUR-SCANCENTRAL-DAST-SERVER]/api/
# ScanCentral FAST
FAST_EXE=C:\Program Files\Micro Focus WIRC Server\Fast.exe
FAST_PORT=8087
FAST_PROXY=127.0.0.1:8087
# Fortify on Demand
FOD_API_URL=https://api.ams.fortify.com
FOD_API_KEY=XXXX
FOD_API_SECRET=YYYY
FOD_TENANT=[YOUR-TENANT]
FOD_USER=[YOUR-USERNAME]
FOD_PAT=XXXX
Es gibt ein Beispiel-PowerShell-Skript fortify-sast.ps1, mit dem Sie statische Anwendungssicherheitstests über Fortify SCA ausführen können.
.binfortify - sast.ps1 - SkipSSC
Dieses Skript führt eine sourceanalyzer
Übersetzung und einen Scan des Quellcodes des Projekts durch. Es erstellt eine Fortify-Projektergebnisdatei mit dem Namen IWA-Java.fpr
, die Sie mit dem Fortify- auditworkbench
Tool öffnen können:
auditworkbench.cmd .IWA - Java.fpr
Außerdem wird ein PDF-Bericht namens IWA-Java.pdf
erstellt und die Ergebnisse optional in das Fortify Software Security Center (SSC) hochgeladen.
Zum Hochladen auf SSC benötigen Sie Einträge in der .env
die etwa den folgenden ähneln:
SSC_URL=http://localhost:8080/ssc
SSC_AUTH_TOKEN=28145aad-c40d-426d-942b-f6d6aec9c56f
SSC_APP_NAME=IWA-Java
SSC_APP_VER_NAME=main
Der SSC_AUTH_TOKEN
Eintrag sollte auf den Wert eines in SSC „Administration->Token Management“ erstellten „CIToken“ gesetzt werden.
Es gibt ein PowerShell-Skript fortify-scancentral-sast.ps1, mit dem Sie das Projekt packen und einen Remote-Scan mit Fortify ScanCentral SAST starten können:
.binfortify - scancentral - sast.ps1
Um ScanCentral SAST verwenden zu können, benötigen Sie Einträge in der .env
die etwa den folgenden ähneln:
SSC_URL=http://localhost:8080/ssc
SSC_AUTH_TOKEN=6b16aa46-35d7-4ea6-98c1-8b780851fb37
SSC_APP_NAME=IWA-Java
SSC_APP_VER_NAME=main
SCANCENTRAL_CTRL_URL=http://localhost:8080/scancentral-ctrl
SCANCENTRAL_CTRL_TOKEN=96846342-1349-4e36-b94f-11ed96b9a1e3
SCANCENTRAL_POOL_ID=00000000-0000-0000-0000-000000000002
[email protected]
Der SSC_AUTH_TOKEN
Eintrag sollte auf den Wert eines in SSC „Administration->Token Management“ erstellten „CIToken“ gesetzt werden.
Um einen Fortify on Demand SAST-Scan auszuführen, müssen Sie den Quellcode verpacken und auf Fortify on Demand hochladen. Um den Code zum Hochladen in eine Zip-Datei zu packen, können Sie das scancentral
-Befehlsdienstprogramm wie folgt verwenden:
scancentral package - bt gradle - bf build.gradle - bt " clean build -x test " -- output fod.zip
Sie können dies dann manuell über die Fortify on Demand-Benutzeroberfläche, mit dem FoDUploader-Dienstprogramm oder über die Fortify-CLI mit den folgenden Befehlen hochladen:
fcli fod session login --url http://api.ams.fortify.com -t YOUR_FOD_TENANT -u YOUR_USERNAME -p YOUR_PASSWORD
fcli fod sast-scan start --release YOUR_APP:YOUR_RELEASE -f fod.zip --store curScan
fcli fod sast-scan wait-for ::curScan::
Um einen WebInspect-Scan durchzuführen, sollten Sie die Anwendung zunächst mit einem der oben beschriebenen Schritte „ausführen“. Anschließend können Sie über die folgende Befehlszeile einen Scan starten:
" C:Program FilesFortifyFortify WebInspectWI.exe " - s " .etcIWA-UI-Dev-Settings.xml " - macro " .etcIWA-UI-Dev-Login.webmacro " - u " http://localhost:8888 " - ep " .IWA-DAST.fpr " - ps 1008
Dadurch wird ein Scan mit den Standardeinstellungen und Anmeldemakrodateien gestartet, die im Verzeichnis etc
bereitgestellt werden. Es wird davon ausgegangen, dass die Anwendung auf „localhost:8888“ ausgeführt wird. Es wird ein Scan „Kritisch und mit hoher Priorität“ unter Verwendung der Richtlinie mit der ID 1008 ausgeführt. Sobald der Vorgang abgeschlossen ist, können Sie den WebInspect „Desktop Client“ öffnen und zu dem für diese Ausführung erstellten Scan navigieren. Eine FPR-Datei mit dem Namen IWA-DAST.fpr
ist ebenfalls verfügbar. Sie können sie mit auditworkbench
öffnen (oder mit ReportGenerator
einen PDF-Bericht generieren). Sie können es auch auf Fortify SSC oder Fortify on Demand hochladen.
Es gibt eine Beispiel-PowerShell-Skriptdatei fortify-webinspect.ps1, die Sie ausführen können, um den Scan auszuführen und die Ergebnisse auf SSC hochzuladen:
.binfortify - webinspect.ps1
Sie können einen dynamischen Fortify on Demand-Scan mit dem FCLI-Dienstprogramm aufrufen. Zum Beispiel:
fcli sc-dast session login --ssc-url http://YOUR_SSC.DOMAIN -t YOUR_SSC_CI_TOKEN
fcli sc-dast scan -n "IWA-Java - FCLI" -s YOUR_SCAN_SETTINGS_ID --store curScan
fcli sc-dast scan wait-for ::curScan::
Fortify on Demands bietet zwei Möglichkeiten zur Durchführung des DAST-Scans: herkömmliches DAST und automatisiertes DAST . In diesem Abschnitt verwenden wir DAST Automated , da es sich besser für die Befehls- und Pipeline-Integration eignet.
Sie können einen automatisierten Fortify on Demand DAST -Scan mit dem FCLI-Dienstprogramm aufrufen. Zum Beispiel:
fcli fod session login --url http://api.ams.fortify.com -t YOUR_FOD_TENANT -u YOUR_USERNAME -p YOUR_PASSWORD
fcli fod dast-scan start --release YOUR_APP:YOUR_RELEASE --store curScan
fcli fod dast-scan wait-for ::curScan::
TBD: So laden Sie Anmeldemakros und/oder Workflows hoch.
Die IWA-Anwendung umfasst eine vollständig dokumentierte Swagger-basierte API, zu der Sie unter http://localhost:8888/swagger-ui/index.html?configUrl=/v3/api-docs/swagger-config navigieren können. Sie können Sicherheitstests dieser API mit Fortify WebInspect oder ScanCentral DAST durchführen. Eine Postman-Sammlung hilft dabei. Sie können die Sammlung mit Newman ausüben. Zum Beispiel über eine PowerShell-Eingabeaufforderung unter Windows:
newman run .etcIWA - API - Dev - Auth.postman_collection.json -- environment .etcIWA - API - Dev.postman_environment.json -- export-environment .etcIWA - API - Dev.postman_environment.json
newman run .etcIWA - API - Dev - Workflow.postman_collection.json -- environment .etcIWA - API - Dev.postman_environment.json
Um diese Sammlung mit WebInspect verwenden zu können, müssen Sie sicherstellen, dass sich „newman“ im Pfad befindet. Anschließend können Sie Folgendes ausführen:
& " C:Program FilesFortifyFortify WebInspectWI.exe " - pwc .etcIWA - API - Workflow.postman_collection.json - pec .etcIWA - API - Dev.postman_environment.json - ep " .IWA-API.fpr "
Importieren Sie die folgenden Postman-Sammlungen in ScanCentral DAST:
etcIWA-API-Prod.postman_environment.json
– als UmgebungetcIWA-API-Auth.postman_collection.json
– als AuthentifizierungssammlungetcIWA-API-Workflow.postman_collection.json
– als Workflow-SammlungAnschließend benötigen Sie folgende Einstellungen für die Dynamic Token Generation
Antworttoken:
"accessToken"s*:s*"(?<BearerTokenValue>[-a-zA-Z0-9._~+/]+?=*)"
Anforderungstoken:
Authorization:sBearers(?<BearerTokenValue>[^rn]*)r?n
Abmeldebedingung:
[STATUSCODE]401
Der Scan kann über die DAST-Benutzeroberfläche von ScanCentral oder durch Speichern der Einstellungen und Verwendung des Befehls fcli sc-dast scan
ausgeführt werden.
Ein API-Scan kann mit der folgenden „kombinierten“ Postman-Sammlung durchgeführt werden:
etcIWA-API-Prod-Combined.postman_environment.json
Dies kann entweder mit herkömmlichem DAST oder DAST Automated verwendet werden.
Mit dem Fortify FAST Proxy können Sie Datenverkehr aus einem automatisierten Testlauf erfassen und den Datenverkehr dann als Workflow für eine ScanCentral DAST-Ausführung verwenden. Um das Beispiel hier auszuführen, müssen Sie WebInspect lokal WIRCServerSetup64-ProxyOnly.msi
installiert haben, das in Dynamic_Addons.zip
des ScanCentral DAST-Installationsmediums verfügbar ist.
Es gibt einige Beispiele für Selenium, mit denen ein einfacher Funktionstest der laufenden Anwendung durchgeführt werden kann. Es gibt auch einige PowerShell-Skripte start_fast_proxy.ps1 und stop_fast_proxy.ps1, die zum Starten/Stoppen des FAST Proxy verwendet werden können. Um diese Skripte verwenden zu können, müssen in der .env
Datei Einträge ähnlich den folgenden vorhanden sein:
APP_URL=http://localhost:8888
SSC_AUTH_TOKEN_BASE64=MmYyMTA5MzYtN2Q5Ny00NmM1LWI5NTUtYThkZWI2YmJlMDUy
SSCANCENTRAL_DAST_API=http://scancentral-dast-api.example.com/api/
SCANCENTRAL_DAST_CICD_IDENTIFIER=c3c3df60-de68-45b8-89c0-4c07b53392e7
FAST_PORT=8087
FAST_PROXY=127.0.0.1:8087
Der SSC_AUTH_TOKEN_BASE64
ist der (erste) codierte Token, der in SSC angezeigt wird, nicht der (zweite) decodierte Token. Führen Sie dann über die Befehlszeile Folgendes aus:
python -m pip install --upgrade pipenv wheel
pipenv shell
pipenv install --dev
Stellen Sie sicher, dass die Anwendung ausgeführt wird, und führen Sie dann Folgendes in einem Terminalfenster aus:
.binstart_fast_proxy.ps1
Führen Sie dann in einem anderen Terminalfenster Folgendes aus:
pytest - v - s
Und dann endlich:
.binstop_fast_proxy.ps1
Die ausführbare FAST-Datei des ersten Terminals sollte beendet werden und anschließend ein Scan in Ihrer ScanCentral DAST-Umgebung ausgeführt werden.
Wenn Sie Jenkins verwenden, wird eine umfassende Jenkinsfile
bereitgestellt, um alle typischen Schritte eines typischen DevSecOps Continuous Delivery (CD)-Prozesses zu automatisieren. Das Beispiel nutzt Fortify ScanCentral SAST/DAST und Sonatype Nexus IQ für die Analyse der Softwarezusammensetzung.
Um die Jenkinsfile
zu nutzen, erstellen Sie einen neuen Jenkins -Pipeline- Job, wählen Sie im Abschnitt „Pipeline Pipeline script from SCM
aus und geben Sie die Details einer gespaltenen Version dieses GitHub-Repositorys ein.
Der erste Lauf der Pipeline sollte als „Setup“-Schritt betrachtet werden, da dabei einige Jobparameter erstellt werden, die Sie dann auswählen können, um zu bestimmen, welche Funktionen Sie in der Pipeline aktivieren möchten.
Sie müssen die Fortify Jenkins-Plugins installiert und konfiguriert haben.
Die Jenkinsfile
selbst enthält zahlreiche Dokumentationen. Sehen Sie sich diese daher bitte an, um zu sehen, was Sie sonst noch für einen erfolgreichen Aufruf tun müssen.
Dieses Repository enthält eine Reihe von Beispielen für GitHub-Aktionen in der Datei .github/workflows, die die Erstellung der Anwendung automatisieren und den Code entweder mit Fortify on Demand oder Fortify ScanCentral für SAST scannen.
Informationen zur Integration mit anderen Pipeline-Tools finden Sie unter https://github.com/fortify/IWA-Java.
Informationen zur Entwicklung und zum Beitragen finden Sie im Beitragsleitfaden.
Wenn Sie Probleme haben, konsultieren Sie bitte GitHub Issues, um zu sehen, ob das Problem bereits besprochen wurde.
Diese Anwendung wird unter der GNU General Public License V3 zur Verfügung gestellt