Фильтр WebSocket#

Фильтр web_socket предназначен для обмена сообщениями между браузером и веб-сервером в режиме реального времени. Фильтр web_socket представляет собой последовательность параметров.

filter_web_socket - параметры#

Название

Обязательность

Описание

Возможные значения

Значение по умолчанию

http

Опциональный

HTTP-фильтры для обработки websocket фреймов. Получая на вход фрагменты websocket frame, собирают их, проделывают необходимые преобразования над исходными данными, формируют http-запрос и отправляют его некоторому внешнему http-обработчику. Все существующие http-фильтры имеют общего предка — класс org.sbrf.sbtwaf.SimpleAsynHttpFilter. Последовательность http может содержать в себе несколько фильтров, которые работают независимо и параллельно друг другу

Параметры, описанные в разделе «filter_web_socket - http»

—

nohttp

Опциональный

nohttp-фильтры не используют http протокол для выполнения фильтрации. Все операции, касающиеся фильтрации, они выполняют внутри себя, а для взаимодействия с другими сервисами используют протоколы, отличные от http. Наследуются напрямую от абстрактного класса Filter. Последовательность может содержать в себе несколько фильтров, которые работают независимо и параллельно друг другу. Если какой-либо фильтр имеет в параметре rule значение denied, а другой фильтр allowed* на одинаковых типах фреймов, то результатом будет DENIED

Параметры, описанные в разделе «filter_web_socket - nohttp»

—

filter_web_socket - http#

Название

Обязательность

Описание

Возможные значения

Значение по умолчанию

type

Обязательный

Тип используемого фильтра

WsAsynHttpFilter — осуществляет последовательную обработку фрагментов, как на входе, так и на выходе; WsMultiMsgAsynHttpFilter — осуществляет последовательную обработку фрагментов на входе, а на выходе одновременно для всех обработанных сообщений устанавливается результат; WsAsynHttpFilterWithPartialDecompression — принцип функционирования аналогичен WsAsynHttpFilter, но декомпрессия данных в фреймах осуществляется по мере их получения

—

action

Обязательный

Тип действия, в случае если фильтр детектировал нарушение политики

disconnect — разрыв канала между клиентом и прокси; block — блокирует передачу фрейма с данными; ignore — игнорирует фрейм

—

stage

Обязательный

Этап, на котором будет действовать action

REQ — для фреймов по направлению от клиента к серверу; RESP — для фреймов по направлению от сервера к клиенту

—

content_type

Обязательный

Тип содержимого для http-запроса, отправляемому на фильтр

Строковое значение

—

apply

Опциональный

Какие правила необходимо подключить для использования в фильтре: фильтр modsecurity, валидация тела запроса/ответа (json-валидация, wsdl/xsd-валидация)

Параметры, описанные в разделах Фильтр ModSecurity, Валидация по JSON схеме, Валидация по WSDL/XSD схеме

—

connect_timeout

Опциональный

Максимальное время ожидания соединения с http-фильтром. Если значение не установлено или равно нулю — таймаут считается не заданным

Текстовое значение с суффиксом: ms (миллисекунда), s (секунда), m (минута), h (час), d (день), w (неделя), M (месяц — 30 дней), y (год — 365 дней)

—

read_timeout

Опциональный

Максимальное время ожидания порции данных от http-фильтра. Если значение не установлено или равно нулю — таймаут считается не заданным

Текстовое значение с суффиксом: ms (миллисекунда), s (секунда), m (минута), h (час), d (день), w (неделя), M (месяц — 30 дней), y (год — 365 дней)

—

write_timeout

Опциональный

Максимальное время ожидания следующей порции данных для отправки http-фильтру. Если значение не установлено или равно нулю — таймаут считается не заданным

Текстовое значение с суффиксом: ms (миллисекунда), s (секунда), m (минута), h (час), d (день), w (неделя), M (месяц — 30 дней), y (год — 365 дней)

—

filter_web_socket - nohttp#

Название

Обязательность

Описание

Возможные значения

Значение по умолчанию

type

Обязательный

Тип используемого фильтра

WsFrameTypeFilter — проверяет заголовки фреймов на допустимый или не допустимый тип; DataSizeLimitFilter — позволяет задать предельный размер данных сообщения

—

action

Обязательный

Тип действия, в случае если фильтр детектировал нарушение политики

disconnect — разрыв канала между клиентом и прокси; block — блокирует передачу фрейма с данными; ignore — игнорирует фрейм, но пропускает его дальше

—

stage

Обязательный

Этап, на котором будет действовать action

REQ — для фреймов по направлению от клиента к серверу; RESP — для фреймов по направлению от сервера к клиенту

—

frame_types

Обязательный (если type: WsFrameTypeFilter)

Типы фреймов, на которые распространяется задаваемое ограничение. Так как фактически определена иерархия типов фреймов — DATA (TEXT и BINARY) и CONTROL (PING, PONG, CLOSE) — то это необходимо учитывать

Последовательность: DATA, TEXT, BINARY, CONTROL, PING, PONG, CLOSE

—

rule

Обязательный (если type: WsFrameTypeFilter)

Разрешены или запрещены перечисленные типы

ALLOWED — разрешить; DENIED — запретить

—

limit

Обязательный (если type: DataSizeLimitFilter)

Предельный размер данных сообщения. Если предел превышен, произойдет отключение сеанса

Текстовое значение с суффиксом: число без суффикса (байты), k (килобайты), m (мегабайты)

—

decompression

Обязательный (если type: DataSizeLimitFilter)

Необходимо ли декомпрессировать сообщение перед отправкой на проверку по лимиту передаваемых данных

true, false

—

Пример использования фильтра DataSizeLimitFilter:

service:
  service_web_socket_proxy:
    - id: 1
      optional:
        # ограничение на сессию
        upload_size_limit: 2k
        download_size_limit: 2k
        size_limit_decompression: true
      filters:
        filter_web_socket:
          nohttp:
            # ограничение на одно сообщение
            - type: DataSizeLimitFilter
              action: block
              stage: REQ
              limit: 1k
              decompression: true

Пример тестового конфигурационного файла:

profile: ws_test
system:
  wrk_count: 1
  conn_count: 4000
  optional:
    log_level: debug
service:
  service_main_proxy:
    - id: 1
      listen:
        - port: 8091
      hostname:
        - localhost
      url: /
      upstream_groups:
        - id: ups1
          servers:
            - server: localhost:8019
  service_web_socket_proxy:
    - id: ws1
      url: ^\/ws-stub.*$
      upstream_group_id: ups1
      use_main_upstream_groups: true
      optional:
        upload_size_limit: 2k
        download_size_limit: 2k
        size_limit_decompression: true
      filters:
       filter_web_socket:
         http:
           - type: WsAsynHttpFilter
             action: disconnect
             stage: REQ
             apply:
               filter_mds:
                 rules:
                   - base
                   - owasp-crs
                   - comodo
             content_type: application/x-www-form-urlencoded
             connect_timeout: 10
             read_timeout: 5
             write_timeout: 5
         nohttp:
           - type: WsFrameTypeFilter
             action: block
             stage: REQ
             frame_types:
              - BINARY
             rule: DENIED
           - type: DataSizeLimitFilter
             action: block
             stage: REQ
             limit: 1k
             decompression: true

Пример использования фильтра WsFrameTypeFilter:

service:
  service_web_socket_proxy:
    - id: 1
      filters:
        filter_web_socket:
          http:
            - type: WsAsynHttpFilter
              action: disconnect
              stage: REQ
              apply:
                filter_mds:
                  rules:
                    - base
                    - owasp-crs
                    - comodo
              content_type: application/x-www-form-urlencoded
              connect_timeout: 10s
              read_timeout: 5s
              write_timeout: 5s
          nohttp:
            - type: WsFrameTypeFilter
              action: disconnect
              stage: RESP
              frame_types:
                - DATA
                - CLOSE
              rule: ALLOWED