[development][security][modsecurity][nginx] nginx / modsecurity development things
接续前节:[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的更多相关文章
- [security][modsecurity][nginx] nginx 与 modsecurity
参考文档: https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#installation-for-nginx nginx不支 ...
- ModSecurity for Nginx
Announcing the availability of ModSecurity extension for Nginx ModSecurity for Nginx ModSecurity for ...
- nginx配合modsecurity实现WAF功能
一.准备工作 系统:centos 7.2 64位.nginx1.10.2, modsecurity2.9.1 owasp3.0 1.nginx:http://nginx.org/download/ng ...
- Centos7.4 modsecurity with nginx 安装
1.准备: 系统环境:Centos7.4 软件及版本: nginx:OpenResty1.13.6.1 ModSecurity:ModSecurity v3.0.0rc1 (Linux) modsec ...
- ubuntu 重启 nginx 失败,* Restarting nginx nginx ...fail!
ubuntu 重启 nginx 失败,* Restarting nginx nginx ...fail! 执行 nginx 重启服务时,提示失败如下: $ sudo service ngi ...
- 敏捷软件工程(agile software development) VS传统软件工程(traditional software development)
敏捷软件工程(agile software development) VS传统软件工程(traditional software development) Agile principle ...
- 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: ...
- nginx入门与实战 安装 启动 配置nginx Nginx状态信息(status)配置 正向代理 反向代理 nginx语法之location详解
nginx入门与实战 网站服务 想必我们大多数人都是通过访问网站而开始接触互联网的吧.我们平时访问的网站服务 就是 Web 网络服务,一般是指允许用户通过浏览器访问到互联网中各种资源的服务. Web ...
- nginx: [error] invalid PID number "" in "/var/run/nginx/nginx.pid"
一.出现这个的情况 解决方法一: 1.添加正在运行pid号到/var/run/nginx/nginx.pid就可以解决问题了(这个情况是在重启的情况下发现的) 2.如果是重启机器之后,系统有时会删掉/ ...
随机推荐
- 物联网架构成长之路(14)-SpringBoot整合thymeleaf
使用thymeleaf作为模版进行测试 在pom.xml 增加依赖 <dependency> <groupId>org.springframework.boot</gro ...
- GNU make使用(二)
[时间:2017-06] [状态:Open] [关键词:makefile,gcc,编译,shell命令,目标文件] 0 引言及目标 之前使用Makefile都是把源文件和目标文件放到同一个目录编译.近 ...
- 【Ubuntu】PHP环境安装-phpstudy for linux版
安装: wget -c http://lamp.phpstudy.net/phpstudy.bin chmod +x phpstudy.bin #权限设置sudo ./phpstudy.bin ...
- 4. OpenAI GPT算法原理解析
1. 语言模型 2. Attention Is All You Need(Transformer)算法原理解析 3. ELMo算法原理解析 4. OpenAI GPT算法原理解析 5. BERT算法原 ...
- Java知多少(10)数据类型及变量
Java 是一种“强类型”的语言,声明变量时必须指明数据类型.变量(variable)占据一定的内存空间.不同类型的变量占据不同的大小. Java中共有8种基本数据类型,包括4 种整型.2 种浮点型. ...
- JavaScript高级用法二之内置对象
综述 本篇的主要内容来自慕课网,内置对象,主要内容如下 1 什么是对象 2 Date 日期对象 3 返回/设置年份方法 4 返回星期方法 5 返回/设置时间方法 6 String 字符串对象 7 返回 ...
- pip install psutil出错-You are using pip version 10.0.1, however version 18.0 is available.
今天想用python代替shell做运维相关的事,写代码都是在本机,调试在服务器上 C:\Users\0>pip install psutilRequirement already satisf ...
- WebSphere集群环境修改IHS端口号的方法 分类: WebSphere 2015-08-06 13:41 14人阅读 评论(0) 收藏
参考资料:http://wenku.baidu.com/link?url=E9BkuEjJ16i9lg7l91L0-xhKCYkHV0mAnlwAeSlDCFM4TjZyk4ZVxmUu64BGd4F ...
- plsql与64位的Oracle关联方法
在这里吐槽一下,plsql居然木有64位的,以前居然不知道,好久没用Oracle了,想练习一下,方法如下: 1.安装Oracle,官网都有,这里不细说了,我选的是64的Oracle安装的. 2.下载p ...
- [Laravel] 12 - WEB API : cache implement
前言 Ref: https://www.imooc.com/video/2873 服务端如何为客户端(app)的首页提供数据接口, 本篇用此作为例子演示接口的实现. 单例模式 一.三大原则 单例实现 ...