Утилита 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. Подробнее про получение токена.
Доступные флаги
-
тип
- описание -
access-log
string
- выходной файл для журнала доступа. Если не задано, используется/dev/stderr
-
access-log
disabled
- когда этот флаг установлен, журнал доступа не печатается -
access-log-json-enabled - при установке этого флага используется лог в формате JSON
-
access-log-strip-query - когда этот флаг установлен, журнал доступа удаляет строки запроса из журнала доступа
-
address
string
- сетевой адрес, который шкипер должен прослушивать (по умолчанию ":9090") -
application-log
string
- выходной файл журнала приложений. Если не задано, используется /dev/stderr -
application-log-json-enabled - при установке этого флага используется лог в формате JSON
-
application-log-level
string
- уровень журнала для журналов приложений, возможные значения: PANIC, FATAL, ERROR, WARN, INFO, DEBUG (по умолчанию "INFO") -
application-log-prefix
string
- префикс для каждой записи журнала (по умолчанию «[APP]») -
backend-flush-interval
duration
- интервал очистки для обновленных прокси-соединений (по умолчанию 20 мс) -
client-tls-cert
string
- файлы сертификатов TLS для внутренних подключений, несколько ключей могут быть указаны через запятую — порядок должен соответствовать ключам -
client-tls-key
string
- файл ключа TLS для серверных подключений, несколько ключей могут быть указаны через запятую — порядок должен соответствовать сертификатам -
close-idle-conns-period
duration
- задает временной интервал закрытия всех простаивающих соединений. Не закрывается, когда 0 (по умолчанию 20 с) -
compress-encodings
value
- установить кодировки, поддерживаемые для сжатия, порядок определяет приоритет, когдаAccept-Header
имеет одинаковые значения качества, см. RFC 7231, раздел 5.3.1 -
config-file
string
- если предоставлено, флаги будут загружены/перезаписаны значениями в файле (yaml) -
debug-listener
string
- когда этот адрес установлен, шкипер запускает дополнительный слушатель, возвращающий исходные и преобразованные запросы -
default-filters-dir
string
- путь к каталогу, который содержит конфигурации фильтров по умолчанию для каждой службы и пространства имен (отключен, если не задан) -
default-http-status
int
- статус HTTP по умолчанию, используемый, когда маршрут для запроса не найден (по умолчанию 404) -
disable-http-keepalives - заставляет бэкенд всегда создавать новое соединение
-
enable-dualstack-backend - включает DualStack для серверных подключений (по умолчанию true)
-
expect-continue-timeout-backend
duration
- устанавливает таймаут ожидания продолжения HTTP для соединений с бэкендом (по умолчанию 30 с) -
expected-bytes-per-request
int
- байт на запрос, который используется для расчета ограничений параллелизма для буферизации скачков соединения (по умолчанию 51200) -
forwarded-headers
value
- список заголовков, разделенных запятыми, для добавления к входящему запросу перед маршрутизацией список заголовков, разделенных запятыми, для добавления к входящему запросу перед маршрутизацией X-Forwarded-Host устанавливает значение X-Forwarded-Host для хоста запроса X-Forwarded-Port=<port> устанавливает значение X-Forwarded-Port -
forwarded-headers-exclude-cidrs
value
- отключает добавление перенаправленных заголовков для IP-адресов удаленных хостов из списка CIDR, разделенного запятыми -
idle-conns-num
int
- максимальное количество незанятых соединений на бэкенд-хост (по умолчанию 64) -
ignore-trailing-slash - флаг, указывающий игнорировать косые черты в путях при маршрутизации
-
insecure - флаг, указывающий на игнорирование проверки TLS-сертификатов внутренних служб
-
keepalive-backend
duration
- устанавливает время ожидания для соединений с бэкендом (по умолчанию 30 с) -
max-audit-body
int
- устанавливает максимальное тело для чтения в журнале аудита (по умолчанию 1024) -
max-header-bytes
int
- установить MaxHeaderBytes для соединений http-сервера (по умолчанию 1048576) -
max-idle-connection-backend
int
- устанавливает максимальное количество незанятых соединений для всех соединений бэкенда -
max-loopbacks
int
- максимальное количество обратных петель для входящего запроса, устанавливается в -1 для отключения обратных петель (по умолчанию 9) -
max-tcp-listener-queue
int
- устанавливает жестко заданный максимум для параллелизма слушателей TCP, обычно рассчитываемый на основе доступной памяти cgroups with max -
normalize-host - преобразует хост запроса в нижний регистр и удаляет порт и завершающую точку, если таковая имеется
-
proxy-preserve-host - флаг, указывающий на сохранение заголовка 'Host' входящего запроса в исходящих запросах
-
read-header-timeout-server
duration
- установить ReadHeaderTimeout для соединений с http-сервером (по умолчанию 1м0с) -
refuse-payload
value
- отклонять запросы, соответствующие заданному значению. Может быть задано несколько раз -
remove-hop-headers -позволяет удалять Hop-Headers в соответствии с RFC-2616
-
response-header-timeout-backend
duration
- устанавливает таймаут заголовка ответа HTTP для соединений с бэкендом (по умолчанию 1м0с) -
reverse-source-predicate - обратный порядок поиска IP клиента из заголовка X-Forwarded-For
-
rfc-patch-path - исправляет путь входящего запроса для сохранения некодированных зарезервированных символов в соответствии с RFC 2616 и RFC 3986
-
routes-file
string
- файл, содержащий определения маршрутов -
support-listener
string
- сетевой адрес, используемый для открытия конечной точки /metrics. Пустое значение отключает поддержку конечной точки. (по умолчанию ":9911") -
suppress-route-update-logs - печатать только сводки по обновлениям/удалениям маршрутов
-
timeout-backend
duration
- уст анавливает таймаут соединения TCP клиента для соединений с бэкендом (по умолчанию 1м0с) -
tls-cert
string
- путь в локальной файловой системе к файлу(ам) сертификата (включая любые промежуточные), может быть указан через запятую -
tls-key
string
- путь в локальной файловой системе к файлу(ам) закрытого ключа сертификата, несколько ключей могут быть указаны через запятую - порядок должен соответствовать сертификатам -
tls-min-version
string
- минимальная версия TLS, которая будет использоваться в соединениях сервера, прокси и клиента (по умолчанию "1.2") -
tls-timeout-backend 'duration' - устанавливает тайм-аут квитирования TLS для соединений с бэкендом (по умолчанию 1 м0с)
-
version - версия