ZAP vs Qualys: как мы автоматизировали сканирование веб-приложений

Как мы заменили Qualys на ZAP

Безопасность сайта без сложностей и дорогих лицензий? Мы внедрили OWASP ZAP вместо Qualys WAS — и получили мощный DAST, полный контроль, интеграцию с CI и автоматический анализ через Gemini CLI.

Когда мы начали работу над проектом X — небольшим, но требовательным сайтом по продаже деликатного белья после хирургии — мы знали, что безопасность будет иметь значение. Да, у нас не было ни банковского API, ни авторизации через Госуслуги, но люди доверяют нам личные данные, и это обязывает.

Встал вопрос: как организовать регулярный аудит веб-приложения без желания покупать очередной облачный продукт уровня Qualys WAS, у которого прайс от $1 995 в год за 25 сайтов, да даже не в этом дело, вы понимаете. Мы пошли другим путём: взяли OWASP ZAP, настроили его один раз, и теперь он живёт у нас в CI — сканирует, анализирует, и даже общается с Gemini CLI.


ZAP vs Qualys: наш расчёт

ХарактеристикаQualys WASOWASP ZAP (snap + Automation Framework)
Стоимость ~$1 995/год за 25 веб‑приложений Бесплатно (только ваша инфраструктура)
CI/CD интеграция Облачный, API, Jenkins-плагины YAML‑планы, CLI, snap, Docker, Gemini CLI
Гибкость конфигурации Только в рамках SaaS Полный контроль: глубина, задержки, лимиты
Развёртывание SaaS Локально, контейнеры, snap‑версия
Доступность Лицензия, закрытая платформа Open Source, комьюнити, без ограничений

Настройка в один YAML

У нас это работает так: в проекте есть zap/plan.yaml. Вот его содержимое:

env:
  contexts:
    - name: "prod"
      urls:
        - "https://site.com"
        - "https://app.site.com"
  rateLimitRules:
    - description: "Soft limit for all requests"
      enabled: true
      matchType: "Regex"
      matchString: ".*"
      requestsPerSecond: 2

jobs:
  - type: spider
    parameters:
      context: "prod"
      maxDuration: 1
      maxDepth: 2
      maxChildren: 10
      threadCount: 1
      parseRobotsTxt: true
      parseSitemapXml: true
      postForm: false
      processForm: true

  - type: passiveScan-wait
    parameters:
      maxDuration: 1

  - type: report
    parameters:
      template: "risk-confidence-html"
      reportDir: "."
      reportFile: "report.html"
      reportTitle: "ZAP Soft Scan"

Сканирование запускается в CI командой:

zaproxy -cmd -autorun zap/plan.yaml

Почему нам этого достаточно

ZAP работает мягко. Не делает активных атак, не триггерит защиту хостинга. Скан проходит за минуту, spider обходит сайт в один поток.

Плюс: мы не просто получаем report.html и радуемся. У нас настроен Gemini CLI — и сразу после сканирования мы запускаем:

gemini -p "Проанализируй report.html: составь рейтинг рисков, предложи рекомендации и, если можно, покажи примеры фиксов."

Gemini возвращает отчёт в человеко-читаемом виде. Часто — с конкретными исправлениями: HTTP-заголовки, CSP, ограничения по методам.


Встраивание в пайплайн

Вот пример gitlab-ci.yml:

zap_scan:
  stage: security
  image: ubuntu:24.04
  before_script:
    - apt-get update && apt-get install -y snapd
    - snap install zaproxy --classic
  script:
    - zaproxy -cmd -autorun zap/plan.yaml
    - gemini -p "Проанализируй report.html: составь рейтинг рисков и предложи рекомендации."
  artifacts:
    paths:
      - report.html
      - gemini_output.md

Теперь мы получаем не просто скан — мы получаем продукт: аналитический отчёт, структурированный и понятный.


ZAP — это полноценный DAST-инструмент, который, в правильной связке с Gemini CLI и пайплайном вполне заменяет дорогой и условно доступный Qualys.