Skip to content

Работа пульта

Система SORM-2 (Система оперативно-розыскных мероприятий) предназначена для захвата, сборки и анализа сетевого трафика по множеству протоколов. Состоит из двух основных компонентов: sorm2-backend (основной сервер) и sorm-2-reasm (сервис переборки пакетов).


Общая архитектура системы

Section titled “Общая архитектура системы”
graph TB
    subgraph Захват["Захват трафика"]
        PCAP["PCAP-файлы\n(data/pcap/)"]
    end

    subgraph REASM["sorm-2-reasm (Микросервис переборки)"]
        direction TB
        PW["PreparingWorker\n(Валидация и маршрутизация)"]
        subgraph ASM["Assembler Workers (tshark)"]
            AH["HTTP"]
            AF["FTP"]
            AE["Email"]
            AX["XMPP"]
            AT["TCP"]
        end
        subgraph PROC["Processing Workers (Декодирование)"]
            PH["HTTP"]
            PF["FTP"]
            PE["Email"]
            PX["XMPP"]
            PT["TCP"]
        end
        PW --> ASM
        ASM --> PROC
    end

    subgraph MQ["Apache ActiveMQ"]
        QIN["reasm-input"]
        QPREP["reasm-prepared-*\n(5 очередей)"]
        QASM["reasm-asm-*\n(5 очередей)"]
        QOUT["reasm-output"]
        QIN --> PW
        PW --> QPREP
        QPREP --> ASM
        ASM --> QASM
        QASM --> PROC
        PROC --> QOUT
    end

    subgraph BACKEND["sorm2-backend (Spring Boot)"]
        COL["S2SurveillanceCollector\n(Потребитель)"]
        SVC["Сервисы протоколов\n(HTTP/FTP/Email/XMPP/TCP)"]
        REST["REST API"]
        COL --> SVC
        SVC --> REST
    end

    subgraph DB["PostgreSQL"]
        SURV["CDZ_SURVEILLANCE\n(Трафик)"]
        MISS["CDZ_MISSION\n(Задания)"]
        USR["CDZ_USER\n(Пользователи)"]
        AUD["CDZ_AUDIT\n(Аудит)"]
    end

    PCAP --> REASM
    QOUT --> COL
    SVC --> DB
    REST --> DB

Общий конвейер обработки

Section titled “Общий конвейер обработки”

Все протоколы проходят через три стадии:

stateDiagram-v2
    [*] --> new : Входящее сообщение
    new --> prepared : PreparingWorker\n(проверка PCAP, маршрутизация)
    prepared --> assembled : AssemblerWorker\n(tshark → JSON)
    assembled --> complete : ProcessingWorker\n(декодирование → Entity)
    new --> error : PCAP не найден
    prepared --> error : Ошибка сборки
    assembled --> error : Ошибка декодирования
    complete --> [*]
    error --> [*] : reasm-output\n(с errorCause)
ОчередьНазначение
reasm-inputВходящие задания на переборку
reasm-prepared-httpHTTP-задания после валидации
reasm-prepared-ftpFTP-задания после валидации
reasm-prepared-emailEmail-задания после валидации
reasm-prepared-xmppXMPP-задания после валидации
reasm-prepared-tcpTCP-задания после валидации
reasm-asm-httpСобранные HTTP-данные (JSON)
reasm-asm-ftpСобранные FTP-данные (JSON)
reasm-asm-emailСобранные Email-данные (JSON)
reasm-asm-xmppСобранные XMPP-данные (JSON)
reasm-asm-tcpСобранные TCP-данные (JSON)
reasm-outputГотовые ProcessingData с сущностями

Потоки данных по протоколам

Section titled “Потоки данных по протоколам”

HTTP — наиболее простой протокол: каждый пакет содержит полный запрос или ответ, которые извлекаются напрямую через tshark.

sequenceDiagram
    participant MQ as ActiveMQ
    participant PW as PreparingWorker
    participant AW as AssemblerHttpWorker
    participant PH as ProcessingHttpWorker
    participant FS as Файловая система

    MQ->>PW: reasm-input {dataKind: "http", id, uci}
    PW->>FS: Проверить data/uci/{uci}/{id}/data.pcap
    PW->>MQ: reasm-prepared-http {state: "prepared"}

    MQ->>AW: reasm-prepared-http
    AW->>FS: tshark -r data.pcap -T jsonraw -j http
    FS-->>AW: JSON-вывод пакетов
    AW->>FS: Записать data/assembled/http/{id}.json
    AW->>MQ: reasm-asm-http {state: "assembled"}

    MQ->>PH: reasm-asm-http
    PH->>FS: Прочитать data/assembled/http/{id}.json
    loop Каждый пакет
        PH->>PH: Декодировать hex → IP, порт, метод,\nURI, версия, заголовки, код ответа
        PH->>PH: Создать HttpEntity
    end
    PH->>FS: Удалить data/assembled/http/{id}.json
    PH->>MQ: reasm-output {httpEntities: [...], state: "complete"}

Извлекаемые поля HttpEntity:

ПолеОписание
requestActionHTTP-метод (GET, POST, PUT…)
requestUriURL запроса
httpVersionВерсия протокола (HTTP/1.1)
requestHostЗаголовок Host
requestCookieCookie запроса
requestRefererЗаголовок Referer
responseCodeКод ответа (200, 404…)
responseContentTypeContent-Type ответа
responseSetCookieSet-Cookie из ответа
responseDataТело ответа
sourceIp / destIpIP-адреса источника и назначения
sourcePort / destPortПорты

  • Directorydata
    • Directoryuci
      • Directory[uci]
        • Directory[id]
          • data.pcap ← Входной PCAP-файл
          • decrypted.pcap ← Расшифрованный (если isDecrypted=true)
    • Directoryassembled
      • http/[id].json ← Временный (удаляется после обработки)
      • ftp/[id].json
      • email/[id].json
      • xmpp/[id].json
      • tcp/[id].json
    • Directoryprocessed
      • Directoryftp
        • Directory[taskId]
          • [filename] ← Извлечённые FTP-файлы
    • Directoryemail-attachments
      • [filename] ← Извлечённые вложения Email
    • Directorylogs/

Центральный объект, передаваемый между компонентами через ActiveMQ:

classDiagram
    class ProcessingData {
        +Long id
        +Long missionId
        +Short uci
        +String nodeId
        +String dataKind
        +String state
        +Boolean isDecrypted
        +String errorCause
        +List~HttpEntity~ httpEntities
        +List~FtpEntity~ ftpEntities
        +List~EmailEntity~ emailEntities
        +List~XmppEntity~ xmppEntities
        +List~TcpEntity~ tcpEntities
    }

    class HttpEntity {
        +String requestAction
        +String requestUri
        +String httpVersion
        +String requestHost
        +String requestCookie
        +Integer responseCode
        +String responseContentType
        +String responseData
        +String sourceIp
        +String destIp
    }

    class FtpEntity {
        +String username
        +String filename
        +byte[] fileContent
        +Long fileLength
        +Boolean isUpload
        +Long duration
        +String sourceIp
        +String destIp
    }

    class EmailEntity {
        +String from
        +String to
        +String subject
        +String messageId
        +String content
        +String contentType
        +List~String~ attachmentFilenames
        +String protocol
    }

    class XmppEntity {
        +String chatId
        +String from
        +String to
        +String content
        +String filename
        +Long fileSize
        +String sourceIp
        +String destIp
    }

    class TcpEntity {
        +Long bytesTransferred
        +Long packetsCount
        +Long duration
        +String sourceIp
        +String destIp
        +Integer sourcePort
        +Integer destPort
    }

    ProcessingData "1" --> "*" HttpEntity
    ProcessingData "1" --> "*" FtpEntity
    ProcessingData "1" --> "*" EmailEntity
    ProcessingData "1" --> "*" XmppEntity
    ProcessingData "1" --> "*" TcpEntity

erDiagram
    CDZ_USER {
        bigint id PK
        string username
        string password
        date accountStartedAt
        date accountEndedAt
        boolean passwordComplexitySign
    }
    CDZ_ORGANIZATION {
        bigint id PK
        string name
    }
    CDZ_FOLDER {
        bigint id PK
        string name
        bigint parentId FK
    }
    CDZ_MISSION {
        bigint id PK
        string name
        string identificationKind
        date startedAt
        date endedAt
        bigint organizationId FK
        bigint folderId FK
    }
    CDZ_SANCTION {
        bigint id PK
        bigint missionId FK
        string userName FK
        date sanctionStartedAt
        date sanctionEndedAt
    }
    CDZ_SURVEILLANCE {
        bigint id PK
        bigint missionId FK
        string trafficKind
        timestamp capturedAt
        string sourceIp
        string destIp
        integer sourcePort
        integer destPort
        string uci
        boolean processedSign
    }
    CDZ_AUDIT {
        bigint id PK
        string entity
        string action
        boolean success
        string username
        timestamp requestTime
    }

    CDZ_USER }|--|| CDZ_ORGANIZATION : "belongs to"
    CDZ_USER }|--|{ CDZ_FOLDER : "assigned (user_folders)"
    CDZ_MISSION }|--|| CDZ_ORGANIZATION : "belongs to"
    CDZ_MISSION }|--|| CDZ_FOLDER : "placed in"
    CDZ_SANCTION }|--|| CDZ_MISSION : "authorizes"
    CDZ_SANCTION }|--|| CDZ_USER : "assigned to"
    CDZ_SURVEILLANCE }|--|| CDZ_MISSION : "captured for"
РольОписание
ROLE_ADMINПолный доступ к системе
ROLE_ADMIN_MISSIONУправление заданиями
ROLE_ADMIN_OBRАдминистратор организации
ROLE_ADMIN_HARDWAREМониторинг оборудования
ROLE_OBRОперативный офицер (доступ к данным)
ROLE_SUPERVISORРуководитель (ограниченный доступ)

Поддерживаемые протоколы в sorm2-backend

Section titled “Поддерживаемые протоколы в sorm2-backend”
ПротоколПорты по умолчаниюОбработчик
HTTP80, 9200HttpTraffic
HTTPS/SSL443, 631, 8443SslTraffic
FTP20, 21FtpTraffic
SMTP25, 465, 587EmailTraffic
POP3110EmailTraffic
IMAP143EmailTraffic
NNTP119EmailTraffic
XMPP5222, 5223XmppTraffic
SIP5060, 2944, 2427, 4569, 2000SipTraffic
H.3231720H323Traffic
RADIUS1812, 1813RadiusTraffic
Telnet23, 194, 6667TelnetTraffic
TCP (raw)любыеTcpTraffic
WhatsApp/TelegramWhatsappTelegramTraffic

Переменные окружения (sorm-2-reasm)

Section titled “Переменные окружения (sorm-2-reasm)”
ПеременнаяПо умолчаниюОписание
ACTIVEMQ_ADDRtcp://127.0.0.1:61616Адрес брокера ActiveMQ

Переменные окружения (sorm2-backend)

Section titled “Переменные окружения (sorm2-backend)”
ПеременнаяОписание
BROKER_URLURL брокера ActiveMQ
SPRING_DATASOURCE_URLJDBC URL PostgreSQL
SPRING_DATASOURCE_USERNAMEПользователь БД
SPRING_DATASOURCE_PASSWORDПароль БД

КомпонентТехнология
sorm-2-reasmJava 11, Apache ActiveMQ JMS, tshark (Wireshark CLI)
sorm2-backendJava 11, Spring Boot 2.4.5, Spring Security
База данныхPostgreSQL 12
ORMHibernate JPA 5
Очередь сообщенийApache ActiveMQ 5.15.9
Захват пакетовPcap4j 1.8.2
ПланировщикQuartz Scheduler
МониторингZabbix
СериализацияJackson 2.11
КонтейнеризацияDocker, docker-compose