
teler-waf — это HTTP-промежуточное программное обеспечение на Go, которое защищает локальные веб-сервисы от угроз OWASP Top 10, известных уязвимостей, злоумышленников, ботнетов, нежелательных краулеров и брутфорс-атак.
teler-waf — это комплексное решение для безопасности веб-приложений на Go. Он действует как HTTP-промежуточное ПО, предоставляя простой интерфейс для интеграции функциональности IDS с teler IDS в существующие приложения на Go. Используя teler-waf, вы можете защититься от различных веб-атак, таких как межсайтовый скриптинг (XSS) и SQL-инъекции.
Пакет поставляется со стандартным net/http.Handler, что упрощает интеграцию в маршрутизацию вашего приложения. Когда клиент отправляет запрос к маршруту, защищённому teler-waf, запрос сначала проверяется с помощью teler IDS на наличие известных вредоносных шаблонов. Если вредоносных шаблонов не обнаружено, запрос передаётся для дальнейшей обработки.
Помимо защиты от веб-атак, teler-waf также может помочь повысить общую безопасность и целостность вашего приложения. Он легко настраивается, что позволяет адаптировать его под конкретные нужды вашего приложения.
См. также:
teler-waf предлагает ряд мощных функций, предназначенных для повышения безопасности ваших веб-приложений на Go:
В целом, teler-waf предоставляет комплексное решение безопасности для веб-приложений на Go, помогая защититься от веб-атак и повышая общую безопасность и целостность вашего приложения.
Зависимости:
Чтобы установить teler-waf в ваше приложение на Go, выполните следующую команду для загрузки и установки пакета teler-waf:```console go get github.com/teler-sh/teler-waf
## Использование
> [!WARNING]
> **Уведомление о прекращении поддержки**: Исключения угроз (`Excludes`) будут удалены в предстоящем релизе (**v2**). См. [#73](https://github.com/teler-sh/teler-waf/discussions/73) и [#64](https://github.com/teler-sh/teler-waf/issues/64).
Вот пример использования teler-waf в приложении на Go:
1. Импортируйте пакет teler-waf в свой код на Go:```go
import "github.com/teler-sh/teler-waf"
New для создания нового экземпляра типа Teler. Эта функция принимает разнообразные необязательные параметры, которые могут быть использованы для настройки teler-waf в соответствии с конкретными потребностями вашего приложения.```go
waf := teler.New()3. Используйте метод `Handler` экземпляра `Teler` для создания `net/http.Handler`. Этот обработчик затем может использоваться в HTTP-маршрутизации вашего приложения для применения мер безопасности teler-waf к определённым маршрутам.```go
handler := waf.Handler(http.HandlerFunc(yourHandlerFunc))
handler в маршрутизации HTTP вашего приложения для применения мер безопасности teler-waf к определённым маршрутам.```go
http.Handle("/path", handler)Вот и всё! Вы настроили teler-waf в вашем приложении Go.
**Параметры:**
Для списка параметров, доступных для настройки teler-waf, смотрите структуру [`teler.Options`](https://pkg.go.dev/github.com/teler-sh/teler-waf#Options).
### Примеры
Вот пример того, как настроить параметры и правила для teler-waf:```go
// main.go
package main
import (
"net/http"
"github.com/teler-sh/teler-waf"
"github.com/teler-sh/teler-waf/request"
"github.com/teler-sh/teler-waf/threat"
)
var myHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// This is the handler function for the route that we want to protect
// with teler-waf's security measures.
w.Write([]byte("hello world"))
})
var rejectHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// This is the handler function for the route that we want to be rejected
// if the teler-waf's security measures are triggered.
http.Error(w, "Sorry, your request has been denied for security reasons.", http.StatusForbidden)
})
func main() {
// Create a new instance of the Teler type using the New function
// and configure it using the Options struct.
telerMiddleware := teler.New(teler.Options{
// Exclude specific threats from being checked by the teler-waf.
Excludes: []threat.Threat{
threat.BadReferrer,
threat.BadCrawler,
},
// Specify whitelisted URIs (path & query parameters), headers,
// or IP addresses that will always be allowed by the teler-waf
// with DSL expressions.
Whitelists: []string{
`request.Headers matches "(curl|Go-http-client|okhttp)/*" && threat == BadCrawler`,
`request.URI startsWith "/wp-login.php"`,
`request.IP in ["127.0.0.1", "::1", "0.0.0.0"]`,
`request.Headers contains "authorization" && request.Method == "POST"`
},
// Specify file path or glob pattern of custom rule files.
CustomsFromRule: "/path/to/custom/rules/**/*.yaml",
// Specify custom rules for the teler-waf to follow.
Customs: []teler.Rule{
{
// Give the rule a name for easy identification.
Name: "Log4j Attack",
// Specify the logical operator to use when evaluating the rule's conditions.
Condition: "or",
// Specify the conditions that must be met for the rule to trigger.
Rules: []teler.Condition{
{
// Specify the HTTP method that the rule applies to.
Method: request.GET,
// Specify the element of the request that the rule applies to
// (e.g. URI, headers, body).
Element: request.URI,
// Specify the pattern to match against the element of the request.
Pattern: `\$\{.*:\/\/.*\/?\w+?\}`,
},
},
},
{
// Give the rule a name for easy identification.
Name: `Headers Contains "curl" String`,
// Specify the conditions that must be met for the rule to trigger.
Rules: []teler.Condition{
{
// Specify the DSL expression that the rule applies to.
DSL: `request.Headers contains "curl"`,
},
},
},
},
// Specify the file path to use for logging.
LogFile: "/tmp/teler.log",
})
// Set the rejectHandler as the handler for the telerMiddleware.
telerMiddleware.SetHandler(rejectHandler)
// Create a new handler using the handler method of the Teler instance
// and pass in the myHandler function for the route we want to protect.
app := telerMiddleware.Handler(myHandler)
// Use the app handler as the handler for the route.
http.ListenAndServe("127.0.0.1:3000", app)
}
Для большего количества примеров использования teler-waf или интеграции с любым фреймворком, загляните в каталог examples/.
[!TIP] Если вы хотите изучить конфигурации, углубиться в создание пользовательских правил и составление DSL-выражений, вы можете попрактиковаться и получить практический опыт, используя эту песочницу teler WAF. Здесь вы также можете симулировать запросы, настроенные для удовлетворения конкретных потребностей вашего приложения.
Чтобы интегрировать пользовательские правила в промежуточное ПО teler-waf, у вас есть два варианта: Customs и CustomsFromFile. Эти опции обеспечивают гибкость для создания собственных проверок безопасности или переопределения стандартных проверок, предоставляемых teler-waf.
CustomsВы можете определить пользовательские правила напрямую с помощью опции Customs, как показано в примере выше.
В опции Customs вы предоставляете массив структур teler.Rule. Каждая структура teler.Rule представляет пользовательское правило с уникальным именем и условием, которое определяет, как вычисляются отдельные условия внутри правила (or или and). Правило состоит из одной или нескольких структур teler.Condition, каждая из которых определяет конкретное условие для проверки. Условия могут основываться на HTTP-методе, элементе (заголовки, тело, URI или любой), а также на regex-шаблоне или DSL-выражении для сопоставления.
CustomsFromFileВ качестве альтернативы, опция CustomsFromFile позволяет загружать пользовательские правила из внешних файлов, обеспечивая еще большую гибкость и удобство управления. Эти правила могут быть определены в формате YAML, причем каждый файл может содержать одно или несколько правил. Вот пример структуры YAML, представляющей пользовательское правило:```yaml
> [!IMPORTANT]
> Обратите внимание, что параметры `condition`, `method` и `element` являются необязательными. Значения по умолчанию, присвоенные им, следующие: `condition` установлен в **or**, `method` установлен в **ALL**, а `element` установлен в **ANY**. Поэтому, при желании, вы можете оставить эти параметры пустыми. Параметр `pattern` является обязательным, если только вы не укажете выражение `dsl`. В таких случаях, когда указано выражение `dsl`, teler-waf игнорирует любые значения, присвоенные `method` и `element`, даже если они определены. Чтобы увидеть некоторые примеры, вы можете обратиться к каталогу [`tests/rules/`](https://github.com/teler-sh/teler-waf/tree/master/tests/rules/valid).
Вы можете указать параметр `CustomsFromFile` с фактическим путем к файлу или шаблоном glob, указывающим на расположение ваших пользовательских файлов правил. Например:```go
// Create a new instance of the Teler middleware and
// specify custom rules with the CustomsFromFile option.
telerMiddleware := teler.New(teler.Options{
CustomsFromFile: "/path/to/custom/rules/**/*.yaml",
})
С помощью CustomsFromFile вы указываете путь к файлу или шаблон glob, где находятся ваши файлы пользовательских правил. Шаблон может включать подстановочные знаки для сопоставления с несколькими файлами или с каталогом и его подкаталогами. Каждый файл должен содержать одно или несколько пользовательских правил, определенных в правильном формате YAML.
Используя опцию Customs, CustomsFromFile или обе, вы можете легко интегрировать свои пользовательские правила в промежуточное ПО teler-waf, расширяя его возможности безопасности в соответствии с вашими конкретными требованиями.
DSL (предметно-ориентированный язык) выражения предоставляют мощный способ определения условий, используемых для оценки входящих запросов в контексте пользовательских правил или белых списков. С помощью DSL выражений вы можете создавать сложные и целенаправленные условия на основе различных атрибутов входящих запросов. Вот несколько иллюстративных примеров кода DSL выражений:
Проверьте, содержит ли заголовок входящего запроса "curl":```sql request.Headers contains "curl"
Проверьте, является ли входящий метод запроса "GET":```sql
request.Method == "GET"
Проверьте, является ли метод входящего запроса "GET" или "POST", используя регулярное выражение, оператор matches:```sql
request.Method matches "^(POS|GE)T$"
Проверьте, является ли IP-адрес входящего запроса адресом localhost:```sql
request.IP in ["127.0.0.1", "::1", "0.0.0.0"]
Проверьте, содержит ли какой-либо элемент в запросе строку "foo":```console one(request.ALL, # contains "foo")
Проверьте, содержит ли тело входящего запроса "foo":```sql
request.Body contains "foo"
Проверьте, является ли текущая анализируемая категория угрозы bad crawler или directory bruteforce:```sql threat in [BadCrawler, DirectoryBruteforce]
Эти примеры дают представление о выразительных возможностях DSL-выражений, позволяя вам задавать сложные условия на основе различных атрибутов запроса. Используя эти выражения, вы можете эффективно определять критерии для оценки входящих запросов и соответствующим образом настраивать свои пользовательские правила или белые списки, обеспечивая детальный контроль над поведением вашего приложения.
#### Доступные переменные
При работе с DSL-выражениями у вас есть доступ к различным переменным, которые предоставляют ценную информацию о входящих запросах и анализируемой категории угроз. Вот подробное описание доступных переменных:
- **Категория угрозы**
Все константные идентификаторы типа `threat.Threat` могут использоваться в качестве допустимых переменных. Эти идентификаторы представляют различные категории угроз, актуальные для вашего анализа.
- **`request`**
Переменная `request` представляет входящий запрос и предоставляет доступ к его полям и соответствующим значениям. Внутри переменной `request` доступны следующие подпеременные:
- `request.URI`: Представляет URI входящего запроса, включая путь, запросы, параметры и фрагменты.
- `request.Headers`: Представляет заголовки входящего запроса, представленные в несколько строк.
- `request.Body`: Представляет тело входящего запроса.
- `request.Method`: Представляет метод входящего запроса.
- `request.IP`: Представляет IP-адрес клиента, связанный с входящим запросом.
- `request.ALL`: Представляет все строковые значения из указанных выше полей запроса в виде среза.
- **`threat`**
Переменная `threat` представляет анализируемую категорию угрозы. Она имеет тип `threat.Threat` и позволяет оценивать и принимать решения на основе конкретной категории угрозы, связанной с запросом.
Используя эти переменные в своих DSL-выражениях, вы можете эффективно получать доступ к атрибутам входящих запросов и управлять ими, а также оценивать соответствующие категории угроз. Это позволяет вам создавать пользовательские условия правил<!--и белые списки-->, настроенные под ваш конкретный случай использования.
#### Доступные функции
Кроме того, у вас есть доступ к различным функциям. Эти функции включают как [встроенные функции](https://expr.medv.io/docs/Language-Definition#built-in-functions), предоставляемые пакетом expr, так и функции, специально определённые в пакете DSL. Функции используют возможности, предоставляемые встроенным пакетом `strings` языка Go. Вот подробный список доступных функций:
- `cidr`: Получить все IP-адреса в диапазоне по заданному CIDR.
- `clone`: Создать копию строки.
- `containsAny`: Проверить, содержит ли строка какие-либо из указанных подстрок.
- `equalFold`: Сравнить две строки без учёта регистра.
- `hasPrefix`: Проверить, имеет ли строка указанный префикс.
- `hasSuffix`: Проверить, имеет ли строка указанный суффикс.
- `join`: Объединить несколько строк с помощью указанного разделителя.
- `repeat`: Повторить строку указанное количество раз.
- `replace`: Заменить вхождения подстроки внутри строки.
- `replaceAll`: Заменить все вхождения подстроки внутри строки.
- `request`: Получить доступ к информации, специфичной для запроса, в рамках DSL-выражения.
- `threat`: Получить доступ к информации, связанной с анализируемой категорией угрозы.
- `title`: Преобразовать строку в заголовочный регистр (первая буква каждого слова заглавная).
- `toLower`: Преобразовать строку в нижний регистр.
- `toTitle`: Преобразовать строку в заголовочный регистр.
- `toUpper`: Преобразовать строку в верхний регистр.
- `toValidUTF8`: Преобразовать строку в строку, закодированную в допустимом UTF-8.
- `trim`: Удалить начальные и конечные пробелы из строки.
- `trimLeft`: Удалить начальные пробелы из строки.
- `trimPrefix`: Удалить указанный префикс из строки.
- `trimRight`: Удалить конечные пробелы из строки.
- `trimSpace`: Удалить начальные и конечные пробелы и сжать последовательные пробелы внутри строки.
- `trimSuffix`: Удалить указанный суффикс из строки.
Более подробную информацию об операторах и встроенных функциях см. в [документации Expr](https://expr.medv.io/docs/Getting-Started). Она представляет собой всестороннее руководство по использованию операторов и изучению доступных встроенных функций в ваших DSL-выражениях.
### Упрощённое управление конфигурацией
Для эффективной настройки необходимо определить ряд параметров, включая белые списки, определения пользовательских правил, настройки журналирования и другие параметры. Пакет [`option`](https://pkg.go.dev/github.com/teler-sh/teler-waf/option) упрощает этот процесс конфигурирования, позволяя эффективно десериализовать или загружать данные конфигурации из форматов JSON и YAML в формат, который teler-waf может легко понять и применить.```go
// Load configuration from a YAML file.
opt, err := option.LoadFromYAMLFile("/path/to/teler-waf.conf.yaml")
if err != nil {
panic(err)
}
// Create a new instance of the Teler type with
// the loaded options.
telerMiddleware := teler.New(opt)
По умолчанию teler-waf кэширует все входящие запросы на 15 минут и очищает их каждые 20 минут для повышения производительности. Однако, если вы всё ещё настраиваете параметры в соответствии с требованиями вашего приложения, вы можете отключить кэширование во время разработки, установив для опции режима разработки значение true. Это предотвратит кэширование входящих запросов и может быть полезно для целей отладки.```go
// Create a new instance of the Teler type using
// the New function & enable development mode option.
telerMiddleware := teler.New(teler.Options{
Development: true,
})
### Журналы
Вот пример того, как будут выглядеть строки журнала, если teler-waf обнаружит угрозу в запросе:```json
{"level":"warn","ts":1672261174.5995026,"msg":"bad crawler","id":"654b85325e1b2911258a","category":"BadCrawler","caller":"teler-waf","listen_addr":"127.0.0.1:36267","request":{"method":"GET","path":"/","ip_addr":"127.0.0.1:37702","headers":{"Accept":["*/*"],"User-Agent":["curl/7.81.0"]},"body":""}}
{"level":"warn","ts":1672261175.9567692,"msg":"directory bruteforce","id":"b29546945276ed6b1fba","category":"DirectoryBruteforce","caller":"teler-waf","listen_addr":"127.0.0.1:36267","request":{"method":"GET","path":"/.git","ip_addr":"127.0.0.1:37716","headers":{"Accept":["*/*"],"User-Agent":["X"]},"body":""}}
{"level":"warn","ts":1672261177.1487508,"msg":"Detects common comment types","id":"75412f2cc0ec1cf79efd","category":"CommonWebAttack","caller":"teler-waf","listen_addr":"127.0.0.1:36267","request":{"method":"GET","path":"/?id=1%27%20or%201%3D1%23","ip_addr":"127.0.0.1:37728","headers":{"Accept":["*/*"],"User-Agent":["X"]},"body":""}}
id — это уникальный идентификатор, который генерируется, когда запрос отклоняется teler-waf. Он включается в заголовки HTTP-ответа запроса (X-Teler-Req-Id) и может использоваться для устранения неполадок с запросами, выполняемыми к веб-сайту.
Например, если запрос к веб-сайту возвращает код ошибки HTTP, такой как 403 Forbidden, идентификатор запроса teler может быть использован для определения конкретного запроса, вызвавшего ошибку, и помочь в устранении неисправности.
Идентификаторы запросов teler используются teler-waf для отслеживания запросов к его веб-приложению и могут быть полезны для отладки и анализа шаблонов трафика на веб-сайте.
По умолчанию teler-waf использует DefaultHTMLResponse в качестве стандартного ответа, когда запрос отклоняется или блокируется. Однако teler-waf предлагает высокую степень настройки, позволяя вам адаптировать ответ под ваши конкретные требования. Настройка может быть выполнена с помощью опций Status, HTML или HTMLFile, все из которых являются частью интерфейса Response.
Вот как вы можете использовать эти опции в своем коде:```go // Create a new instance of the Teler middleware telerMiddleware := teler.New(teler.Options{ // Customize the response for rejected requests Response: teler.Response{ Status: 403, HTML: "Your request has been denied for security reasons. Ref ID: {{ID}}.", // Alternatively, you can use HTMLFile to point to a custom HTML file HTMLFile: "/path/to/custom-403.html", }, })
С таким уровнем настройки вы можете создавать персонализированные и информативные ответы, которые будут отображаться при блокировке или отклонении запроса teler-waf. Опция `HTML` позволяет напрямую указать нужный HTML-контент в виде строки, а опция `HTMLFile` даёт возможность ссылаться на внешний файл, содержащий пользовательский HTML-ответ.
Кроме того, для улучшения пользовательского опыта вы можете использовать плейсхолдеры в вашем HTML-контенте для создания динамических элементов. Во время выполнения эти плейсхолдеры будут заменены реальными значениями, что позволит получать более контекстуально релевантные ответы. Доступные и поддерживаемые плейсхолдеры включают:
* `{{ID}}`: Идентификаторы запросов, позволяющие уникально идентифицировать каждый отклонённый запрос.
* `{{message}}`: Сообщения об отклонении, передающие причину блокировки запроса.
* `{{threat}}`: Категории угроз, предоставляющие информацию об обнаруженной угрозе безопасности.
Включая эти плейсхолдеры, вы можете создавать подробные и всесторонние ответы, которые эффективно сообщают обоснование отклонения или блокировки запросов.
### Falco Sidekick
[Falco Sidekick](https://github.com/falcosecurity/falcosidekick) — это инструмент, который получает события от Falco, проекта с открытым исходным кодом в области безопасности времени выполнения для облачных сред, и отправляет их в различные выходные каналы. Он позволяет пересылать оповещения безопасности в различные сторонние системы, такие как Slack, Elasticsearch, Loki, Grafana, Datadog и [другие](https://github.com/falcosecurity/falcosidekick#outputs). Это позволяет командам безопасности эффективно отслеживать и реагировать на угрозы и события безопасности в реальном времени.
Интеграция Falco Sidekick с teler-waf также возможна. Используя опцию `FalcoSidekickURL`, вы можете настроить teler-waf на отправку событий в Falco Sidekick, который будет получать и обрабатывать их за вас. Для этого просто создайте новый экземпляр типа `Teler` с помощью функции `New` и укажите в опции `FalcoSidekickURL` URL вашего экземпляра Falco Sidekick. Например:```go
// Create a new instance of the Teler type using
// the New function & integrate Falco Sidekick.
telerMiddleware := teler.New(teler.Options{
FalcoSidekickURL: "http://localhost:2801",
})
После настройки этой интеграции любые угрозы, обнаруженные teler-waf, будут отправляться в Falco Sidekick, который затем сможет предпринять соответствующие действия в зависимости от вашей конфигурации. Например, вы можете настроить Falco Sidekick на автоматическую отправку предупреждений вашей команде реагирования на инциденты.
Событие, пересылаемое экземпляру Falco Sidekick, включает следующую информацию:
output: Представляет собой сообщение предупреждения.priority: Приоритет всегда обозначается как warning, что указывает на срочность, связанную с событиями безопасности.rule: Указывает конкретное правило (сообщение), которое совпало с соответствующим запросом.time: Временная метка создания события.teler.caller: Определяет источник приложения, вызвавшего teler-waf.teler.id: Представляет уникальный идентификатор отклоненного запроса.teler.threat: Указывает категорию угрозы.teler.listen_addr: Обозначает сетевой адрес, на котором teler-waf прослушивает входящие запросы.
request.body: Содержит тело соответствующего запроса.request.headers: Перечисляет заголовки соответствующего запроса.В целом, Falco Sidekick — это универсальный инструмент, который может помочь автоматизировать процесс реагирования на инциденты безопасности и улучшить общую защиту. Используя его возможности, вы можете гарантировать, что ваши облачные приложения защищены от потенциальных угроз.
Вы можете улучшить мониторинг безопасности, интегрировав журналы teler WAF в Wazuh. Для этого используйте пользовательские правила, доступные в каталоге extras/.
Добавьте блок элемента localfile ниже внутрь элемента ossec_config в файл локальной конфигурации:```xml
<ossec_config>
Сделав это, Wazuh сможет читать и анализировать журналы teler WAF, улучшая защиту вашей сети и предоставляя более полную аналитику.
Пакет teler-waf использует набор данных об угрозах для идентификации и анализа каждого входящего запроса на предмет потенциальных угроз безопасности. Этот набор данных обновляется ежедневно, что означает, что у вас всегда будет актуальный ресурс. Набор данных изначально сохраняется в кэш-каталоге на уровне пользователя (в Unix-системах возвращается $XDG_CACHE_HOME/teler-waf в соответствии с XDG Base Directory Specification, если он не пуст, иначе $HOME/.cache/teler-waf. На Darwin возвращается $HOME/Library/Caches/teler-waf. На Windows возвращается %LocalAppData%/teler-waf. На Plan 9 возвращается $home/lib/cache/teler-waf) при первом запуске. При последующих запусках будет использоваться кэшированный набор данных, а не загружаться заново.
[!NOTE] Наборы данных об угрозах получены из репозитория teler-sh/teler-resources.
Однако могут возникнуть ситуации, когда вы захотите отключить автоматическое обновление набора данных об угрозах. Например, у вас может быть медленное или ограниченное интернет-соединение, или вы можете использовать машину с ограниченным доступом к файлам. В таких случаях вы можете установить параметр NoUpdateCheck в значение true, что предотвратит автоматическое обновление набора данных teler-waf.
[!CAUTION] Включение
InMemoryимеет приоритет и гарантирует, что автоматические обновления остаются включенными.```go // Create a new instance of the Teler type using the New // function & disable automatic updates to the threat dataset. telerMiddleware := teler.New(teler.Options{ NoUpdateCheck: true, })
Наконец, могут возникнуть случаи, когда необходимо загрузить набор данных об угрозах в память, а не сохранять его в кэш-директорию на уровне пользователя. Это может быть особенно полезно, если вы запускаете приложение или сервис в образе distroless или runtime, где доступ к файлам может быть ограничен или медленным. В таком сценарии вы можете установить опцию **InMemory** в `true`, что загрузит набор данных об угрозах в память для более быстрого доступа.```go
// Create a new instance of the Teler type using the
// New function & enable in-memory threat datasets store.
telerMiddleware := teler.New(teler.Options{
InMemory: true,
})
[!CAUTION] Это также может потреблять больше системных ресурсов, поэтому стоит учесть компромиссы перед принятием такого решения.
Если вы обнаружите проблему безопасности, пожалуйста, сообщите о ней немедленно — мы серьезно относимся к безопасности!
Если у вас есть информация о проблеме безопасности или уязвимости в этом пакете teler-waf, и/или вы можете успешно выполнить, например, межсайтовый скриптинг (XSS) и вызвать всплывающее предупреждение на нашем демо-сайте (см. ресурсы), пожалуйста, НЕ создавайте публичный issue — вместо этого любезно отправьте свой отчет приватно через форму сообщения об уязвимости.
Вот некоторые ограничения использования teler-waf:
> [!NOTE]
> Результаты бенчмаркинга могут варьироваться и могут быть непостоянными. Набор данных [teler-resources](https://github.com/teler-sh/teler-resources) мог увеличиться с тех пор, что может повлиять на результаты.
- **Сложность настройки**: Настройка teler-waf для удовлетворения специфических потребностей вашего приложения может быть сложной и может требовать определенного уровня экспертизы в веб-безопасности. Это может затруднить правильную настройку и использование teler-waf для тех, кто не знаком с брандмауэрами приложений и системами IDS.
- **Ограниченная защита**: teler-waf не является идеальным решением безопасности и может не защитить от всех возможных типов атак. Как и в случае с любой системой безопасности, важно регулярно отслеживать и обслуживать teler-waf, чтобы убедиться, что он обеспечивает желаемый уровень защиты.
#### Known Issues
Чтобы просмотреть список известных проблем с teler-waf, отфильтруйте проблемы по метке ["known-issue"](https://github.com/teler-sh/teler-waf/issues?q=is%3Aopen+is%3Aissue+label%3Aknown-issue).
## Community
Мы используем Google Groups в качестве нашей выделенной почтовой рассылки. Подпишитесь на [teler-announce](https://groups.google.com/g/teler-announce) через [[email protected]](mailto:[email protected]), чтобы получать важные объявления, такие как доступность новых версий. Эта подписка будет держать вас в курсе значительных разработок, связанных с [teler IDS](https://github.com/teler-sh/teler), [teler WAF](https://github.com/teler-sh/teler-waf), [teler Proxy](https://github.com/teler-sh/teler-proxy), [teler Caddy](https://github.com/teler-sh/teler-caddy) и [teler Resources](https://github.com/teler-sh/teler-resources).
Любые [запросы](https://github.com/teler-sh/teler-waf/discussions/categories/q-a), [обсуждения](https://github.com/teler-sh/teler-waf/discussions) или [проблемы](https://github.com/teler-sh/teler-waf/issues) отслеживаются здесь, на GitHub. Именно здесь мы активно управляем и решаем эти аспекты взаимодействия с сообществом.
## License
Этот пакет предоставляется под двойной лицензией: [Apache License 2.0](https://github.com/teler-sh/teler-waf/blob/HEAD/LICENSE-APACHE) и [Elastic License 2.0 (ELv2)](https://github.com/teler-sh/teler-waf/blob/HEAD/LICENSE-ELASTIC) (для основного пакета **teler**).
Вы можете свободно использовать его внутри своей организации для защиты своих приложений. Однако вы не можете использовать основной пакет для создания облачного, хостингового или управляемого сервиса, а также в коммерческих целях, поскольку для этого потребуется коммерческая лицензия – хотя этот вариант в настоящее время недоступен. Если вы заинтересованы в получении этой коммерческой лицензии для использования, не разрешенного [ELv2](https://github.com/teler-sh/teler-waf/blob/HEAD/LICENSE-ELASTIC), свяжитесь с **@dwisiswant0**.
teler-waf и любые вклады охраняются авторским правом © Dwi Siswanto, 2022-2024.
request.ip_addr: Раскрывает IP-адрес соответствующего запроса.request.method: Указывает HTTP-метод, использованный в соответствующем запросе.request.path: Относится к пути соответствующего запроса.