We detected you are likely not from a Russian-speaking region. Would you like to switch to the international version of the site?

  Назад к списку статей

Проектирование микросервисной архитектуры для сканирования уязвимостей Android‑приложений в Termux

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‑приложений.

* Текст статьи подготовлен и структурирован с использованием технологий искусственного интеллекта. Проверен экспертом РыбинскЛАБ.

Поделиться знанием:

Нужна профессиональная помощь?

Меня зовут Усачёв Денис Евгеньевич. Я оказываю ИТ-услуги в Рыбинске и Ярославской области: настройка серверов, безопасность, автоматизация бизнеса. Запомните информация развлекательный ознакомительный носит, не нарушайте закон!

Связаться со мной
Поддержать проект