추가 파이프라인 통합이 포함된 이 애플리케이션의 "공식" 버전을 보려면 https://github.com/fortify/IWA-Java를 방문하세요.
IWA(안전하지 않은 웹 앱) Pharmacy Direct 는 DevSecOps 시나리오 및 데모에 사용하기 위한 Java/Spring 웹 애플리케이션의 예입니다. 여기에는 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(Multi-Factor Authentication) 코드를 입력하라는 메시지가 표시됩니다. 콘솔 출력을 검사하여 이 코드를 찾을 수 있습니다.
개발용 이메일 서버를 사용하고 싶다면 (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
nginx 및 certbot을 사용하여 HTTPS/SSL로 애플리케이션을 실행하는 방법을 보여주는 예제 docker-compose.yml
파일도 있습니다. 이는 "하드 코딩된" 도메인 이름을 사용하므로 참조용일 뿐입니다.
다음 예의 대부분에는 환경 및 사용자별 자격 증명이 필요합니다. 이는 프로젝트 루트 디렉터리의 .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
Fortify SCA를 통해 정적 애플리케이션 보안 테스트를 실행하는 데 사용할 수 있는 예제 PowerShell 스크립트 fortify-sast.ps1이 있습니다.
.binfortify - sast.ps1 - SkipSSC
이 스크립트는 sourceanalyzer
번역을 실행하고 프로젝트의 소스 코드를 검색합니다. Fortify auditworkbench
도구를 사용하여 열 수 있는 IWA-Java.fpr
이라는 Fortify 프로젝트 결과 파일을 생성합니다.
auditworkbench.cmd .IWA - Java.fpr
또한 IWA-Java.pdf
라는 PDF 보고서를 생성하고 선택적으로 결과를 Fortify Software Security Center(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' 값으로 설정되어야 합니다.
프로젝트를 패키징하고 Fortify ScanCentral SAST를 사용하여 원격 스캔을 시작하는 데 사용할 수 있는 PowerShell 스크립트 fortify-scancentral-sast.ps1이 있습니다.
.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에 업로드할 수도 있습니다.
스캔을 실행하고 결과를 SSC에 업로드하기 위해 실행할 수 있는 예제 PowerShell 스크립트 파일 fortify-webinspect.ps1이 있습니다.
.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 Demand는 DAST 검사를 수행하는 두 가지 방법, 즉 기존 DAST와 DAST Automated를 제공합니다. 이 섹션에서는 명령 및 파이프라인 통합에 더 적합한 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에서 찾아볼 수 있습니다. 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 Proxy를 사용하면 자동화된 테스트 실행에서 트래픽을 캡처한 다음 해당 트래픽을 ScanCentral DAST 실행을 위한 워크플로로 사용할 수 있습니다. 여기의 예를 실행하려면 ScanCentral DAST 설치 미디어의 Dynamic_Addons.zip
에서 사용할 수 있는 WebInspect를 로컬로 WIRCServerSetup64-ProxyOnly.msi
설치해야 합니다.
실행 중인 애플리케이션의 간단한 기능 테스트를 실행하는 데 사용할 수 있는 몇 가지 Selenium 예제가 있습니다. FAST Proxy를 시작/중지하는 데 사용할 수 있는 몇 가지 PowerShell 스크립트 start_fast_proxy.ps1 및 stop_fast_proxy.ps1도 있습니다. 이러한 스크립트를 사용하려면 .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를 사용하는 경우 일반적인 DevSecOps CD(지속적 전달) 프로세스의 모든 일반적인 단계를 자동화하기 위해 포괄적인 Jenkinsfile
제공됩니다. 이 예에서는 소프트웨어 구성 분석을 위해 Fortify ScanCentral SAST/DAST 및 Sonatype Nexus IQ를 사용합니다.
Jenkinsfile
을 사용하려면 새 Jenkins 파이프라인 작업을 생성하고 파이프라인 섹션에서 Pipeline script from SCM
선택하고 이 GitHub 저장소의 포크된 버전에 대한 세부 정보를 입력하세요.
파이프라인의 첫 번째 실행은 파이프라인에서 활성화할 기능을 결정하기 위해 선택할 수 있는 일부 작업 매개변수를 생성하므로 "설정" 단계로 처리되어야 합니다.
Fortify Jenkins 플러그인을 설치하고 구성해야 합니다.
Jenkinsfile
자체에는 많은 문서가 있으므로 이를 조사하여 성공적인 호출을 위해 수행해야 할 다른 작업을 확인하십시오.
이 리포지토리에는 애플리케이션 빌드를 자동화하고 Fortify on Demand 또는 Fortify ScanCentral for SAST를 사용하여 코드를 스캔하는 .github/workflows의 여러 GitHub Actions 예제가 포함되어 있습니다.
다른 파이프라인 도구와의 통합은 https://github.com/fortify/IWA-Java를 참조하세요.
개발 및 기여 방법에 대한 정보는 기여 가이드를 참조하세요.
문제가 있는 경우 GitHub 문제를 참조하여 이미 논의되었는지 확인하세요.
이 애플리케이션은 GNU General Public License V3에 따라 제공됩니다.