สำหรับเวอร์ชัน "อย่างเป็นทางการ" ของแอปพลิเคชันนี้พร้อมการรวมไปป์ไลน์เพิ่มเติม โปรดไปที่ https://github.com/fortify/IWA-Java
IWA (Insecure Web App) Pharmacy Direct คือตัวอย่าง Java/Spring Web Application สำหรับใช้ในสถานการณ์และการสาธิต 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
จะขอให้คุณป้อนรหัส Multi-Factor Authentication (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 Project Results ชื่อ IWA-Java.fpr
ซึ่งคุณสามารถเปิดได้โดยใช้เครื่องมือ Fortify auditworkbench
:
auditworkbench.cmd .IWA - Java.fpr
นอกจากนี้ยังสร้างรายงาน PDF ที่เรียกว่า IWA-Java.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
ควรตั้งค่าเป็น 'CIToken' ที่สร้างขึ้นใน SSC "Administration->Token Management"
มีสคริปต์ 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 "Administration->Token Management"
หากต้องการดำเนินการสแกน 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" โดยจะดำเนินการสแกน "สำคัญและมีลำดับความสำคัญสูง" โดยใช้นโยบายที่มีรหัส 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 อัตโนมัติ เนื่องจากเหมาะสมกว่าสำหรับการรวมคำสั่งและไปป์ไลน์
คุณสามารถเรียกใช้การสแกน อัตโนมัติ DAST ของ Fortify on Demand ได้โดยใช้ยูทิลิตี้ 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 มีการจัดเตรียมคอลเลกชันบุรุษไปรษณีย์ไว้เพื่อช่วยในเรื่องนี้ คุณสามารถออกกำลังกายคอลเลกชันโดยใช้นิวแมน ตัวอย่างเช่นจากพรอมต์คำสั่ง 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 "
นำเข้าคอลเลกชันบุรุษไปรษณีย์ต่อไปนี้ไปยัง 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
การสแกน API สามารถทำได้โดยใช้คอลเลกชันบุรุษไปรษณีย์ "รวม" ต่อไปนี้:
etcIWA-API-Prod-Combined.postman_environment.json
สามารถใช้กับ DAST แบบเดิมหรือ DAST Automated
Fortify FAST Proxy ช่วยให้คุณสามารถบันทึกการรับส่งข้อมูลจากการทดสอบอัตโนมัติ จากนั้นใช้การรับส่งข้อมูลเป็นเวิร์กโฟลว์สำหรับการดำเนินการ 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
ที่ครอบคลุมเพื่อทำให้ขั้นตอนทั่วไปทั้งหมดของกระบวนการ DevSecOps Continuous Delivery (CD) เป็นแบบอัตโนมัติ ตัวอย่างนี้ใช้ Fortify ScanCentral SAST/DAST และ Sonatype Nexus IQ สำหรับการวิเคราะห์องค์ประกอบของซอฟต์แวร์
หากต้องการใช้ Jenkinsfile
ให้สร้าง Jenkins Pipeline Job ใหม่และในส่วน Pipeline ให้เลือก Pipeline script from SCM
และป้อนรายละเอียดของเวอร์ชันที่แยกส่วนของที่เก็บ GitHub นี้
การเรียกใช้ไปป์ไลน์ครั้งแรกควรถือเป็นขั้นตอน "การตั้งค่า" เนื่องจากจะสร้าง พารามิเตอร์งาน บางอย่าง ซึ่งคุณสามารถเลือกได้เพื่อกำหนดคุณสมบัติที่คุณต้องการเปิดใช้งานในไปป์ไลน์
คุณจะต้องติดตั้งและกำหนดค่าปลั๊กอิน Fortify Jenkins
มีเอกสารประกอบมากมายใน Jenkinsfile
ดังนั้นโปรดตรวจสอบเพื่อดูว่าคุณจะต้องทำอะไรอีกบ้างจึงจะเรียกใช้ได้สำเร็จ
พื้นที่เก็บข้อมูลนี้มีตัวอย่าง GitHub Actions จำนวนหนึ่งใน .github/workflows ที่สร้างแอปพลิเคชันโดยอัตโนมัติ และสแกนโค้ดโดยใช้ Fortify on Demand หรือ Fortify ScanCentral สำหรับ SAST
สำหรับการผสานรวมกับเครื่องมือไปป์ไลน์อื่น โปรดดู https://github.com/fortify/IWA-Java
โปรดดูคู่มือการบริจาคสำหรับข้อมูลเกี่ยวกับวิธีการพัฒนาและการมีส่วนร่วม
หากคุณมีปัญหาใดๆ โปรดปรึกษาปัญหา GitHub เพื่อดูว่าได้มีการพูดคุยกันไปแล้วหรือไม่
แอปพลิเคชันนี้จัดทำขึ้นภายใต้ GNU General Public License V3