NetEye Security Layer

Содержание

Обзор

NetEye Security Layer (NS Layer) это фрейморк, который используется для организации и упорядочивания модулей безопасности. NS Layer впервые появился в SEnginx.
NS Layer создает новую фазу для обработки http-запроса, а также фильтры для заголовка и тела ответа. Каждый модуль безопасности может зарегистрировать собственные callback обработчики в NS Layer.
NS Layer предоставляет механизм управления последовательностью вызовов модулей безопасности. Например, вы можете указать NS Layer сначала запустить модуль 1, а затем запустить модуль 3.
NS Layer также предоставляет механизм для единой обработки действий модулей безопасности. Например, все модули безопасности на основе NS Layer могут вызвать API для выполнения действия блокировки.

Как создать модуль с использованием NS Layer

API

#include <ngx_http_neteye_security.h>
 
 
ngx_int_t ngx_http_neteye_security_request_register(ngx_int_t id, ngx_http_neteye_security_request_pt handler);
 
Описание:  Регистрация callback обработчика запроса в NS Layer. Callback обработчик запроса будет вызываться 
в "NetEye Security Phase"
Параметры: id: id модуля в NS Layer
           handler: callback обработчик запроса
Возвращаемое значение: NGX_OK - успех, NGX_ERROR - неудача
 
 
ngx_int_t ngx_http_neteye_security_header_register(ngx_int_t id, ngx_http_neteye_security_response_header_pt handler);
 
Описание:  Регистрация callback обработчика заголовка ответа в NS Layer. Callback обработчика заголовка ответа будет вызываться 
в "NetEye Security header filter"
Параметры: id: id модуля в NS Layer
           handler: callback обработчика заголовка ответа
Возвращаемое значение: NGX_OK - успех, NGX_ERROR - неудача
 
 
ngx_int_t ngx_http_neteye_security_body_register(ngx_int_t id, ngx_http_neteye_security_response_body_pt handler);

Описание:  Регистрация callback обработчика тела запроса в NS Layer. Callback обработчика тела запроса будет вызываться 
в "NetEye Security body filter"
Параметры: id: id модуля в NS Layer
           handler: callback обработчика тела ответа
Возвращаемое значение: NGX_OK - успех, NGX_ERROR - неудача
 
 
ngx_int_t ngx_http_ns_do_action(ngx_http_request_t *r, ngx_http_ns_action_t *action);
 
Описание:  Эта функция выполняет действия для модулей, основанных на NS Layer. 
Заполните структуру action и вызовите эту функцию чтобы NS Layer выполнил действия.
Параметры: r: ngx_http_request_t текущего запроса
           action: структура, определенная в ngx_http_neteye_security.h
Возвращаемое значение: NGX_OK - выполнено, NGX_ERROR - не выполнено
 
 
ngx_int_t ngx_http_neteye_security_ctx_register(ngx_int_t id, ngx_http_neteye_security_ctx_pt handler);
 
Описание:  Регистрация ctx callback обработчика в NS Layer
Параметры: id: id модуля в NS Layer
           handler: ctx callback обработчик модуля
Возвращаемое значение: NGX_OK - успех, NGX_ERROR - неудача
 
 
void ngx_http_ns_jump_bit_set(ngx_http_request_t *r, ngx_uint_t mod);
void ngx_http_ns_jump_bit_clr(ngx_http_request_t *r, ngx_uint_t mod);
void ngx_http_ns_jump_bit_clr_all(ngx_http_request_t *r);
ngx_uint_t ngx_http_ns_jump_bit_is_set(ngx_http_request_t *r, ngx_uint_t mod);
void ngx_http_ns_jump_bit_set_all(ngx_http_request_t *r);
ngx_uint_t ngx_http_ns_jump_bit_is_set_any(ngx_http_request_t *r);
void ngx_http_ns_set_bypass_all(ngx_http_request_t *r);
void ngx_http_ns_clr_bypass_all(ngx_http_request_t *r);
ngx_uint_t ngx_http_ns_test_bypass_all(ngx_http_request_t *r);
 
Описание:  Эти функии используются, чтобы настроить последовательность вызовов модулей в NS Layer
Параметры: r: ngx_http_request_t текущего запроса
           mod: id модуля в NS Layer
Возвращаемое значение: NGX_OK - успех, NGX_ERROR - неудача

Пример

Мы используем модуль Robot Mitigation как пример основанного на NS Layer модуля.

1) Зарегистрируйте информацию о модуле в NS Layer.

Сначала добавьте id нового модуля в 3rd_party/ngx_http_neteye_security/ngx_http_neteye_security.h, а именно - добавьте новую строку в enum:
enum ngx_http_neteye_security_module_ids {
    NGX_HTTP_NETEYE_SECURITY_MODULE_START = 0,
 
    NGX_HTTP_NETEYE_WHITELIST,
    NGX_HTTP_NETEYE_FRIENDLY_BOTSLIST,
    NGX_HTTP_NETEYE_SESSION,
    NGX_HTTP_NETEYE_DYNWHITELIST,
    NGX_HTTP_NETEYE_ROBOT_MITIGATION,
    NGX_HTTP_NETEYE_GOOGLE_RECAPTCHA,
    NGX_HTTP_NETEYE_LOCAL_CAPTCHA,
    NGX_HTTP_NETEYE_COOKIE_POISON,
    NGX_HTTP_NETEYE_PAGE_ACL,
    NGX_HTTP_NETEYE_NAXSI,
    NGX_HTTP_NETEYE_IPS,
    NGX_HTTP_NETEYE_STATUS_PAGE,
    NGX_HTTP_NETEYE_LOG_MODULE,
 
    NGX_HTTP_NETEYE_SECURITY_MODULE_MAX
};
Например, добавьте NGX_HTTP_NETEYE_ROBOT_MITIGATION в этот enum.
Затем опишите новый модуль в 3rd_party/ngx_http_neteye_security/ngx_http_neteye_security.c
/*XXX: do not insert gap among the rank values */
static ngx_http_neteye_security_module_t ngx_http_neteye_security_modules[] = {
    {NGX_HTTP_NETEYE_WHITELIST,
        "Permanent IP Whitelist", NULL, NULL, NULL, 1, 0, 0, NULL},
    {NGX_HTTP_NETEYE_SESSION,
        "Session Mechanism", NULL, NULL, NULL,      2, 1, 0, NULL},
    {NGX_HTTP_NETEYE_DYNWHITELIST,
        "Dynamic White list", NULL, NULL,NULL,      3, 0, 0, NULL},
    {NGX_HTTP_NETEYE_FRIENDLY_BOTSLIST,
        "Friendly Bots list", NULL, NULL, NULL,     4, 0, 0, NULL},
    {NGX_HTTP_NETEYE_ROBOT_MITIGATION,
        "Active/Challenge", NULL, NULL, NULL,       5, 0, 0, NULL},
    {NGX_HTTP_NETEYE_GOOGLE_RECAPTCHA,
        "Google Recaptcha", NULL, NULL, NULL,       6, 0, 0, NULL},
    {NGX_HTTP_NETEYE_LOCAL_CAPTCHA,
        "Local Captcha", NULL, NULL, NULL,          7, 0, 0, NULL},
    {NGX_HTTP_NETEYE_COOKIE_POISON,
        "Cookie Poison", NULL, NULL, NULL,          8, 3, 0, NULL},
    {NGX_HTTP_NETEYE_PAGE_ACL,
        "Page Access Control", NULL, NULL, NULL,    9, 0, 0, NULL},
    {NGX_HTTP_NETEYE_NAXSI,
        "NetEye modified NAXSI", NULL, NULL, NULL,    10, 0, 0, NULL},
    {NGX_HTTP_NETEYE_IPS,
        "NetEye IPS Module", NULL, NULL, NULL,      0, 2, 1, NULL},
    {NGX_HTTP_NETEYE_STATUS_PAGE,
        "Status Page", NULL, NULL, NULL,            0, 4, 0, NULL},
    {NGX_HTTP_NETEYE_LOG_MODULE,
        "NetEye Log", NULL, NULL, NULL,             0, 0, 0, NULL},
};
Добавьте в массив новую строку со следующими столбцами:
  1. id модуля, который определен выше.
  2. Название модуля, строка с описанием модуля.
  3. Три указателя на callback обработчики, оставьте здесь их пустыми, так как они должны быть зарегистрированы на этапе инициализации модуля.
  4. Следующие 3 столбца это порядковый номер этого модуля в последовательности вызовов callback обработчиков для запроса, фильтра заголовка ответа и фильтра тела ответа. Если у модуля нет соответствующего обработчика, установите значение 0.
  5. Последний столбец это обработчик session ctx, оставьте его пустым так как этот обработчик регистрируется на этапе инициализации модуля.
Например, для модуля Robot Mitigation в NS Layer указана следующая информация:
{NGX_HTTP_NETEYE_ROBOT_MITIGATION, "Active/Challenge", NULL, NULL, NULL, 5, 0, 0, NULL},
Это значит, что модуль предоставляет только callback обработчик запроса с порядковым номером 5 в последовтельности вызовов.

2) После внесения информации о модуле в указанные выше файлы, вы можете зарегистрировать callback обработчики в функции postconfiguration модуля:

Определите функцию postconfiguration в структуре модуля nginx:
static ngx_http_module_t                                                                                                
ngx_http_robot_mitigation_module_ctx = {                                                                                
    NULL,                                    /* preconfiguration */                                                    
    ngx_http_rm_init,                        /* postconfiguration */                                                   
                                                                                                                         
    NULL,                                    /* create main configuration */                                           
    NULL,                                    /* init main configuration */                                             
                                                                                                                         
    NULL,                                    /* create server configuration */                                         
    NULL,                                    /* merge server configuration */                                          
                                                                                                                         
    ngx_http_rm_create_loc_conf,             /* create location configuration */                                       
    ngx_http_rm_merge_loc_conf,              /* merge location configuration */                                        
};
Затем зарегистируйте соответствующие callback обработчики для NS Layer в функции postconfiguration:
static ngx_int_t ngx_http_rm_init(ngx_conf_t *cf)
{
    ngx_int_t ret;
    ret = ngx_http_neteye_security_ctx_register(NGX_HTTP_NETEYE_ROBOT_MITIGATION,
            ngx_http_rm_request_ctx_init);
    if (ret != NGX_OK) {
        return ret;
    }
    /* we only need a request handler for this feature */
    return ngx_http_neteye_security_request_register(
            NGX_HTTP_NETEYE_ROBOT_MITIGATION,
            ngx_http_rm_request_handler);
}

3) Наконец вы можете реализовать остальные функции своего модуля. Вы должны следовать правилам создания нового модуля nginx, но не регистрируйте свой модуль как модуль http-фильтра в nginx. NS Layer обеспечит запуск ваших callback обработчиков в правильный момент. Ниже приведен файл конфигурации модуля Robot Mitigation:

ngx_addon_name=ngx_http_robot_mitigation_module
CORE_INCS="$CORE_INCS $ngx_addon_dir"
CORE_DEPS="$CORE_DEPS $ngx_addon_dir/ngx_http_robot_mitigation.h"
HTTP_MODULES="$HTTP_MODULES ngx_http_robot_mitigation_module"
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_robot_mitigation.c $ngx_addon_dir/ngx_http_robot_mitigation_tpl.c"
have=NGX_HTTP_ROBOT_MITIGATION_MODULE . auto/have