Перейти к основному содержимому
Версия: 4.5.X

Утилита 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 - версия