Фильтр WebSocket#
Фильтр web_socket предназначен для обмена сообщениями между браузером и веб-сервером в режиме реального времени. Фильтр web_socket представляет собой последовательность параметров.
Опциональные параметры:
filter_web_socket
Тип параметра: Группа параметров и их значения.
По умолчанию: Значение задается пользователем.
Опциональные параметры:
http
Принцип работы http-фильтров заключается в следующем: получая на вход фрагменты websocket frame они собирают их, проделывают необходимые преобразования над исходными данными, формируют http-запрос и отправляют его некоторому внешнему http-обработчику, который собственно и проверяет данные на наличие в них потенциального опасного содержимого (это может быть обработчик mds, naxsi, либо другой).
Все существующие http-фильтры (в контексте библиотеки sowa-java-extlib) имеют общего предка - класс org.bank.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