Чтобы получить «официальную» версию этого приложения с дополнительной интеграцией конвейера, посетите https://github.com/fortify/IWA-Java.
IWA (Insecure Web App) Pharmacy Direct — это пример веб-приложения Java/Spring для использования в сценариях и демонстрациях DevSecOps . Он включает в себя несколько примеров плохого и небезопасного кода, которые можно найти с помощью статических и динамических инструментов тестирования безопасности приложений, например, предоставляемых Micro Focus Fortify.
Одна из основных целей этого проекта — продемонстрировать, как безопасность может быть встроена на ранних этапах («Shift-Left») и непрерывно («CI/CD») в жизненный цикл разработки. Поэтому представлен ряд примеров «интеграции» с обычными инструментами конвейера CI/CD.
Приложение предназначено для обеспечения функциональности типичной «интернет-аптеки», включая покупку продуктов (лекарств) и запрос услуг (рецепты, медицинские осмотры и т. д.). Он имеет современный HTML-интерфейс (с некоторым количеством JavaScript) и API на основе Swagger.
Обратите внимание: приложение не должно использоваться в производственной среде!
Актуальную версию работающего приложения можно найти по адресу 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 run --rm -it -p 5000:80 -p 2525:25 rnwood/smtp4dev
Удалите --rm -it
если вы хотите, чтобы smtp4dev работал в фоновом режиме, иначе он будет работать до тех пор, пока вы не нажмете CTRL+C.
Файл (application-dev.yml)[./src/main/resources/application-dev.yml] уже предварительно настроен для использования этой конфигурации. Перейдите по адресу http://localhost:5000
чтобы просмотреть электронные письма.
Файл JAR можно встроить в образ Docker, используя предоставленный Dockerfile
и следующие команды:
docker build - t iwa -f Dockerfile .
или в Windows:
docker build - t iwa -f Dockerfile.win .
Затем это изображение можно выполнить с помощью следующих команд:
docker run - d - p 8888 : 8888 iwa
Существует также пример файла docker-compose.yml
, который иллюстрирует, как запустить приложение с HTTPS/SSL с использованием nginx и certbot. Обратите внимание, что это только для справки, поскольку оно использует «жестко закодированное» доменное имя.
Для большинства следующих примеров требуются учетные данные, специфичные для среды и пользователя. Они загружаются из файла .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
и сканирует исходный код проекта. Он создает файл результатов проекта Fortify с именем IWA-Java.fpr
, который можно открыть с помощью инструмента auditworkbench
Fortify:
auditworkbench.cmd .IWA - Java.fpr
Он также создает отчет в формате PDF под названием IWA-Java.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
должно быть установлено значение CIToken, созданного в SSC «Администрирование->Управление токенами» .
Существует сценарий 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
должно быть установлено значение CIToken, созданного в SSC «Администрирование->Управление токенами» .
Чтобы выполнить сканирование SAST Fortify on Demand, вам необходимо упаковать и загрузить исходный код в Fortify on Demand. Чтобы упаковать код в Zip-файл для загрузки, вы можете использовать командную утилиту scancentral
следующим образом:
scancentral package - bt gradle - bf build.gradle - bt " clean build -x test " -- output fod.zip
Затем вы можете загрузить это вручную с помощью пользовательского интерфейса Fortify on Demand, с помощью утилиты FoDUploader или через интерфейс командной строки Fortify, используя следующие команды:
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». Он запустит сканирование «Критическое и высокое приоритетное», используя политику с идентификатором 1008. После завершения вы можете открыть «Клиент рабочего стола» WebInspect и перейти к сканированию, созданному для этого выполнения. Также будет доступен файл FPR под названием IWA-DAST.fpr
— вы можете открыть его с помощью auditworkbench
(или создать отчет в формате PDF с помощью ReportGenerator
). Вы также можете загрузить его в Fortify SSC или Fortify on Demand.
Существует пример файла сценария PowerShell fortify-webinspect.ps1, который вы можете запустить для выполнения сканирования и загрузки результатов в SSC:
.binfortify - webinspect.ps1
Вы можете запустить динамическое сканирование Fortify on Demand с помощью утилиты FCLI. Например:
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 , поскольку он больше подходит для интеграции команд и конвейеров.
Вы можете запустить автоматическое сканирование Fortify on Demand DAST с помощью утилиты FCLI. Например:
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 включает полностью документированный API на основе Swagger, который можно найти по адресу http://localhost:8888/swagger-ui/index.html?configUrl=/v3/api-docs/swagger-config. Вы можете провести тестирование безопасности этого API с помощью Fortify WebInspect или ScanCentral DAST. В этом вам поможет коллекция Postman. Вы можете использовать коллекцию с помощью newman. Например, из командной строки PowerShell в 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
Чтобы использовать эту коллекцию с 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 или сохранить настройки и использовать команду fcli sc-dast scan
.
Сканирование API можно выполнить с помощью следующей «комбинированной» коллекции Postman:
etcIWA-API-Prod-Combined.postman_environment.json
Это можно использовать как с традиционным DAST, так и с DAST Automated .
Прокси-сервер Fortify FAST позволяет захватывать трафик в ходе автоматического тестового запуска, а затем использовать его в качестве рабочего процесса для выполнения ScanCentral DAST. Чтобы реализовать приведенный здесь пример, вам потребуется локально установить WebInspect WIRCServerSetup64-ProxyOnly.msi
, который доступен в архиве Dynamic_Addons.zip
установочного носителя ScanCentral DAST.
Есть несколько примеров Selenium, которые можно использовать для выполнения простого функционального теста работающего приложения. Существует также несколько сценариев PowerShell start_fast_proxy.ps1 и stop_fast_proxy.ps1, которые можно использовать для запуска/остановки FAST Proxy. Чтобы использовать эти сценарии, вам потребуются записи в файле .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
для автоматизации всех типичных шагов типичного процесса непрерывной доставки (CD) DevSecOps. В примере используются Fortify ScanCentral SAST/DAST и Sonatype Nexus IQ для анализа состава программного обеспечения.
Чтобы использовать Jenkinsfile
создайте новое задание Jenkins Pipeline и в разделе Pipeline выберите Pipeline script from SCM
и введите сведения о разветвленной версии этого репозитория GitHub.
Первый запуск конвейера следует рассматривать как этап «настройки», поскольку он создаст некоторые параметры задания , которые вы затем сможете выбрать, чтобы определить, какие функции вы хотите включить в конвейере.
Вам необходимо будет установить и настроить плагины Fortify Jenkins.
В самом Jenkinsfile
есть много документации, поэтому изучите ее, чтобы узнать, что еще вам нужно сделать для успешного вызова.
Этот репозиторий включает в себя ряд примеров действий GitHub в .github/workflows, которые автоматизируют сборку приложения и сканируют код с помощью Fortify on Demand или Fortify ScanCentral для SAST.
Для интеграции с другими инструментами конвейера см. https://github.com/fortify/IWA-Java.
Пожалуйста, ознакомьтесь с Руководством для участников, чтобы получить информацию о том, как разрабатывать и вносить свой вклад.
Если у вас возникли проблемы, посетите раздел «Проблемы» GitHub, чтобы узнать, обсуждалось ли это уже.
Это приложение доступно по лицензии GNU General Public License V3.