Налаштування сканера уразливостей для сайту
Автоматизований сканер уразливостей перевіряє додаток на відомі CVE, місконфігурації та уразливості OWASP Top 10. Запускається регулярно в CI/CD-пайплайні або за розписанням, забезпечуючи постійний моніторинг безпеки.
Інструменти
DAST (динамічне сканування — проти працюючого додатку):
- OWASP ZAP — відкритий, повнофункціональний, інтеграція з CI/CD
- Nuclei — швидкий, шаблонний, 7000+ перевірок
- Nikto — спеціалізується на конфігурації веб-сервера
SAST (статичне сканування — по коду):
- Semgrep — багатомовний, правила OWASP
- SonarQube — повний статичний аналіз з дашбордом
SCA (залежності):
-
npm audit,composer audit,pip-audit - Trivy — контейнери + залежності
- Snyk — комерційний, глибока інтеграція з GitHub
OWASP ZAP в CI/CD (GitHub Actions)
name: Security Scan
on:
schedule:
- cron: '0 3 * * 1'
push:
branches: [main]
jobs:
zap-scan:
runs-on: ubuntu-latest
steps:
- name: ZAP Baseline Scan
uses: zaproxy/[email protected]
with:
target: 'https://staging.example.com'
rules_file_name: '.zap/rules.tsv'
cmd_options: '-a -j'
- name: Upload Report
uses: actions/upload-artifact@v3
with:
name: zap-report
path: report_html.html
Nuclei — шаблонне сканування
go install github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest
nuclei -update-templates
nuclei -u https://target.example.com \
-t cves/ \
-t misconfigurations/ \
-t exposures/ \
-severity critical,high \
-o nuclei_report.json \
-json
Semgrep SAST в CI/CD
- name: Semgrep SAST
uses: semgrep/semgrep-action@v1
with:
config: >-
p/owasp-top-ten
p/php
p/laravel
p/javascript
env:
SEMGREP_APP_TOKEN: ${{ secrets.SEMGREP_APP_TOKEN }}
Сканування залежностей
composer audit
npm audit --audit-level=high
npx audit-ci --high
pip-audit --output=json -o pip-audit.json
trivy image myapp:latest \
--severity HIGH,CRITICAL \
--format json \
-o trivy-report.json
SonarQube — постійний SAST
services:
sonarqube:
image: sonarqube:community
ports:
- "9000:9000"
environment:
SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar
volumes:
- sonar_data:/opt/sonarqube/data
sonar.projectKey=my-webapp
sonar.sources=app,resources/js
sonar.exclusions=**/vendor/**,**/node_modules/**
sonar.php.coverage.reportPaths=coverage.xml
Розписання та сповіщення
security-scan:
stage: security
image: owasp/zap2docker-stable
script:
- zap-baseline.py -t $STAGING_URL -r zap-report.html
artifacts:
paths: [zap-report.html]
rules:
- if: '$CI_PIPELINE_SOURCE == "schedule"'
only:
- schedules
Сповіщення в Slack/Telegram при виявленні High/Critical:
CRITICAL=$(cat nuclei_report.json | jq '[.[] | select(.info.severity == "critical")] | length')
if [ "$CRITICAL" -gt "0" ]; then
curl -X POST $SLACK_WEBHOOK \
-H 'Content-type: application/json' \
--data "{\"text\":\"Знайдено ${CRITICAL} критичних уразливостей\"}"
fi
Управління результатами (False Positives)
# .zap/rules.tsv
10016 IGNORE
10021 IGNORE
90033 IGNORE
Тривалість реалізації
- OWASP ZAP baseline в GitHub Actions: 1 день
- Nuclei + сповіщення: 1 день
- Semgrep SAST + сканування залежностей: 1–2 дні
- Повне налаштування SonarQube: 2–3 дні







