Утилита WAF&Proxy
KOMRAD-waf-proxy — это HTTP-маршрутизатор и прокси-сервер. Он предназначен для обработки большого количества динамически настраиваемых определений маршрутов HTTP (> 800 000 маршрутов). В его функции входит определять маршруты на основе свойств запросов, таких как путь, метод, хост и заголовки, используя правила. Это позволяет модифицировать запросы и ответы с помощью фильтров, которые настраиваются независимо для каждого маршрута.
Предикаты
Предикаты используются для определения того, какой маршрут будет обрабатывать входящий запрос. Маршруты могут содержать несколько предикатов. Запрос будет соответствовать маршруту только в том случае, если все предикаты маршрута совпадают.
Возможно множество вариантов настройки правил проксирования (предикатов). Они записываются в файл с расширением .eskip
. Мы предоставляем типовые правила использования.
- Предикат с возможностью модификации запроса для ГосСОПКА с помощью файла
komrad-waf-proxy-gossopka-messages.lua
и возможностью отправки только из KOMRAD
sopkaMessagesTest:
PathRegexp("^\/api\/v2\/(incidents|comments).*")
-> lua("komrad-waf-proxy-gossopka-messages.lua")
-> "https://lk.cert.gov.ru";
sopkaMessagesProd:
Header("X-KOMRAD-SOPKA", "true")
&& PathRegexp("^\/api\/v2\/(incidents|comments).*")
-> lua("komrad-waf-proxy-gossopka-messages.lua")
-> "https://lk.cert.gov.ru";
rest: *
-> status(404)
-> inlineContent("no matching route")
-> <shunt>;
- Предикат с возможностью модификации запроса для ГосСОПКА с помощью файла
komrad-waf-proxy-gossopka-messages.lua
с любого хоста подключиться к ГосСОПКА
all: * -> lua("komrad-waf-proxy-gossopka-messages.lua") -> "https://lk.cert.gov.ru";
- Предикат с возможностями добавления сертификата и аутентификационных данных с настройками безопасности для запросов к KOMRAD Enterprise SIEM.
komrad: * -> pauth(
"https://[ip_komrad]/api/v1/login",
"/run/secrets/echelon-pauth-user",
"/run/secrets/echelon-pauth-password",
"/var/lib/echelon/komrad/certs/ca.pem"
)
-> "https://[ip_komrad]";
Сценарии использования на Windows с ViPNet
Скачиваем на машину с подключением к ГосСОПКА:
- komrad-waf-proxy.exe
- komrad-waf-proxy-gossopka-setup.eskip
- server-key.pem и server.pem
- komrad-waf-proxy-gossopka-messages.lua
Выбираем подходящий предикат для нашего файла, например, разрешим всем подключение к ГосСОПКА:
all: * -> lua("komrad-waf-proxy-gossopka-messages.lua") -> "https://lk.cert.gov.ru";
Запустим PowerShell
и выполним команду:
.\komrad-waf-proxy.exe server -tls-key .\certs\server-key.pem -tls-cert .\certs\server.pem -routes-file .\komrad-waf-proxy-gossopka-setup.eskip
В данном случае мы разрешаем подключение всем, у кого есть сертификат доступа к KOMRAD и доступ в ГосСОПКА.
Адрес проксирования будет https://ip
:9090
Сценарий использования на Linux с установленным KOMRAD
Установщик по умолчанию устанавливает komrad-waf-proxy
, но не запускает службу.
Для изменения конфигурационного файла выполните команду:
sudo nano /etc/echelon/komrad/komrad-waf-proxy-gossopka-rules.eskip
Добавим правило. В случае, если запрос пришёл с адреса 1.2.3.4
, нужно выполнить аутентификацию c пользовательскими данными, сертификатом, и подставить куки:
anon: * -> setResponseHeader("WWW-Authenticate", `Basic realm="foo", charset="UTF-8"`) -> status(401) -> <shunt>;
auth: HeaderSHA256(
"Authorization",
"157da8472590f0ce0a7c651bd79aecb5cc582944fcf76cbabada915d333deee8" // SHA256("Basic " + BASE64("Aladdin:open sesame"))
->
ClientIP("1.2.3.4")
->
komrad: * -> pauth(
"https://[ip_komrad]/api/v1/login",
"/run/secrets/echelon-pauth-user",
"/run/secrets/echelon-pauth-password",
"/var/lib/echelon/komrad/certs/ca.pem"
)
-> "https://[ip_komrad]]";
Сохраним изменения и запустим службу komrad-waf-proxy
:
sudo systemctl start komrad-waf-proxy.service
Или запустите в ручном режиме:
sudo -u komrad /usr/bin/komrad-waf-proxy -application-log-level DEBUG -client-tls-ca /home/.../certs/ca.pem -routes-file /etc/echelon/komrad/komrad-waf-proxy-gossopka-rules.eskip -address :9091
Далее фильтр pauth
использует логин, пароль и сертификат из файлов в /run/secrets/...
и проксирует запросы.
Проверить работу запроса можно выполнив команду:
curl -v -u "Aladdin:open sesame" http://[ip_komrad]:9091/api/v1/me
Ответ будет иметь вид:
* Trying [ip_komrad]:9091...
* Connected to [ip_komrad] port 9091 (#0)
* Server auth using Basic with user 'Aladdin'
> GET /api/v1/me HTTP/1.1
> Host: [ip_komrad]:9091
> Authorization: Basic example==
> User-Agent: curl/7.85.0
> Accept: **/**
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Cache-Control: max-age=0
< Content-Type: application/json
< Date: Mon, 06 Mar 2023 19:05:45 GMT
< Expires: Tue, 01 Jan 1980 1:00:00 GMT
< Permissions-Policy: geolocation=(self)
< Pragma: no-cache
< Server: Skipper
< Strict-Transport-Security: max-age=315360000; includeSubDomains; preload
< Vary: Origin
< Vary: Accept-Encoding
< X-Content-Type-Options: nosniff
< X-Frame-Options: DENY
< X-Ratelimit-Limit: 101
< X-Ratelimit-Remaining: 100
< X-Ratelimit-Reset: 1
< Transfer-Encoding: chunked
<
* Connection #0 to host localhost left intact
{"data":{"Login":"admin","ID":"a40ae5c5-a9da-4bfe-a057-fc68c8c82e4e","FirstName":"admin","Patronymic":"","Surname":"Фамилия","Avatar":"","Role":"admin","Token":"eyJhbGciOiJIUzI1NiIsInR5cCI6Ikexample"},"code":"SUCCESS","synopsis":""}%
В результате запрос стороннего сервиса пройдёт авторизацию в KOMRAD.
В случае, если срок жизни куки подойдёт к концу, (раз в сутки при стандартных настройках pauth-server
) сессия будет завершена.
При рестарте произойдёт повторная автоматическая аутентификация в KOMRAD. Подробнее про получение токена.