В современном мире DevSecOps становится неотъемлемой частью разработки. Автоматическое сканирование веб‑приложений в рамках CI/CD позволяет выявлять уязвимости на ранних этапах и предотвращать их попадание в продакшн. В этой статье мы рассмотрим, как развернуть OWASP ZAP в среде Termux на Android‑устройстве и интегрировать его в CI/CD пайплайн.
Что понадобится
- Устройство с Android 8.0+ и установленный
Termux(из F-Droid или Google Play). - Подключение к интернету для загрузки пакетов.
- Репозиторий проекта в GitHub, GitLab или Bitbucket.
- Базовые навыки работы с Linux‑командной строкой и CI/CD системами.
Установка Termux и базовых зависимостей
pkg update && pkg upgrade -y
pkg install -y git curl wget openjdk-17 unzip python
Для работы OWASP ZAP требуется Java 17 (или выше). Убедитесь, что переменная JAVA_HOME указывает на корректный путь:
export JAVA_HOME=$PREFIX/lib/openjdk-17
export PATH=$JAVA_HOME/bin:$PATH
Скачивание и установка OWASP ZAP
Последнюю стабильную версию ZAP можно получить напрямую с официального репозитория:
wget -O zap.zip https://github.com/zaproxy/zaproxy/releases/download/v2.14.0/ZAP_2.14.0_Linux.tar.gz
mkdir -p $HOME/zap && tar -xzf zap.zip -C $HOME/zap --strip-components=1
chmod +x $HOME/zap/zap.sh
Проверяем запуск в режиме демона (headless):
$HOME/zap/zap.sh -daemon -port 8090 -config api.disablekey=true
Опция -config api.disablekey=true отключает обязательность API‑ключа, что удобно для локального CI, но в продакшн‑среде рекомендуется использовать ключ.
Создание скрипта автоматического сканирования
Скрипт на Python будет управлять ZAP через его REST‑API. Сохраняем файл zap_scan.py в корень проекта.
#!/usr/bin/env python3
import sys, time, json, requests
ZAP_API = 'http://127.0.0.1:8090'
TARGET = sys.argv[1] if len(sys.argv) > 1 else 'http://example.com'
def start_spider(url):
resp = requests.get(f"{ZAP_API}/JSON/spider/action/scan", params={'url': url, 'maxChildren': '0'})
scan_id = resp.json()['scan']
while True:
status = requests.get(f"{ZAP_API}/JSON/spider/view/status", params={'scanId': scan_id}).json()['status']
if status == '100':
break
time.sleep(2)
print('Spider finished')
def start_active_scan(url):
resp = requests.get(f"{ZAP_API}/JSON/ascan/action/scan", params={'url': url})
scan_id = resp.json()['scan']
while True:
status = requests.get(f"{ZAP_API}/JSON/ascan/view/status", params={'scanId': scan_id}).json()['status']
if status == '100':
break
time.sleep(5)
print('Active scan finished')
def generate_report():
resp = requests.get(f"{ZAP_API}/OTHER/core/other/jsonreport")
return resp.text
if name == 'main':
start_spider(TARGET)
start_active_scan(TARGET)
report = generate_report()
with open('zap_report.json', 'w') as f:
f.write(report)
print('Report saved to zap_report.json')
Сделайте скрипт исполняемым:
chmod +x zap_scan.py
Интеграция с CI/CD
Ниже представлены примеры конфигураций для самых популярных CI‑систем.
GitHub Actions
name: OWASP ZAP Scan
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
zap_scan:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
- name: Install ZAP
run: |
wget -O zap.tar.gz https://github.com/zaproxy/zaproxy/releases/download/v2.14.0/ZAP_2.14.0_Linux.tar.gz
tar -xzf zap.tar.gz -C $HOME
chmod +x $HOME/ZAP_2.14.0/zap.sh
- name: Start ZAP daemon
run: $HOME/ZAP_2.14.0/zap.sh -daemon -port 8090 -config api.disablekey=true &
env:
ZAP_HOME: $HOME/ZAP_2.14.0
timeout-minutes: 2
- name: Wait for ZAP API
run: |
for i in {1..30}; do
curl -s http://127.0.0.1:8090 || break
sleep 2
done
- name: Run scan script
run: |
python3 - <<'PY'
import sys, time, requests
# (скрипт из предыдущего раздела вставьте сюда или скопируйте из репозитория)
PY
env:
TARGET_URL: https://your-app.example.com
- name: Upload ZAP report
uses: actions/upload-artifact@v3
with:
name: zap-report
path: zap_report.json
GitLab CI
stages:
- zap_scan
zap_scan:
stage: zap_scan
image: openjdk:17-slim
variables:
ZAP_VERSION: "2.14.0"
script:
- apt-get update && apt-get install -y wget curl python3
- wget -O zap.tar.gz https://github.com/zaproxy/zaproxy/releases/download/v${ZAP_VERSION}/ZAP_${ZAP_VERSION}_Linux.tar.gz
- tar -xzf zap.tar.gz -C $HOME
- chmod +x $HOME/ZAP_${ZAP_VERSION}/zap.sh
- $HOME/ZAP_${ZAP_VERSION}/zap.sh -daemon -port 8090 -config api.disablekey=true &
- >
for i in {1..30}; do
curl -s http://127.0.0.1:8090 && break || sleep 2;
done
- python3 zap_scan.py https://your-app.example.com
artifacts:
paths:
- zap_report.json
expire_in: 1 week
Отправка результатов в мессенджеры и системы тикетов
Для автоматического уведомления команды можно использовать веб‑хуки. Пример отправки в Slack:
curl -X POST -H 'Content-type: application/json' \
--data "{\"text\": \"OWASP ZAP сканирование завершено. Отчет доступен в артефактах CI.\"}" \
https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX
Лучшие практики
- Запускайте сканирование только после деплоя тестовой версии, чтобы не сканировать продакшн‑окружение без согласования.
- Ограничьте время сканирования (параметр
-config scanner.attackStrength=LOW) в CI, чтобы не превышать лимиты билда. - Храните отчёты в формате
JSONилиHTMLи интегрируйте их в системы управления уязвимостями (Jira, Redmine). - Регулярно обновляйте
OWASP ZAP, так как база правил постоянно растёт.
Заключение
Автоматизация сканирования веб‑приложений с помощью OWASP ZAP в Termux и интеграция процесса в CI/CD позволяет поддерживать высокий уровень безопасности без затраты большого количества ресурсов. Вы получаете постоянный контроль над уязвимостями, быстро реагируете на новые находки и поддерживаете культуру DevSecOps в команде.
Если вам требуется профессиональная настройка безопасных CI/CD пайплайнов, аудит кода, проведение пентестов или консалтинг по DevSecOps — команда RybinskLab готова помочь. Мы обеспечим end‑to‑end решение, адаптированное под ваши бизнес‑цели, и гарантируем надёжную защиту ваших веб‑приложений.