有关此应用程序的“官方”版本以及其他管道集成,请访问 https://github.com/fortify/IWA-Java。
IWA(不安全的 Web 应用程序)Pharmacy Direct是一个示例 Java/Spring Web 应用程序,用于DevSecOps场景和演示。它包括一些不良和不安全代码的示例 - 可以使用静态和动态应用程序安全测试工具(例如 Micro Focus Fortify 提供的工具)找到这些示例。
该项目的主要目标之一是说明如何在开发生命周期中尽早(“Shift-Left”)和持续(“CI/CD”)嵌入安全性。因此,提供了许多与常见 CI/CD 管道工具“集成”的示例。
该应用程序旨在提供典型“在线药房”的功能,包括购买产品(药物)和请求服务(处方、健康检查等)。它有一个现代的 HTML 前端(带有一些 JavaScript)和一个基于 Swagger 的 API。
请注意:该应用程序不应在生产环境中使用!
您可以在 https://iwa.onfortify.com 上找到正在运行的应用程序的最新版本。
为了自己执行示例场景,建议您将此存储库的副本“分叉”到您自己的 GitHub 帐户中。 GitHub 文档中详细描述了“分叉”的过程 - 您可以通过单击右上角的“分叉”按钮来启动该过程。
为了成功构建并运行应用程序,您需要在路径上安装 Java JDK 11。
要使用 Gradle 构建应用程序,请从命令行执行以下命令:
.gradlew clean build
根据您希望执行的场景,有多种运行应用程序的方法。
要在开发模式下本地运行(和测试),请从命令行执行以下命令:
.gradlew bootRun
然后导航到 URL:http://localhost:8888。您可以在未经身份验证的情况下执行许多操作,但如果您想登录,可以按以下步骤操作:
还有一个管理用户:
请注意,如果您使用user2
登录,随后系统会要求您提供多重身份验证 (MFA) 代码。您可以通过检查控制台输出找到此代码。
如果您想使用开发电子邮件服务器,我建议使用(smtp4dev)[https://github.com/rnwood/smtp4dev.git]。最简单的方法是将其作为 docker 容器启动:
docker run --rm -it -p 5000:80 -p 2525:25 rnwood/smtp4dev
如果您想让 smtp4dev 在后台运行,请删除--rm -it
,否则它将一直运行,直到您按 CTRL+C。
(application-dev.yml)[./src/main/resources/application-dev.yml] 文件已预先配置为使用此配置。浏览到http://localhost:5000
以查看电子邮件。
可以使用提供的Dockerfile
和以下命令将 JAR 文件构建到 Docker 映像中:
docker build - t iwa -f Dockerfile .
或在 Windows 上:
docker build - t iwa -f Dockerfile.win .
然后可以使用以下命令执行该图像:
docker run - d - p 8888 : 8888 iwa
还有一个示例docker-compose.yml
文件,说明如何使用 nginx 和 certbot 通过 HTTPS/SSL 运行应用程序 - 请注意,这仅供参考,因为它使用“硬编码”域名。
以下大多数示例都需要环境和用户特定的凭据。它们是从项目根目录中名为.env
的文件加载的。默认情况下不会创建此文件(并且永远不应将其存储在源代码管理中)。下面举例说明了以下场景的所有可能设置的示例:
# 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
您可以使用一个示例 PowerShell 脚本 fortify-sast.ps1 通过 Fortify SCA 执行静态应用程序安全测试。
.binfortify - sast.ps1 - SkipSSC
该脚本运行sourceanalyzer
翻译并扫描项目的源代码。它会创建一个名为IWA-Java.fpr
的 Fortify 项目结果文件,您可以使用auditworkbench
工具打开该文件:
auditworkbench.cmd .IWA - Java.fpr
它还创建一个名为IWA-Java.pdf
的 PDF 报告,并可选择将结果上传到 Fortify 软件安全中心 (SSC)。
为了上传到 SSC,您需要在.env
中包含类似于以下内容的条目:
SSC_URL=http://localhost:8080/ssc
SSC_AUTH_TOKEN=28145aad-c40d-426d-942b-f6d6aec9c56f
SSC_APP_NAME=IWA-Java
SSC_APP_VER_NAME=main
SSC_AUTH_TOKEN
条目应设置为在 SSC “管理 -> 令牌管理”中创建的“CIToken”的值。
您可以使用 PowerShell 脚本 fortify-scancentral-sast.ps1 来打包项目并使用 Fortify ScanCentral SAST 启动远程扫描:
.binfortify - scancentral - sast.ps1
为了使用 ScanCentral SAST,您需要在.env
中包含类似于以下内容的条目:
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]
SSC_AUTH_TOKEN
条目应设置为在 SSC “管理 -> 令牌管理”中创建的“CIToken”的值。
要执行 Fortify on Demand SAST 扫描,您需要打包源代码并将其上传到 Fortify on Demand。要将代码打包成 Zip 文件进行上传,您可以使用scancentral
命令实用程序,如下所示:
scancentral package - bt gradle - bf build.gradle - bt " clean build -x test " -- output fod.zip
然后,您可以使用 Fortify on Demand UI、FoDUploader 实用程序或通过 Fortify CLI 使用以下命令手动上传:
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::
要执行 WebInspect 扫描,您应该首先使用上述步骤之一“运行”应用程序。然后您可以使用以下命令行开始扫描:
" 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
这将使用etc
目录中提供的默认设置和登录宏文件开始扫描。它假设应用程序正在“localhost:8888”上运行。它将使用 id 1008 的策略运行“关键和高优先级”扫描。完成后,您可以打开 WebInspect“桌面客户端”并导航到为此执行创建的扫描。名为IWA-DAST.fpr
的 FPR 文件也将可用 - 您可以使用auditworkbench
打开它(或使用ReportGenerator
生成 PDF 报告)。您还可以将其上传到 Fortify SSC 或 Fortify on Demand。
您可以运行一个示例 PowerShell 脚本文件 fortify-webinspect.ps1 来执行扫描并将结果上传到 SSC:
.binfortify - webinspect.ps1
您可以使用 FCLI 实用程序调用 Fortify on Demand 动态扫描。例如:
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 提供两种执行 DAST 扫描的方法:传统 DAST 和DAST 自动。在本节中,我们将使用DAST Automated ,因为这更适合命令和管道集成。
您可以使用 FCLI 实用程序调用 Fortify on Demand DAST 自动扫描。例如:
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:如何上传登录宏和/或工作流程。
IWA 应用程序包含完整记录的基于 Swagger 的 API,您可以通过 http://localhost:8888/swagger-ui/index.html?configUrl=/v3/api-docs/swagger-config 浏览到该 API。您可以使用 Fortify WebInspect 或 ScanCentral DAST 对此 API 进行安全测试。提供了 Postman 集合来帮助实现这一点。您可以使用 newman 来练习该集合。例如,从 Windows 上的 PowerShell 命令提示符处:
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
为了将此集合与 WebInspect 一起使用,您需要确保 newman 在路径上,然后您可以运行:
& " C:Program FilesFortifyFortify WebInspectWI.exe " - pwc .etcIWA - API - Workflow.postman_collection.json - pec .etcIWA - API - Dev.postman_environment.json - ep " .IWA-API.fpr "
将以下 Postman 集合导入 ScanCentral DAST:
etcIWA-API-Prod.postman_environment.json
- 作为环境etcIWA-API-Auth.postman_collection.json
- 作为身份验证集合etcIWA-API-Workflow.postman_collection.json
- 作为工作流程集合然后,您将需要对动态令牌生成进行以下设置
响应令牌:
"accessToken"s*:s*"(?<BearerTokenValue>[-a-zA-Z0-9._~+/]+?=*)"
请求令牌:
Authorization:sBearers(?<BearerTokenValue>[^rn]*)r?n
注销条件:
[STATUSCODE]401
扫描可以从 ScanCentral DAST UI 运行,也可以通过保存设置并使用fcli sc-dast scan
命令来运行。
可以使用以下“组合”Postman 集合来执行 API 扫描:
etcIWA-API-Prod-Combined.postman_environment.json
这可以与传统 DAST 或DAST Automated一起使用。
Fortify FAST 代理允许您从自动化测试运行中捕获流量,然后使用该流量作为 ScanCentral DAST 执行的工作流程。为了执行此处的示例,您需要在本地安装 WebInspect WIRCServerSetup64-ProxyOnly.msi
,该文件位于 ScanCentral DAST 安装介质的Dynamic_Addons.zip
中。
有一些 Selenium 示例可用于对正在运行的应用程序执行简单的功能测试。还有几个 PowerShell 脚本 start_fast_proxy.ps1 和 stop_fast_proxy.ps1 可用于启动/停止 FAST 代理。为了使用这些脚本,您需要在.env
文件中包含类似于以下内容的条目:
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
是 SSC 中显示的(第一个)编码令牌,而不是(第二个)解码令牌。然后从命令行执行以下操作:
python -m pip install --upgrade pipenv wheel
pipenv shell
pipenv install --dev
确保应用程序正在运行,然后在终端窗口中执行以下命令:
.binstart_fast_proxy.ps1
然后在另一个终端窗口中执行以下命令:
pytest - v - s
最后:
.binstop_fast_proxy.ps1
第一个终端的 FAST 可执行文件应终止,然后在 ScanCentral DAST 环境中执行扫描。
如果您使用 Jenkins,则会提供全面的Jenkinsfile
来自动执行典型 DevSecOps 持续交付 (CD) 流程的所有典型步骤。该示例利用 Fortify ScanCentral SAST/DAST 和 Sonatype Nexus IQ 进行软件构成分析。
要使用Jenkinsfile
请创建一个新的 Jenkins管道作业,并在管道部分中选择Pipeline script from SCM
,然后输入此 GitHub 存储库的分叉版本的详细信息。
管道的第一次运行应被视为“设置”步骤,因为它将创建一些作业参数,然后您可以选择这些参数来确定要在管道中启用哪些功能。
您需要安装并配置 Fortify Jenkins 插件。
Jenkinsfile
本身中有很多文档,因此请检查它以了解成功调用还需要做什么。
此存储库在 .github/workflows 中包含许多 GitHub Actions 示例,这些示例可自动构建应用程序并使用 Fortify on Demand 或 Fortify ScanCentral for SAST 扫描代码。
有关与其他管道工具的集成,请参阅 https://github.com/fortify/IWA-Java。
有关如何开发和贡献的信息,请参阅贡献指南。
如果您有任何问题,请查阅 GitHub Issues 看看是否已经讨论过。
该应用程序根据 GNU 通用公共许可证 V3 提供