Para obter uma versão "oficial" deste aplicativo com integrações adicionais de pipeline, visite https://github.com/fortify/IWA-Java.
IWA (Insecure Web App) Pharmacy Direct é um exemplo de aplicativo Java/Spring Web para uso em cenários e demonstrações DevSecOps . Ele inclui alguns exemplos de código ruim e inseguro – que podem ser encontrados usando ferramentas de teste de segurança de aplicativos estáticos e dinâmicos, como as fornecidas pelo Micro Focus Fortify.
Um dos principais objetivos deste projeto é ilustrar como a segurança pode ser incorporada precocemente (“Shift-Left”) e continuamente (“CI/CD”) no ciclo de vida de desenvolvimento. Portanto, são fornecidos vários exemplos de "integrações" com ferramentas comuns de pipeline de CI/CD.
A aplicação destina-se a fornecer a funcionalidade de uma típica “farmácia online”, incluindo a compra de Produtos (medicamentos) e a solicitação de Serviços (receitas, exames de saúde, etc.). Possui um front-end HTML moderno (com algum JavaScript) e uma API baseada em Swagger.
Atenção: o aplicativo não deve ser usado em ambiente de produção!
Uma versão atualizada do aplicativo em execução pode ser encontrada em https://iwa.onfortify.com.
Para executar cenários de exemplo por si mesmo, é recomendado que você "fork" uma cópia deste repositório em sua própria conta GitHub. O processo de "fork" é descrito em detalhes na documentação do GitHub - você pode iniciar o processo clicando no botão "Fork" no canto superior direito.
Para construir e executar o aplicativo com êxito, você precisará ter o Java JDK 11 instalado e em seu caminho.
Para construir o aplicativo usando Gradle, execute o seguinte na linha de comando:
.gradlew clean build
Existem várias maneiras de executar o aplicativo, dependendo do(s) cenário(s) que você deseja executar.
Para executar (e testar) localmente no modo de desenvolvimento, execute o seguinte na linha de comando:
.gradlew bootRun
Em seguida, navegue até a URL: http://localhost:8888. Você pode realizar uma série de ações não autenticadas, mas se quiser fazer o login, você pode fazer o seguinte:
Há também um usuário administrativo:
Observe que se você fizer login com user2
, será solicitado posteriormente um código de autenticação multifator (MFA). Você pode encontrar esse código examinando a saída do console.
Se você quiser usar um servidor de e-mail de desenvolvimento, recomendo usar (smtp4dev)[https://github.com/rnwood/smtp4dev.git]. A abordagem mais fácil é iniciá-lo como um contêiner docker:
docker run --rm -it -p 5000:80 -p 2525:25 rnwood/smtp4dev
Remova --rm -it
se quiser deixar o smtp4dev rodando em segundo plano, caso contrário ele será executado até você pressionar CTRL+C.
O arquivo (application-dev.yml)[./src/main/resources/application-dev.yml] já está pré-configurado para usar esta configuração. Navegue até http://localhost:5000
para ver os e-mails.
O arquivo JAR pode ser integrado em uma imagem Docker usando o Dockerfile
fornecido e os seguintes comandos:
docker build - t iwa -f Dockerfile .
ou no Windows:
docker build - t iwa -f Dockerfile.win .
Esta imagem pode então ser executada usando os seguintes comandos:
docker run - d - p 8888 : 8888 iwa
Há também um arquivo docker-compose.yml
de exemplo que ilustra como executar o aplicativo com HTTPS/SSL usando nginx e certbot - observe que isso é apenas para referência, pois usa um nome de domínio "codificado".
A maioria dos exemplos a seguir precisa de credenciais específicas do ambiente e do usuário. Eles são carregados de um arquivo chamado .env
no diretório raiz do projeto. Este arquivo não é criado por padrão (e nunca deve ser armazenado no controle de origem). Um exemplo com todas as configurações possíveis para os seguintes cenários é ilustrado abaixo:
# 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
Há um exemplo de script do PowerShell fortify-sast.ps1 que você pode usar para executar testes de segurança de aplicativos estáticos por meio do Fortify SCA.
.binfortify - sast.ps1 - SkipSSC
Este script executa uma tradução sourceanalyzer
e verifica o código-fonte do projeto. Ele cria um arquivo de resultados do projeto Fortify chamado IWA-Java.fpr
que você pode abrir usando a ferramenta Fortify auditworkbench
:
auditworkbench.cmd .IWA - Java.fpr
Ele também cria um relatório em PDF chamado IWA-Java.pdf
e, opcionalmente, carrega os resultados no Fortify Software Security Center (SSC).
Para fazer upload para o SSC, você precisará ter entradas no .env
semelhantes às seguintes:
SSC_URL=http://localhost:8080/ssc
SSC_AUTH_TOKEN=28145aad-c40d-426d-942b-f6d6aec9c56f
SSC_APP_NAME=IWA-Java
SSC_APP_VER_NAME=main
A entrada SSC_AUTH_TOKEN
deve ser definida com o valor de um 'CIToken' criado em SSC "Administration->Token Management" .
Há um script do PowerShell fortify-scancentral-sast.ps1 que você pode usar para empacotar o projeto e iniciar uma verificação remota usando o Fortify ScanCentral SAST:
.binfortify - scancentral - sast.ps1
Para usar o ScanCentral SAST, você precisará ter entradas no .env
semelhantes às seguintes:
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]
A entrada SSC_AUTH_TOKEN
deve ser definida com o valor de um 'CIToken' criado em SSC "Administration->Token Management" .
Para executar uma varredura SAST do Fortify on Demand, você precisa empacotar e fazer upload do código-fonte para o Fortify on Demand. Para empacotar o código em um arquivo Zip para upload, você pode usar o utilitário de comando scancentral
da seguinte forma:
scancentral package - bt gradle - bf build.gradle - bt " clean build -x test " -- output fod.zip
Você pode então fazer upload manualmente usando a UI do Fortify on Demand, usando o utilitário FoDUploader ou por meio da CLI do Fortify usando os seguintes 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 uma verificação do WebInspect você deve primeiro “executar” o aplicativo usando uma das etapas descritas acima. Então você pode iniciar uma verificação usando a seguinte linha 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
Isso iniciará uma verificação usando as configurações padrão e os arquivos de macro de login fornecidos no diretório etc
Ele assume que o aplicativo está sendo executado em "localhost:8888". Ele executará uma varredura "Crítica e de Alta Prioridade" usando a política com id 1008. Depois de concluído, você pode abrir o "Cliente Desktop" do WebInspect e navegar até a varredura criada para esta execução. Um arquivo FPR chamado IWA-DAST.fpr
também estará disponível - você pode abri-lo com auditworkbench
(ou gerar um relatório PDF usando ReportGenerator
). Você também pode carregá-lo no Fortify SSC ou no Fortify on Demand.
Há um exemplo de arquivo de script do PowerShell fortify-webinspect.ps1 que você pode executar para executar a verificação e carregar os resultados no SSC:
.binfortify - webinspect.ps1
Você pode invocar uma verificação dinâmica do Fortify on Demand usando o utilitário FCLI. Por exemplo:
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::
O Fortify on Demands fornece dois meios de realizar a varredura DAST: DAST tradicional e DAST Automatizado . Nesta seção usaremos DAST Automatizado , pois é mais adequado para integração de comandos e pipeline.
Você pode invocar uma verificação automatizada DAST do Fortify on Demand usando o utilitário FCLI. Por exemplo:
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::
A definir: como fazer upload de macros de login e/ou fluxos de trabalho.
O aplicativo IWA inclui uma API baseada em Swagger totalmente documentada, que você pode navegar em http://localhost:8888/swagger-ui/index.html?configUrl=/v3/api-docs/swagger-config. Você pode realizar testes de segurança desta API usando o Fortify WebInspect ou o ScanCentral DAST. Uma coleção Postman é fornecida para ajudar nisso. Você pode exercitar a coleção usando newman. Por exemplo, em um prompt de comando do PowerShell no 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 usar esta coleção com o WebInspect, você precisará certificar-se de que newman está no caminho e então poderá executar:
& " C:Program FilesFortifyFortify WebInspectWI.exe " - pwc .etcIWA - API - Workflow.postman_collection.json - pec .etcIWA - API - Dev.postman_environment.json - ep " .IWA-API.fpr "
Importe as seguintes coleções do Postman para o ScanCentral DAST:
etcIWA-API-Prod.postman_environment.json
- como ambienteetcIWA-API-Auth.postman_collection.json
- como coleção de autenticaçãoetcIWA-API-Workflow.postman_collection.json
- como coleção de fluxo de trabalhoVocê precisará então das seguintes configurações para a geração dinâmica de token
Token de resposta:
"accessToken"s*:s*"(?<BearerTokenValue>[-a-zA-Z0-9._~+/]+?=*)"
Solicitar token:
Authorization:sBearers(?<BearerTokenValue>[^rn]*)r?n
Condição de logout:
[STATUSCODE]401
A verificação pode ser executada a partir da UI do ScanCentral DAST ou salvando as configurações e usando o comando fcli sc-dast scan
.
Uma varredura de API pode ser realizada usando a seguinte coleção Postman "combinada":
etcIWA-API-Prod-Combined.postman_environment.json
Isso pode ser usado com DAST tradicional ou DAST Automatizado .
O Fortify FAST Proxy permite capturar o tráfego de uma execução de teste automatizada e, em seguida, usar o tráfego como um fluxo de trabalho para uma execução do ScanCentral DAST. Para executar o exemplo aqui, você precisará ter instalado o WebInspect localmente WIRCServerSetup64-ProxyOnly.msi
, que está disponível no Dynamic_Addons.zip
da mídia de instalação do ScanCentral DAST.
Existem alguns exemplos de Selenium que podem ser usados para executar um teste funcional simples do aplicativo em execução. Há também alguns scripts do PowerShell start_fast_proxy.ps1 e stop_fast_proxy.ps1 que podem ser usados para iniciar/parar o FAST Proxy. Para usar esses scripts, você precisará ter entradas no arquivo .env
semelhantes às seguintes:
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
O SSC_AUTH_TOKEN_BASE64
é o (primeiro) token codificado mostrado no SSC e não o (segundo) token decodificado. Em seguida, execute o seguinte na linha de comando:
python -m pip install --upgrade pipenv wheel
pipenv shell
pipenv install --dev
Certifique-se de que o aplicativo esteja em execução e execute o seguinte em uma janela de terminal:
.binstart_fast_proxy.ps1
Então, em outra janela do terminal, execute o seguinte:
pytest - v - s
E finalmente:
.binstop_fast_proxy.ps1
O executável FAST do primeiro terminal deve terminar e, em seguida, uma varredura será executada em seu ambiente ScanCentral DAST.
Se você estiver usando Jenkins, um Jenkinsfile
abrangente será fornecido para automatizar todas as etapas típicas de um processo típico de entrega contínua (CD) de DevSecOps. O exemplo usa Fortify ScanCentral SAST/DAST e Sonatype Nexus IQ para análise de composição de software.
Para usar o Jenkinsfile
crie um novo Jenkins Pipeline Job e na seção Pipeline selecione Pipeline script from SCM
e insira os detalhes de uma versão bifurcada deste repositório GitHub.
A primeira execução do pipeline deve ser tratada como uma etapa de "configuração", pois criará alguns parâmetros de trabalho que você poderá selecionar para determinar quais recursos deseja ativar no pipeline.
Você precisará ter instalado e configurado os plug-ins do Fortify Jenkins.
Há muita documentação no próprio Jenkinsfile
, portanto, examine-a para ver o que mais você precisará fazer para uma invocação bem-sucedida.
Este repositório inclui vários exemplos de GitHub Actions em .github/workflows que automatizam a construção do aplicativo e verificam o código usando o Fortify on Demand ou o Fortify ScanCentral for SAST.
Para integrações com outras ferramentas de pipeline, consulte https://github.com/fortify/IWA-Java.
Consulte o Guia de Contribuição para obter informações sobre como desenvolver e contribuir.
Se você tiver algum problema, consulte GitHub Issues para ver se já foi discutido.
Este aplicativo está disponível sob a Licença Pública Geral GNU V3