Android‑платформа остаётся одной из самых популярных целевых сред для злоумышленников. Быстрая проверка приложений на уязвимости в мобильных условиях требует гибкой и масштабируемой инфраструктуры. В статье мы рассмотрим, как спроектировать микросервисную архитектуру, позволяющую выполнять сканирование из Termux – терминального эмулятора для Android, и управлять процессом через лёгкие контейнерные сервисы.
Почему Termux?
Termux предоставляет полноценный Linux‑окружение без root‑прав, включая apt, python, git, docker (через proot-distro) и другие инструменты. Это делает его идеальной площадкой для развёртывания небольших кластеров микросервисов непосредственно на смартфоне.
Общая архитектура
Схема состоит из пяти ключевых компонентов:
- API‑gateway – точка входа, реализованная на
FastAPI, принимает запросы на сканирование и распределяет их. - Task‑queue – очередь сообщений (
RabbitMQ) для асинхронного планирования задач. - Scanner‑service – микросервис, который запускает инструменты
MobSF,AndroBugsиQARKвнутри контейнеров. - Result‑store – база данных (
PostgreSQL) для хранения отчётов и метаданных. - Auth‑service – сервис аутентификации на
Keycloak(опционально).
Все сервисы упакованы в Docker‑контейнеры и оркестрируются с помощью docker‑compose. При этом терминальный клиент Termux управляет жизненным циклом кластера и предоставляет CLI‑интерфейс для разработчиков.
Подготовка окружения в Termux
1. Обновляем репозитории и устанавливаем необходимые пакеты:
pkg update && pkg upgrade -y
pkg install git python curl proot-distro -y
2. Устанавливаем Docker через termux‑docker (или используем proot‑distro install docker):
proot-distro install docker
proot-distro login docker
3. Инициализируем Docker‑демон:
dockerd &
После запуска демона можно проверять статус командой docker info.
Docker‑файлы микросервисов
Dockerfile для scanner‑service (используем образ python:3.11-slim и устанавливаем MobSF):
FROM python:3.11-slim
# Устанавливаем системные зависимости
RUN apt-get update && apt-get install -y \
git openjdk-11-jdk wget unzip && \
rm -rf /var/lib/apt/lists/*
# Клонируем MobSF
RUN git clone https://github.com/MobSF/Mobile-Security-Framework-MobSF.git /opt/mobsf
WORKDIR /opt/mobsf
RUN ./setup.sh
# Устанавливаем зависимости Python
RUN pip install fastapi uvicorn pika psycopg2-binary
# Копируем исходный код сканера
COPY scanner.py /app/scanner.py
WORKDIR /app
EXPOSE 8001
CMD ["uvicorn", "scanner:app", "--host", "0.0.0.0", "--port", "8001"]
Аналогичные Dockerfile создаются для api‑gateway, auth‑service и result‑store.
docker‑compose.yml
Файл описывает взаимосвязи сервисов и монтирует тома для постоянного хранения данных:
version: "3.8"
services:
rabbitmq:
image: rabbitmq:3-management
ports:
- "5672:5672"
- "15672:15672"
environment:
RABBITMQ_DEFAULT_USER: user
RABBITMQ_DEFAULT_PASS: password
postgres:
image: postgres:15
environment:
POSTGRES_USER: scanner
POSTGRES_PASSWORD: scannerpwd
POSTGRES_DB: scans
volumes:
- pgdata:/var/lib/postgresql/data
ports:
- "5432:5432"
api-gateway:
build: ./gateway
ports:
- "8000:8000"
depends_on:
- rabbitmq
- postgres
scanner-service:
build: ./scanner
depends_on:
- rabbitmq
- postgres
environment:
- RABBITMQ_HOST=rabbitmq
- POSTGRES_HOST=postgres
volumes:
pgdata:
Запуск происходит одной командой:
docker-compose up -d
Пример кода микросервиса‑сканера
Ниже – минимальный FastAPI сервис, принимающий URL‑или APK‑файл и ставящий задачу в очередь.
from fastapi import FastAPI, UploadFile, File
import pika, json, uuid
app = FastAPI()
connection = pika.BlockingConnection(pika.ConnectionParameters(host='rabbitmq'))
channel = connection.channel()
channel.queue_declare(queue='scan_tasks')
@app.post("/scan")
async def submit_scan(file: UploadFile = File(...)):
task_id = str(uuid.uuid4())
content = await file.read()
# Сохраняем файл во временный каталог (можно использовать /tmp в контейнере)
with open(f"/tmp/{task_id}.apk", "wb") as f:
f.write(content)
message = json.dumps({"task_id": task_id, "file_path": f"/tmp/{task_id}.apk"})
channel.basic_publish(exchange='', routing_key='scan_tasks', body=message)
return {"task_id": task_id, "status": "queued"}
Рабочий процесс сканера (worker) читает сообщения из очереди, запускает MobSF и сохраняет результаты в PostgreSQL.
Управление из Termux
Для удобного взаимодействия создаём небольшой CLI‑скрипт termux-scan:
#!/data/data/com.termux/files/usr/bin/bash
API_URL="http://127.0.0.1:8000"
if [[ -z "$1" ]]; then
echo "Usage: termux-scan "
exit 1
fi
RESPONSE=$(curl -s -F "file=@$1" "$API_URL/scan")
echo "Task submitted: $RESPONSE"
Скрипт сохраняем в ~/bin/termux-scan, делаем исполняемым chmod +x ~/bin/termux-scan и вызываем из любой директории.
Безопасность и изоляция
- Каждый микросервис работает в отдельном контейнере с ограниченными правами (
--cap-drop ALL,--read-only). - Для передачи артефактов используем только
tmpfs‑тома, чтобы APK‑файлы не сохранялись на постоянной памяти. - Аутентификация через
Keycloak(OAuth2) защищает API‑gateway. - SSL‑терминация может быть реализована через
Traefikв отдельном сервисе.
Мониторинг и логирование
Для наблюдения за состоянием кластера удобно подключить Prometheus + Grafana. Метрики сервисов экспонируются через /metrics endpoint FastAPI.
Тестирование и CI/CD
В Termux можно запускать unit‑тесты с pytest и интеграционные сценарии через GitHub Actions (используя self‑hosted runner на Android). Это позволяет автоматически проверять новые версии сканеров.
Заключение
Создание микросервисной архитектуры для сканирования уязвимостей Android‑приложений полностью в Termux открывает новые возможности для мобильных исследований и быстрых прототипов. Благодаря контейнеризации, очередям сообщений и лёгкому API‑gateway система масштабируется от одного‑единственного устройства до небольшого кластера из нескольких Android‑смартфонов.
RybinskLab предлагает профессиональные услуги по проектированию, внедрению и поддержке подобных решений: от аудита безопасности до разработки кастомных микросервисов под ваши требования. Свяжитесь с нами, чтобы ускорить процесс обеспечения безопасности ваших Android‑приложений.