Фильтр WebSocket#

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

Опциональные параметры:

  • filter_web_socket

    Тип параметра: Группа параметров и их значения.

    По умолчанию: Значение задается пользователем.

    Опциональные параметры:

    • http

      Принцип работы http-фильтров заключается в следующем: получая на вход фрагменты websocket frame они собирают их, проделывают необходимые преобразования над исходными данными, формируют http-запрос и отправляют его некоторому внешнему http-обработчику, который собственно и проверяет данные на наличие в них потенциального опасного содержимого (это может быть обработчик mds, naxsi, либо другой).

      Все существующие http-фильтры (в контексте библиотеки sowa-java-extlib) имеют общего предка - класс org.sbrf.sbtwaf.SimpleAsynHttpFilter, и общий набор параметров (в дополнение к общим для всех фильтров) - это параметры apply, content_type,connect_timeout, read_timeout, write_timeout.

      Последовательность http может содержать в себе несколько фильтров. При этом фильтры работают независимо и параллельно друг другу.

      Тип параметра: Последовательность параметров и их значения.

      По умолчанию: Значение задается пользователем.

      Обязательные параметры:

      • type

        В значении параметра указывается тип используемого фильтра.

        Тип параметра:

        • WsAsynHttpFilter - осуществляет последовательную обработку фрагментов, как на входе, так и на выходе. Т.е. подаваемый на вход фрагмент ставится в очередь обработки. После обработки, осуществляется проход по всем обрабатываемым сообщениям и на каждое сообщение выполняется операция установки результата;

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

        • WsAsynHttpFilterWithPartialDecompression - принцип функционирования фильтра аналогичен фильтру WsAsynHttpFIlter, но в отличии от него, декомпрессия данных в фреймах осуществляется по мере их получения, а не после формирования цепочки Continuation фильтров.

      • action

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

        Тип параметра:

        • disconnect - разрыв канала между клиентом и прокси;

        • block - блокирует передачу фрейма с данными;

        • ignore - игнорирует фрейм.

      • stage

        В значении параметра указывается этап, на котором будет действовать action.

        Тип параметра:

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

        • RESP - для фреймов по направлению от сервера к клиенту.

      • content_type

        В значении параметра указывается тип содержимого для http-запроса, отправляемому на фильтр.

        Тип параметра: Строковое значение.

      Опциональные параметры:

      • apply

        В значении параметра указывается, какие правила необходимо подключить, для использования в фильтре:

        • фильтр modsecurity - позволяет проверить download/upload трафик на наличие угроз (например sql-injection), содержащихся в методе, заголовке запроса, теле и др.;

        • валидация тела запроса/ответа (json-валидация, wsdl/xsd-валидация).

        apply:
          filter_mds:
            enabled: true
            debug: true
            ...
          validator_json:
            request:
              - schema: ....
        

        Тип параметра: группа параметров и их значения.

        По умолчанию: значение задается пользователем.

      • 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 дней).

        Если значение не установлено или равно нулю - таймаут считается не заданным.

        По умолчанию: значение задается пользователем.

    • nohttp

      nohttp-фильтры не используют http протокол для выполнения фильтрации. Все операции, касающиеся фильтрации, они выполняют внутри себя, а для взаимодействуют с другими сервисами используют протоколы, отличные от http. В отличии от http-фильтров они наследуются не от класса org.sbrf.sbtwaf.SimpleAsynHttpFilter, а напрямую от абстрактного класса Filter.

      В настоящий момент определен только один nohttp-фильтр - это фильтр WsFrameTypeFilter, который проверяет заголовки фреймов на допустимые или не допустимый тип. Для данного фильтра определены следующие параметры - frame_types и rule.

      Последовательность может содержать в себе несколько фильтров. При этом фильтры работают независимо и параллельно друг другу.

      Однако, если какой-либо фильтр имеет в параметре rule значение denied, а другой фильтр allowed* на одинаковых типах фреймов, то результатом будет DENIED.

      Тип параметра: Последовательность параметров и их значения.

      По умолчанию: значение задается пользователем.

      Обязательные параметры:

      • type

        В значении параметра указывается тип используемого фильтра.

        Тип параметра:

        • WsAsynHttpFilter - осуществляет последовательную обработку фрагментов, как на входе, так и на выходе. Т.е. подаваемый на вход фрагмент ставится в очередь обработки. После обработки, осуществляется проход по всем обрабатываемым сообщениям и на каждое сообщение выполняется операция установки результата;

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

        • WsAsynHttpFilterWithPartialDecompression - принцип функционирования фильтра аналогичен фильтру WsAsynHttpFIlter, но в отличии от него, декомпрессия данных в фреймах осуществляется по мере их получения, а не после формирования цепочки Continuation фильтров.

      • action

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

        Тип параметра:

        • disconnect - разрыв канала между клиентом и прокси;

        • block - блокирует передачу фрейма с данными;

        • ignore - игнорирует фрейм, но пропускает его дальше.

      • stage

        В значении параметра указывается этап, на котором будет действовать action.

        Тип параметра:

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

        • RESP - для фреймов по направлению от сервера к клиенту.

      • frame_types

        В значении параметра указываются типы фреймов, на которые распространяется задаваемое ограничение.

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

        frame_types:
          - DATA
          - CLOSE
        

        Обязательно в случае:

        type: WsFrameTypeFilter
        

        Тип параметра: последовательность строковых значений:

        • 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