Pour une version « officielle » de cette application avec des intégrations de pipeline supplémentaires, veuillez visiter https://github.com/fortify/IWA-Java.
IWA (Insecure Web App) Pharmacy Direct est un exemple d'application Web Java/Spring à utiliser dans les scénarios et les démonstrations DevSecOps . Il comprend quelques exemples de code mauvais et non sécurisé, qui peuvent être trouvés à l'aide d'outils de test de sécurité d'applications statiques et dynamiques tels que ceux fournis par Micro Focus Fortify.
L'un des principaux objectifs de ce projet est d'illustrer comment la sécurité peut être intégrée tôt (« Shift-Left ») et continuellement (« CI/CD ») dans le cycle de vie de développement. Par conséquent, un certain nombre d'exemples d'« intégrations » aux outils de pipeline CI/CD courants sont fournis.
L'application est destinée à fournir les fonctionnalités d'une « pharmacie en ligne » typique, notamment l'achat de produits (médicaments) et la demande de services (ordonnances, contrôles de santé, etc.). Il possède une interface HTML moderne (avec du JavaScript) et une API basée sur Swagger.
Attention : l’application ne doit pas être utilisée dans un environnement de production !
Une version à jour de l'application en cours d'exécution est disponible sur https://iwa.onfortify.com.
Afin d'exécuter des exemples de scénarios par vous-même, il est recommandé de « créer » une copie de ce référentiel dans votre propre compte GitHub. Le processus de "fork" est décrit en détail dans la documentation GitHub - vous pouvez démarrer le processus en cliquant sur le bouton "Fork" en haut à droite.
Afin de créer et d'exécuter l'application avec succès, vous devez avoir Java JDK 11 installé et sur votre chemin.
Pour créer l'application à l'aide de Gradle, exécutez ce qui suit à partir de la ligne de commande :
.gradlew clean build
Il existe plusieurs façons d'exécuter l'application en fonction du ou des scénarios que vous souhaitez exécuter.
Pour exécuter (et tester) localement en mode développement, exécutez ce qui suit à partir de la ligne de commande :
.gradlew bootRun
Accédez ensuite à l'URL : http://localhost:8888. Vous pouvez effectuer un certain nombre d'actions sans être authentifié, mais si vous souhaitez vous connecter, vous pouvez le faire comme suit :
Il existe également un utilisateur administratif :
Notez que si vous vous connectez avec user2
, il vous sera ensuite demandé un code d'authentification multifacteur (MFA). Vous pouvez trouver ce code en examinant la sortie de la console.
Si vous souhaitez utiliser un serveur de messagerie de développement, je vous recommande d'utiliser (smtp4dev)[https://github.com/rnwood/smtp4dev.git]. L'approche la plus simple consiste à le démarrer en tant que conteneur Docker :
docker run --rm -it -p 5000:80 -p 2525:25 rnwood/smtp4dev
Supprimez --rm -it
si vous souhaitez laisser smtp4dev s'exécuter en arrière-plan, sinon il s'exécutera jusqu'à ce que vous appuyiez sur CTRL+C.
Le fichier (application-dev.yml)[./src/main/resources/application-dev.yml] est déjà préconfiguré pour utiliser cette configuration. Accédez à http://localhost:5000
pour voir les e-mails.
Le fichier JAR peut être intégré dans une image Docker à l'aide du Dockerfile
fourni et des commandes suivantes :
docker build - t iwa -f Dockerfile .
ou sous Windows :
docker build - t iwa -f Dockerfile.win .
Cette image peut ensuite être exécutée à l'aide des commandes suivantes :
docker run - d - p 8888 : 8888 iwa
Il existe également un exemple de fichier docker-compose.yml
qui illustre comment exécuter l'application avec HTTPS/SSL à l'aide de nginx et certbot. Veuillez noter qu'il s'agit d'un nom de domaine uniquement à titre de référence car il utilise un nom de domaine « codé en dur ».
La plupart des exemples suivants nécessitent des informations d’identification spécifiques à l’environnement et à l’utilisateur. Ceux-ci sont chargés à partir d'un fichier appelé .env
dans le répertoire racine du projet. Ce fichier n'est pas créé par défaut (et ne doit jamais être stocké dans le contrôle de source). Un exemple avec tous les paramètres possibles pour les scénarios suivants est illustré ci-dessous :
# 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
Il existe un exemple de script PowerShell fortify-sast.ps1 que vous pouvez utiliser pour exécuter des tests de sécurité d'applications statiques via Fortify SCA.
.binfortify - sast.ps1 - SkipSSC
Ce script exécute une traduction sourceanalyzer
et analyse le code source du projet. Il crée un fichier Fortify Project Results appelé IWA-Java.fpr
que vous pouvez ouvrir à l'aide de l'outil Fortify auditworkbench
:
auditworkbench.cmd .IWA - Java.fpr
Il crée également un rapport PDF appelé IWA-Java.pdf
et télécharge éventuellement les résultats vers Fortify Software Security Center (SSC).
Afin de télécharger sur SSC, vous devrez avoir des entrées dans le .env
similaires à celles-ci :
SSC_URL=http://localhost:8080/ssc
SSC_AUTH_TOKEN=28145aad-c40d-426d-942b-f6d6aec9c56f
SSC_APP_NAME=IWA-Java
SSC_APP_VER_NAME=main
L'entrée SSC_AUTH_TOKEN
doit être définie sur la valeur d'un 'CIToken' créé dans SSC "Administration->Token Management" .
Il existe un script PowerShell fortify-scancentral-sast.ps1 que vous pouvez utiliser pour regrouper le projet et lancer une analyse à distance à l'aide de Fortify ScanCentral SAST :
.binfortify - scancentral - sast.ps1
Pour utiliser ScanCentral SAST, vous aurez besoin d'entrées dans le .env
similaires à celles-ci :
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]
L'entrée SSC_AUTH_TOKEN
doit être définie sur la valeur d'un 'CIToken' créé dans SSC "Administration->Token Management" .
Pour exécuter une analyse SAST Fortify on Demand, vous devez empaqueter et télécharger le code source sur Fortify on Demand. Pour regrouper le code dans un fichier Zip afin de le télécharger, vous pouvez utiliser l'utilitaire de commande scancentral
comme suit :
scancentral package - bt gradle - bf build.gradle - bt " clean build -x test " -- output fod.zip
Vous pouvez ensuite le télécharger manuellement à l'aide de l'interface utilisateur de Fortify on Demand, de l'utilitaire FoDUploader ou via la CLI Fortify à l'aide des commandes suivantes :
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::
Pour effectuer une analyse WebInspect, vous devez d'abord « exécuter » l'application en suivant l'une des étapes décrites ci-dessus. Ensuite, vous pouvez lancer une analyse à l'aide de la ligne de commande suivante :
" 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
Cela lancera une analyse à l’aide des fichiers de paramètres par défaut et de macro de connexion fournis dans le répertoire etc
Cela suppose que l'application s'exécute sur "localhost:8888". Il exécutera une analyse « Critique et haute priorité » en utilisant la politique portant l'ID 1008. Une fois terminé, vous pouvez ouvrir le « Client de bureau » WebInspect et accéder à l'analyse créée pour cette exécution. Un fichier FPR appelé IWA-DAST.fpr
sera également disponible - vous pouvez l'ouvrir avec auditworkbench
(ou générer un rapport PDF à l'aide ReportGenerator
). Vous pouvez également le télécharger sur Fortify SSC ou Fortify on Demand.
Il existe un exemple de fichier de script PowerShell fortify-webinspect.ps1 que vous pouvez exécuter pour exécuter l'analyse et télécharger les résultats sur SSC :
.binfortify - webinspect.ps1
Vous pouvez appeler une analyse dynamique Fortify on Demand à l'aide de l'utilitaire FCLI. Par exemple:
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 propose deux moyens d'effectuer une analyse DAST : le DAST traditionnel et le DAST automatisé . Dans cette section, nous utiliserons DAST Automated car il est plus adapté à l'intégration de commandes et de pipelines.
Vous pouvez appeler une analyse automatisée Fortify on Demand DAST à l'aide de l'utilitaire FCLI. Par exemple:
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::
À déterminer : comment télécharger des macros de connexion et/ou des flux de travail.
L'application IWA comprend une API basée sur Swagger entièrement documentée que vous pouvez accéder à l'adresse http://localhost:8888/swagger-ui/index.html?configUrl=/v3/api-docs/swagger-config. Vous pouvez effectuer des tests de sécurité de cette API à l'aide de Fortify WebInspect ou ScanCentral DAST. Une collection Postman est fournie pour vous aider. Vous pouvez exercer la collection en utilisant newman. Par exemple à partir d'une invite de commande PowerShell sous 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
Pour utiliser cette collection avec WebInspect, vous devrez vous assurer que newman est sur le chemin, puis vous pourrez exécuter :
& " C:Program FilesFortifyFortify WebInspectWI.exe " - pwc .etcIWA - API - Workflow.postman_collection.json - pec .etcIWA - API - Dev.postman_environment.json - ep " .IWA-API.fpr "
Importez les collections Postman suivantes dans ScanCentral DAST :
etcIWA-API-Prod.postman_environment.json
- comme environnementetcIWA-API-Auth.postman_collection.json
- comme collection d'authentificationetcIWA-API-Workflow.postman_collection.json
- en tant que collection WorkflowVous aurez alors besoin des paramètres suivants pour la génération dynamique de jetons
Jeton de réponse :
"accessToken"s*:s*"(?<BearerTokenValue>[-a-zA-Z0-9._~+/]+?=*)"
Jeton de demande :
Authorization:sBearers(?<BearerTokenValue>[^rn]*)r?n
Condition de déconnexion :
[STATUSCODE]401
L'analyse peut être exécutée à partir de l'interface utilisateur de ScanCentral DAST ou en enregistrant les paramètres et en utilisant la commande fcli sc-dast scan
.
Une analyse API peut être effectuée à l'aide de la collection Postman « combinée » suivante :
etcIWA-API-Prod-Combined.postman_environment.json
Cela peut être utilisé avec DAST traditionnel ou DAST Automated .
Le proxy Fortify FAST vous permet de capturer le trafic d'un test automatisé, puis d'utiliser le trafic comme flux de travail pour une exécution ScanCentral DAST. Pour réaliser l'exemple ici, vous devrez avoir installé WebInspect localement WIRCServerSetup64-ProxyOnly.msi
qui est disponible dans le Dynamic_Addons.zip
du support d'installation de ScanCentral DAST.
Il existe quelques exemples de Selenium qui peuvent être utilisés pour exécuter un test fonctionnel simple de l'application en cours d'exécution. Il existe également quelques scripts PowerShell start_fast_proxy.ps1 et stop_fast_proxy.ps1 qui peuvent être utilisés pour démarrer/arrêter le proxy FAST. Pour utiliser ces scripts, vous aurez besoin d'entrées dans le fichier .env
similaires à celles-ci :
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
Le SSC_AUTH_TOKEN_BASE64
est le (premier) jeton codé affiché dans SSC et non le (deuxième) jeton décodé. Effectuez ensuite les opérations suivantes à partir de la ligne de commande :
python -m pip install --upgrade pipenv wheel
pipenv shell
pipenv install --dev
Assurez-vous que l'application est en cours d'exécution, puis exécutez ce qui suit dans une fenêtre de terminal :
.binstart_fast_proxy.ps1
Ensuite, dans une autre fenêtre de terminal, exécutez ce qui suit :
pytest - v - s
Et puis enfin :
.binstop_fast_proxy.ps1
L'exécutable FAST du premier terminal doit se terminer, puis une analyse s'exécuter dans votre environnement ScanCentral DAST.
Si vous utilisez Jenkins, un Jenkinsfile
complet est fourni pour automatiser toutes les étapes typiques d'un processus de livraison continue (CD) DevSecOps typique. L'exemple utilise Fortify ScanCentral SAST/DAST et Sonatype Nexus IQ pour l'analyse de la composition logicielle.
Pour utiliser le Jenkinsfile
créez un nouveau travail de pipeline Jenkins et dans la section Pipeline, sélectionnez Pipeline script from SCM
et entrez les détails d'une version forkée de ce référentiel GitHub.
La première exécution du pipeline doit être traitée comme une étape de « configuration », car elle créera des paramètres de tâche que vous pourrez ensuite sélectionner pour déterminer les fonctionnalités que vous souhaitez activer dans le pipeline.
Vous devrez avoir installé et configuré les plugins Fortify Jenkins.
Il y a beaucoup de documentation dans le Jenkinsfile
lui-même, veuillez donc l'examiner pour voir ce que vous devrez faire d'autre pour un appel réussi.
Ce référentiel comprend un certain nombre d'exemples d'actions GitHub dans le .github/workflows qui automatisent la construction de l'application et analysent le code à l'aide de Fortify on Demand ou de Fortify ScanCentral pour SAST.
Pour les intégrations avec d'autres outils de pipeline, veuillez consulter https://github.com/fortify/IWA-Java.
Veuillez consulter le Guide de contribution pour plus d'informations sur la façon de développer et de contribuer.
Si vous rencontrez des problèmes, veuillez consulter les problèmes GitHub pour voir si cela a déjà été discuté.
Cette application est mise à disposition sous la licence publique générale GNU V3.