Настройка сканера уязвимостей для сайта
Автоматизированный сканер уязвимостей проверяет приложение на известные 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)
# .github/workflows/security-scan.yml
name: Security Scan
on:
schedule:
- cron: '0 3 * * 1' # каждый понедельник в 3:00
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
# Исключить ложные срабатывания через конфиг
nuclei -u https://target.example.com \
-exclude-tags dos \
-rate-limit 50 \
-timeout 10
Semgrep SAST в CI/CD
# .github/workflows/sast.yml
- 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 }}
# Локальный запуск
semgrep --config=p/owasp-top-ten \
--config=p/laravel \
--output=semgrep-report.sarif \
--sarif \
./app
Dependency Scanning
# PHP
composer audit
# Node.js
npm audit --audit-level=high
npx audit-ci --high
# Python
pip-audit --output=json -o pip-audit.json
# Docker-образы
trivy image myapp:latest \
--severity HIGH,CRITICAL \
--format json \
-o trivy-report.json
SonarQube — постоянный SAST
# docker-compose.yml для локальной установки
services:
sonarqube:
image: sonarqube:community
ports:
- "9000:9000"
environment:
SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar
volumes:
- sonar_data:/opt/sonarqube/data
# sonar-project.properties
sonar.projectKey=my-webapp
sonar.sources=app,resources/js
sonar.exclusions=**/vendor/**,**/node_modules/**
sonar.php.coverage.reportPaths=coverage.xml
Расписание и уведомления
# Gitlab CI с еженедельным сканированием
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:
#!/bin/bash
# parse-and-notify.sh
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\":\"🚨 Security scan: ${CRITICAL} critical vulnerabilities found on ${TARGET}\"}"
fi
Управление результатами (False Positive)
# .zap/rules.tsv — исключения для ZAP
10016 IGNORE # Web Browser XSS Protection Not Enabled (устаревший)
10021 IGNORE # X-Content-Type-Options Missing (уже настроен)
90033 IGNORE # Loosely Scoped Cookie — false positive для /api
Срок реализации
- OWASP ZAP baseline в GitHub Actions: 1 день
- Nuclei + уведомления: 1 день
- Semgrep SAST + Dependency scanning: 1–2 дня
- SonarQube full setup: 2–3 дня







