接续前节:[security][modsecurity][nginx] nginx 与 modsecurity

nginx开发手册:https://nginx.org/en/docs/dev/development_guide.html#introduction

modsecurity开发手册:https://modsecurity.org/developers.html

nginx 与 modsecurity的接口在这里:https://nginx.org/en/docs/dev/development_guide.html#Modules

1. 可以确定的事情:

  1.  modsecurity 是 nginx 的一个mod。

2. nginx加载一个mod的方法:

  1.  在运行 configure 脚本时,使用参数:

using --add-module=/path/to/module for static compilation
and --add-dynamic-module=/path/to/module for dynamic compilation.

  2.  模块需要在这个路径下准备一个配置文件: config

  3.  以及模块源码文件。

  4.   2,3中的内容,在目录 github/ModSecurity/nginx/modsecurity/ 下。

    modsecurity,好像是一个http类型的mod,读了Modules章节之后还要读HTTP章节。

    https://nginx.org/en/docs/dev/development_guide.html#http

  没太细啃,大概过了一下,总之就是没怎么看懂。。。

3.  如何写一个module:

  参考:https://nginx.org/en/docs/dev/development_guide.html#http

3.1 关键的结构体:

struct ngx_module_s {
ngx_uint_t ctx_index;
ngx_uint_t index; char *name; ngx_uint_t spare0;
ngx_uint_t spare1; ngx_uint_t version;
const char *signature; void *ctx;
ngx_command_t *commands;
ngx_uint_t type; ngx_int_t (*init_master)(ngx_log_t *log); ngx_int_t (*init_module)(ngx_cycle_t *cycle); ngx_int_t (*init_process)(ngx_cycle_t *cycle);
ngx_int_t (*init_thread)(ngx_cycle_t *cycle);
void (*exit_thread)(ngx_cycle_t *cycle);
void (*exit_process)(ngx_cycle_t *cycle); void (*exit_master)(ngx_cycle_t *cycle); uintptr_t spare_hook0;
uintptr_t spare_hook1;
uintptr_t spare_hook2;
uintptr_t spare_hook3;
uintptr_t spare_hook4;
uintptr_t spare_hook5;
uintptr_t spare_hook6;
uintptr_t spare_hook7;
};

ngx_module_s

  modsecurity 中的实现:

ngx_module_t ngx_http_modsecurity = {
NGX_MODULE_V1,
&ngx_http_modsecurity_ctx, /* module context */
ngx_http_modsecurity_commands, /* module directives */
NGX_HTTP_MODULE, /* module type */
NULL, /* init master */
NULL, /* init module */
ngx_http_modsecurity_init_process, /* init process */
NULL, /* init thread */
NULL, /* exit thread */
ngx_http_modsecurity_terminate, /* exit process */
ngx_http_modsecurity_terminate, /* exit master */
NGX_MODULE_V1_PADDING
};

ngx_http_modsecurity

  其中,成员commands,赋值为 NGX_HTTP_MODULE

  结构体 ngx_http_modsecurity 是一切的开始。

3.2  关键的函数:

  ngx_http_modsecurity_config()// 初始化配置文件的入口。

  ngx_http_modsecurity_preconfiguration ()

      L----> modsecInit ()

  ngx_http_modsecurity_init ()

      L: phases[NGX_HTTP_PREACCESS_PHASE].handlers = ngx_http_modsecurity_handler

  参考:phases章节

Each HTTP request passes through a list of HTTP phases. Each phase is specialized in a particular type of processing. 
Most phases allow installing handlers. The phase handlers are called successively once the request reaches the phase.
Many standard nginx modules install their phase handlers as a way to get called at a specific request processing stage.

  在不同的阶段注册不同的回调函数, modsecurity 在 NGX_HTTP_PREACCESS_PHASE 阶段注册了函数 ngx_http_modsecurity_handler。

  ngx_http_modsecurity_handler()

    从注释看来,这里就是入口函数了:

/*
** [ENTRY POINT] does : this function called by nginx from the request handler
*/

  

3.3  关键函数

  modsecurity_process_phase()

  在apache2模块中,此函数基本上可以理解为是入口,与Eagle_eye中的使用,保持一致。

3.4  关键函数

  好多函数的实现,采用次方式:

int modsecProcessRequestHeaders(request_rec *r) {
return hookfn_post_read_request(r);
}

  这是一个宏,参考standalone/hooks.c

   可以发现 函数hookfn_post_read_request  等于 函数ap_hook_post_read_request()中第一个参数对其进行的赋值。

  格式为: hookfn%(NAME)  ==>  ap_hook%(NAME)

/home/tong/Src/thirdparty/github/ModSecurity [git::stable/cur *] [tong@T7] [:]
> grep -r ap_hook_post_read_request ./
./apache2/mod_security2.c: ap_hook_post_read_request(hook_request_early,

  也就是说  hookfn_post_read_request 等价于 apache2/mod_security2.c:hook_request_early

  从 nginx/modsecurity/config 的内容,也可以看见include了apache2的代码。

  至此,nginx模块的入口,也统一到了函数:

  modsecurity_process_phase()

3.5   API

  standalone/api.h

  apache2/mod_security2.c

[development][security][modsecurity][nginx] nginx / modsecurity development things的更多相关文章

  1. [security][modsecurity][nginx] nginx 与 modsecurity

    参考文档: https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#installation-for-nginx nginx不支 ...

  2. ModSecurity for Nginx

    Announcing the availability of ModSecurity extension for Nginx ModSecurity for Nginx ModSecurity for ...

  3. nginx配合modsecurity实现WAF功能

    一.准备工作 系统:centos 7.2 64位.nginx1.10.2, modsecurity2.9.1 owasp3.0 1.nginx:http://nginx.org/download/ng ...

  4. Centos7.4 modsecurity with nginx 安装

    1.准备: 系统环境:Centos7.4 软件及版本: nginx:OpenResty1.13.6.1 ModSecurity:ModSecurity v3.0.0rc1 (Linux) modsec ...

  5. ubuntu 重启 nginx 失败,* Restarting nginx nginx ...fail!

    ubuntu 重启 nginx 失败,* Restarting nginx nginx ...fail!       执行 nginx 重启服务时,提示失败如下: $ sudo service ngi ...

  6. 敏捷软件工程(agile software development) VS传统软件工程(traditional software development)

    敏捷软件工程(agile software development) VS传统软件工程(traditional software development)      Agile principle  ...

  7. nginx: [error] open() "/var/run/nginx/nginx.pid" failed (2: No such file or directory)

    在重启nginx服务的时候,出现了这个错误. [root@izuf68g6a94fj32w0afx00z etc]# nginx -c /var/run/nginx/nginx.pid nginx: ...

  8. nginx入门与实战 安装 启动 配置nginx Nginx状态信息(status)配置 正向代理 反向代理 nginx语法之location详解

    nginx入门与实战 网站服务 想必我们大多数人都是通过访问网站而开始接触互联网的吧.我们平时访问的网站服务 就是 Web 网络服务,一般是指允许用户通过浏览器访问到互联网中各种资源的服务. Web ...

  9. nginx: [error] invalid PID number "" in "/var/run/nginx/nginx.pid"

    一.出现这个的情况 解决方法一: 1.添加正在运行pid号到/var/run/nginx/nginx.pid就可以解决问题了(这个情况是在重启的情况下发现的) 2.如果是重启机器之后,系统有时会删掉/ ...

随机推荐

  1. SpringBoot打war包并部署到外部tomcat运行(jar工程改造为正war工程)

    如果你的SpringBoot工程是一个jar工程,而想把它改造成war工程,并打成war包放到外部的tomcat下运行,该怎么修改配置呢?这里以Maven工程为例进行介绍. (1)将pom.xml中的 ...

  2. ③NuPlayer播放框架之类NuPlayer源码分析

    [时间:2016-10] [状态:Open] [关键词:android,nuplayer,开源播放器,播放框架] 0 引言 差不多一个月了,继续分析AOSP的播放框架的源码.这次我们需要深入分析的是N ...

  3. LeetCode: Next Permutation 解题报告

    Next Permutation Implement next permutation, which rearranges numbers into the lexicographically nex ...

  4. linux下为目录和文件设置权限

    摘:linux下为目录和文件设置权限 分类: Linux2012-05-09 03:18 7456人阅读 评论(1) 收藏 举报 linuxwordpressweb数据库serverfile linu ...

  5. JVM 内部原理(六)— Java 字节码基础之一

    JVM 内部原理(六)- Java 字节码基础之一 介绍 版本:Java SE 7 为什么需要了解 Java 字节码? 无论你是一名 Java 开发者.架构师.CxO 还是智能手机的普通用户,Java ...

  6. 教程:Spagobi开源BI系统 Console报表设计教程

    Console Designer 1 Console Designer Console Designer 1.1 Introduction 1.2 Dataset Tab 1.3 Summary Pa ...

  7. 分发系统介绍 expect脚本远程登录 expect脚本远程执行命令 expect脚本传递参数

    expect脚本远程登录 yum install -y expect yum install -y tcl tclx tcl-devel 自动远程登录 #! /usr/bin/expect set h ...

  8. JS 使用html2canvas实现截图功能的问题记录和解决方案

    在实现“截图”功能时,遇到几个bug,研究了一个上午,终于全部解决了: 下面给大家分享下: 1."图片资源跨域",导致无法截图. 浏览器会提示下面的错误 DOMException: ...

  9. Spring.NET依赖注入框架学习--入门

    Spring.NET依赖注入框架学习--入门 在学些Spring.net框架之前,有必要先脑补一点知识,比如什么是依赖注入?IOC又是什么?控制反转又是什么意思?它们与Spring.net又有什么关系 ...

  10. 智能文件选择列表—— bat 批处理

    智能文件选择列表 *.wim @echo off setlocal enabledelayedexpansion title 智能文件选择列表 pushd %~dp0 & cd /d %~dp ...