Фильтр 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 дней).
Если значение не установлено или равно нулю — таймаут считается не заданным.
По умолчанию: значение задается пользователем.
nohttpnohttp-фильтры не используют http протокол для выполнения фильтрации. Все операции, касающиеся фильтрации, они выполняют внутри себя, а для взаимодействуют с другими сервисами используют протоколы, отличные от http. В отличие от http-фильтров они наследуются не от класса org.sbrf.sbtwaf.SimpleAsynHttpFilter, а напрямую от абстрактного класса Filter.
Последовательность может содержать в себе несколько фильтров. При этом фильтры работают независимо и параллельно друг другу.
Однако, если какой-либо фильтр имеет в параметре rule значение denied, а другой фильтр allowed* на одинаковых типах фреймов, то результатом будет DENIED.
Тип параметра: Последовательность параметров и их значения.
По умолчанию: значение задается пользователем.
Обязательные параметры:
typeВ значении параметра указывается тип используемого фильтра.
Тип параметра:
WsFrameTypeFilter - проверяет заголовки фреймов на допустимый или не допустимый тип. Для данного фильтра определены следующие параметры — frame_types и rule.
DataSizeLimitFilter - позволяет задать предельный размер данных сообщения.
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