Para obtener una versión "oficial" de esta aplicación con integraciones de canalización adicionales, visite https://github.com/fortify/IWA-Java.
IWA (Aplicación web insegura) Pharmacy Direct es una aplicación web Java/Spring de ejemplo para usar en escenarios y demostraciones de DevSecOps . Incluye algunos ejemplos de código incorrecto e inseguro, que se pueden encontrar utilizando herramientas de prueba de seguridad de aplicaciones estáticas y dinámicas, como las proporcionadas por Micro Focus Fortify.
Uno de los objetivos principales de este proyecto es ilustrar cómo la seguridad puede integrarse tempranamente ("Shift-Left") y continuamente ("CI/CD") en el ciclo de vida del desarrollo. Por lo tanto, se proporcionan una serie de ejemplos de "integraciones" con herramientas comunes de canalización de CI/CD.
La aplicación está destinada a proporcionar la funcionalidad de una típica "farmacia en línea", incluida la compra de Productos (medicamentos) y la solicitud de Servicios (recetas, controles médicos, etc.). Tiene una interfaz HTML moderna (con algo de JavaScript) y una API basada en Swagger.
Tenga en cuenta: ¡la aplicación no debe utilizarse en un entorno de producción!
Puede encontrar una versión actualizada de la aplicación en ejecución en https://iwa.onfortify.com.
Para poder ejecutar escenarios de ejemplo usted mismo, se recomienda que "bifurque" una copia de este repositorio en su propia cuenta de GitHub. El proceso de "bifurcación" se describe en detalle en la documentación de GitHub; puede iniciar el proceso haciendo clic en el botón "Bifurcación" en la parte superior derecha.
Para compilar y ejecutar correctamente la aplicación, necesitará tener Java JDK 11 instalado y en su ruta.
Para compilar la aplicación usando Gradle, ejecute lo siguiente desde la línea de comando:
.gradlew clean build
Hay varias formas de ejecutar la aplicación según los escenarios que desee ejecutar.
Para ejecutar (y probar) localmente en modo de desarrollo, ejecute lo siguiente desde la línea de comando:
.gradlew bootRun
Luego navegue hasta la URL: http://localhost:8888. Puedes realizar una serie de acciones sin autenticar, pero si quieres iniciar sesión puedes hacerlo de la siguiente manera:
También hay un usuario administrativo:
Tenga en cuenta que si inicia sesión con user2
, posteriormente se le solicitará un código de autenticación multifactor (MFA). Puede encontrar este código examinando la salida de la consola.
Si desea utilizar un servidor de correo electrónico de desarrollo, le recomendaría utilizar (smtp4dev)[https://github.com/rnwood/smtp4dev.git]. El método más sencillo es iniciarlo como un contenedor acoplable:
docker run --rm -it -p 5000:80 -p 2525:25 rnwood/smtp4dev
Elimine --rm -it
si desea dejar smtp4dev ejecutándose en segundo plano; de lo contrario, se ejecutará hasta que presione CTRL+C.
El archivo (application-dev.yml)[./src/main/resources/application-dev.yml] ya está preconfigurado para usar esta configuración. Vaya a http://localhost:5000
para ver los correos electrónicos.
El archivo JAR se puede integrar en una imagen de Docker utilizando el Dockerfile
proporcionado y los siguientes comandos:
docker build - t iwa -f Dockerfile .
o en Windows:
docker build - t iwa -f Dockerfile.win .
Esta imagen luego se puede ejecutar usando los siguientes comandos:
docker run - d - p 8888 : 8888 iwa
También hay un archivo docker-compose.yml
de ejemplo que ilustra cómo ejecutar la aplicación con HTTPS/SSL usando nginx y certbot; tenga en cuenta que esto es solo como referencia, ya que utiliza un nombre de dominio "codificado".
La mayoría de los siguientes ejemplos necesitan credenciales específicas del entorno y del usuario. Estos se cargan desde un archivo llamado .env
en el directorio raíz del proyecto. Este archivo no se crea de forma predeterminada (y nunca debe almacenarse en el control de código fuente). A continuación se ilustra un ejemplo con todas las configuraciones posibles para los siguientes escenarios:
# 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
Hay un ejemplo de script de PowerShell fortify-sast.ps1 que puede utilizar para ejecutar pruebas de seguridad de aplicaciones estáticas a través de Fortify SCA.
.binfortify - sast.ps1 - SkipSSC
Este script ejecuta una traducción sourceanalyzer
y escanea el código fuente del proyecto. Crea un archivo de resultados del proyecto Fortify llamado IWA-Java.fpr
que puede abrir usando la herramienta Fortify auditworkbench
:
auditworkbench.cmd .IWA - Java.fpr
También crea un informe en PDF llamado IWA-Java.pdf
y, opcionalmente, carga los resultados en Fortify Software Security Center (SSC).
Para poder subir al SSC necesitarás tener entradas en el .env
similares a las siguientes:
SSC_URL=http://localhost:8080/ssc
SSC_AUTH_TOKEN=28145aad-c40d-426d-942b-f6d6aec9c56f
SSC_APP_NAME=IWA-Java
SSC_APP_VER_NAME=main
La entrada SSC_AUTH_TOKEN
debe establecerse en el valor de un 'CIToken' creado en SSC "Administración->Gestión de tokens" .
Hay un script de PowerShell fortify-scancentral-sast.ps1 que puede usar para empaquetar el proyecto e iniciar un escaneo remoto usando Fortify ScanCentral SAST:
.binfortify - scancentral - sast.ps1
Para utilizar ScanCentral SAST necesitará tener entradas en el .env
similares a las siguientes:
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]
La entrada SSC_AUTH_TOKEN
debe establecerse en el valor de un 'CIToken' creado en SSC "Administración->Gestión de tokens" .
Para ejecutar un análisis SAST de Fortify on Demand, debe empaquetar y cargar el código fuente en Fortify on Demand. Para empaquetar el código en un archivo Zip para cargarlo, puede utilizar la utilidad de comando scancentral
de la siguiente manera:
scancentral package - bt gradle - bf build.gradle - bt " clean build -x test " -- output fod.zip
Luego puede cargar esto manualmente usando la interfaz de usuario de Fortify on Demand, usando la utilidad FoDUploader o mediante la CLI de Fortify usando los siguientes comandos:
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::
Para realizar un análisis de WebInspect, primero debe "ejecutar" la aplicación siguiendo uno de los pasos descritos anteriormente. Luego puede iniciar un escaneo usando la siguiente línea de comando:
" 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
Esto iniciará un análisis utilizando los archivos de configuración predeterminada y macro de inicio de sesión proporcionados en el directorio etc
Se supone que la aplicación se ejecuta en "localhost:8888". Ejecutará un análisis "crítico y de alta prioridad" utilizando la política con ID 1008. Una vez completado, puede abrir el "Cliente de escritorio" de WebInspect y navegar hasta el análisis creado para esta ejecución. También estará disponible un archivo FPR llamado IWA-DAST.fpr
; puede abrirlo con auditworkbench
(o generar un informe PDF usando ReportGenerator
). También puede cargarlo en Fortify SSC o Fortify on Demand.
Hay un archivo de script de PowerShell de ejemplo fortify-webinspect.ps1 que puede ejecutar para ejecutar el análisis y cargar los resultados en SSC:
.binfortify - webinspect.ps1
Puede invocar un análisis dinámico de Fortify on Demand utilizando la utilidad FCLI. Por ejemplo:
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 proporciona dos medios para realizar el escaneo DAST: DAST tradicional y DAST automatizado . En esta sección usaremos DAST Automated ya que es más adecuado para la integración de comandos y canalizaciones.
Puede invocar un análisis automatizado DAST de Fortify on Demand utilizando la utilidad FCLI. Por ejemplo:
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: cómo cargar macros de inicio de sesión y/o flujos de trabajo.
La aplicación IWA incluye una API basada en Swagger completamente documentada a la que puede acceder en http://localhost:8888/swagger-ui/index.html?configUrl=/v3/api-docs/swagger-config. Puede realizar pruebas de seguridad de esta API utilizando Fortify WebInspect o ScanCentral DAST. Se proporciona una colección Postman para ayudar con esto. Puedes ejercitar la colección usando Newman. Por ejemplo, desde un símbolo del sistema de PowerShell en 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
Para utilizar esta colección con WebInspect, deberá asegurarse de que Newman esté en la ruta y luego podrá ejecutar:
& " C:Program FilesFortifyFortify WebInspectWI.exe " - pwc .etcIWA - API - Workflow.postman_collection.json - pec .etcIWA - API - Dev.postman_environment.json - ep " .IWA-API.fpr "
Importe las siguientes colecciones de Postman a ScanCentral DAST:
etcIWA-API-Prod.postman_environment.json
- como entornoetcIWA-API-Auth.postman_collection.json
- como colección de autenticaciónetcIWA-API-Workflow.postman_collection.json
- como colección de flujo de trabajoLuego necesitará las siguientes configuraciones para la generación dinámica de tokens
Ficha de respuesta:
"accessToken"s*:s*"(?<BearerTokenValue>[-a-zA-Z0-9._~+/]+?=*)"
Solicitar token:
Authorization:sBearers(?<BearerTokenValue>[^rn]*)r?n
Condición de cierre de sesión:
[STATUSCODE]401
El escaneo se puede ejecutar desde la interfaz de usuario de ScanCentral DAST o guardando la configuración y usando el comando fcli sc-dast scan
.
Se puede realizar un análisis de API utilizando la siguiente colección Postman "combinada":
etcIWA-API-Prod-Combined.postman_environment.json
Esto se puede utilizar con DAST tradicional o DAST automatizado .
Fortify FAST Proxy le permite capturar el tráfico de una ejecución de prueba automatizada y luego utilizar el tráfico como un flujo de trabajo para una ejecución de ScanCentral DAST. Para llevar a cabo el ejemplo aquí, deberá haber instalado WebInspect localmente WIRCServerSetup64-ProxyOnly.msi
, que está disponible en Dynamic_Addons.zip
del medio de instalación de ScanCentral DAST.
Hay algunos ejemplos de Selenium que se pueden utilizar para ejecutar una prueba funcional simple de la aplicación en ejecución. También hay un par de scripts de PowerShell start_fast_proxy.ps1 y stop_fast_proxy.ps1 que se pueden usar para iniciar/detener FAST Proxy. Para utilizar estos scripts necesitará tener entradas en el archivo .env
similares a las siguientes:
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
SSC_AUTH_TOKEN_BASE64
es el (primer) token codificado que se muestra en SSC, no el (segundo) token decodificado. Luego realice lo siguiente desde la línea de comando:
python -m pip install --upgrade pipenv wheel
pipenv shell
pipenv install --dev
Asegúrese de que la aplicación se esté ejecutando y luego ejecute lo siguiente en una ventana de terminal:
.binstart_fast_proxy.ps1
Luego en otra ventana de terminal ejecuta lo siguiente:
pytest - v - s
Y finalmente:
.binstop_fast_proxy.ps1
El ejecutable FAST del primer terminal debería finalizar y luego ejecutarse un escaneo en su entorno ScanCentral DAST.
Si está utilizando Jenkins, se proporciona un Jenkinsfile
completo para automatizar todos los pasos típicos de un proceso típico de entrega continua (CD) de DevSecOps. El ejemplo utiliza Fortify ScanCentral SAST/DAST y Sonatype Nexus IQ para el análisis de composición de software.
Para utilizar Jenkinsfile
cree un nuevo trabajo de canalización de Jenkins y, en la sección Canalización, seleccione Pipeline script from SCM
e ingrese los detalles de una versión bifurcada de este repositorio de GitHub.
La primera ejecución de la canalización debe tratarse como un paso de "configuración", ya que creará algunos parámetros de trabajo que luego podrá seleccionar para determinar qué funciones desea habilitar en la canalización.
Deberá haber instalado y configurado los complementos de Fortify Jenkins.
Hay mucha documentación en el Jenkinsfile
, así que examínelo para ver qué más deberá hacer para una invocación exitosa.
Este repositorio incluye una serie de ejemplos de acciones de GitHub en .github/workflows que automatizan la compilación de la aplicación y escanean el código usando Fortify on Demand o Fortify ScanCentral para SAST.
Para integraciones con otras herramientas de canalización, consulte https://github.com/fortify/IWA-Java.
Consulte la Guía de contribuciones para obtener información sobre cómo desarrollar y contribuir.
Si tiene algún problema, consulte Problemas de GitHub para ver si ya se ha discutido.
Esta aplicación está disponible bajo la Licencia Pública General GNU V3.