OpenWAF nginx配置

2018-06-06 13:55 更新

名称

此文档将详细描述 OpenWAF 的 nginx 配置文件 /etc/ngx_openwaf.conf 中每一项配置

以及接入规则(access_rule)与 nginx 配置的关联

Table of Contents

nginx配置

  1. http {
  2. include /opt/OpenWAF/conf/twaf_main.conf; # 加载策略配置,规则,功能模块
  3. include /opt/OpenWAF/conf/twaf_api.conf; # api,动态配置接入规则,动态配置规则,动态配置策略,查看统计信息等
  4. upstream test {
  5. server 0.0.0.1; #just an invalid address as a place holder
  6. balancer_by_lua_file /opt/OpenWAF/app/twaf_balancer.lua;
  7. }
  8. server {
  9. listen 443 ssl;
  10. server_name _;
  11. ssl_certificate /opt/OpenWAF/conf/ssl/nginx.crt;
  12. ssl_certificate_key /opt/OpenWAF/conf/ssl/nginx.key;
  13. ssl_protocols TLSv1.1 TLSv1.2;
  14. include /opt/OpenWAF/conf/twaf_server.conf;
  15. ssl_certificate_by_lua_file /opt/OpenWAF/app/twaf_ssl_cert.lua;
  16. set $twaf_https 1;
  17. location / {
  18. proxy_pass $twaf_upstream_server;
  19. }
  20. }
  21. server {
  22. listen 80;
  23. server_name _;
  24. include /opt/OpenWAF/conf/twaf_server.conf;
  25. location / {
  26. proxy_pass $twaf_upstream_server;
  27. }
  28. }
  29. }

twaf_main

  1. #twaf_main.conf 文件
  2. #申请共享内存
  3. lua_shared_dict twaf_shm 50m;
  4. lua_shared_dict twaf_limit_conn 5m;
  5. lua_shared_dict twaf_reqstat 1m;
  6. lua_package_path "/opt/OpenWAF/?.lua;;"; #指定 OpenWAF 安装路径
  7. init_by_lua_file /opt/OpenWAF/app/twaf_init.lua; #加载策略配置,加载特征规则,加载功能模块

若想添加新的共享内存,在 twaf_main.conf 中添加,如:lua_shared_dict twaf_test 1m;

twaf_init

  1. -- twaf_init.lua 文件
  2. require "resty.core"
  3. --加载静态配置
  4. local twaf_config_m = require "lib.twaf.twaf_conf"
  5. local twaf_config = twaf_config_m:new()
  6. twaf_config:load_default_config("/opt/OpenWAF/conf/twaf_default_conf.json") -- 加载缺省策略
  7. twaf_config:load_access_rule("/opt/OpenWAF/conf/twaf_access_rule.json") -- 加载接入规则
  8. twaf_config:load_policy_config("/opt/OpenWAF/conf", {twaf_policy_conf = 1}) -- 加载策略,想扩展策略,可在此加载新的策略
  9. twaf_config:load_rules() -- 加载规则
  10. -- GeoIP ,想扩展城市级别GEOIP,可在此扩展
  11. twaf_config:load_geoip_country_ipv4("/opt/OpenWAF/lib/twaf/inc/knowledge_db/geo_country/GeoIP.dat") -- 加载国家级别 GeoIPv4
  12. twaf_config:load_geoip_country_ipv6("/opt/OpenWAF/lib/twaf/inc/knowledge_db/geo_country/GeoIPv6.dat") -- 加载国家级别 GEOIPv6
  13. -- 加载 OpenWAF 自带的统计模块
  14. local twaf_reqstat_m = require "lib.twaf.twaf_reqstat"
  15. twaf_reqstat = twaf_reqstat_m:new(twaf_config.twaf_default_conf.twaf_reqstat, twaf_config.twaf_policy.policy_uuids)
  16. local twaf_lib = require "lib.twaf.twaf_core"
  17. twaf = twaf_lib:new(twaf_config)
  18. --加载各功能模块
  19. local default_init_register = twaf:get_default_config_param("init_register")
  20. twaf:register_modules(default_init_register)

添加新的策略,在 twaf_init.lua 中加载

  1. 1. 添加 /opt/OpenWAF/conf 目录下,policy1.json policy2.json 策略
  2. twaf_config:load_policy_config("/opt/OpenWAF/conf", {policy1 = 1, policy2 = 1})
  3. 2. 添加 /etc/a/policy1.json 策略和 /etc/b/policy2.json 策略
  4. twaf_config:load_policy_config("/etc/a", {policy1 = 1})
  5. twaf_config:load_policy_config("/etc/b", {policy2 = 1})

twaf_api

  1. server {
  2. listen 127.0.0.1:61111; #监听地址
  3. server_name nosuchdomain;
  4. access_log off;
  5. location / {
  6. stub_status on;
  7. allow 127.0.0.0/8;
  8. deny all;
  9. }
  10. location /api {
  11. content_by_lua_file /opt/OpenWAF/app/twaf_api.lua; #api,动态配置接入规则,动态配置规则,动态配置策略,查看统计信息等
  12. allow 127.0.0.0/8;
  13. deny all;
  14. }
  15. }

如查看全局统计信息: 'curl http://127.0.0.1:61111/api/stat'

更多信息,请详看 twaf_api 模块

twaf_server

  1. #twaf_server.conf
  2. rewrite_by_lua_file /opt/OpenWAF/app/twaf_rewrite.lua; # rewrite 阶段有接入规则模块
  3. access_by_lua_file /opt/OpenWAF/app/twaf_access.lua; # 处理请求头,请求体阶段,主要的安全防护功能都在 access 阶段处理
  4. header_filter_by_lua_file /opt/OpenWAF/app/twaf_header_filter.lua; # 处理响应头阶段
  5. body_filter_by_lua_file /opt/OpenWAF/app/twaf_body_filter.lua; # 处理响应体阶段
  6. log_by_lua_file /opt/OpenWAF/app/twaf_log.lua; # log 阶段有日志模块和统计模块
  7. set $twaf_upstream_server "";
  8. set $twaf_attack_info "";
  9. set $twaf_cache_flag 1;

twaf_access_rule

twaf_access_rule 涉及 ssl_certificate_by_lua , rewrite_by_lua 和 balancer_by_lua 三个阶段

  1. {
  2. "twaf_access_rule": [
  3. "rules": [ -- 注意先后顺序
  4. {
  5. "ngx_ssl": false, -- nginx 认证的开关
  6. "ngx_ssl_cert": "path", -- nginx 认证所需 PEM 证书地址
  7. "ngx_ssl_key": "path", -- nginx 认证所需 PEM 私钥地址
  8. "host": "www.baidu.com", -- 域名,正则匹配
  9. "path": "/", -- 路径,正则匹配
  10. "port": 80, -- 端口,默认 80
  11. "server_ssl": false, -- 后端服务器 ssl 开关
  12. "forward": "server_5", -- 后端服务器 upstream 名称
  13. "forward_addr": "1.1.1.2", -- 后端服务器ip地址
  14. "forward_port": "8080", -- 后端服务器端口号(缺省80
  15. "uuid": "access_567b067ff2060", -- 用来标记此规则的 uuidapi 中会用到,要保证全局唯一
  16. "policy": "policy_uuid" -- 安全策略 ID
  17. }
  18. ]
  19. }
  20. }

ssl_certificate_by_lua

ssl_certificate_by_lua 阶段用于 ssl 认证,涉及到 access_rule 配置的有 ngx_ssl,ngx_ssl_cert 和 ngx_ssl_key

这部分配置可以节省 nginx 中 ssl 配置的重复性,如:

  1. server {
  2. listen 443 ssl;
  3. server_name www.abc.com;
  4. ssl_certificate /opt/OpenWAF/conf/ssl/abc.crt;
  5. ssl_certificate_key /opt/OpenWAF/conf/ssl/abc.key;
  6. ssl_protocols TLSv1.1 TLSv1.2;
  7. location / {
  8. ...
  9. }
  10. }
  11. server {
  12. listen 443 ssl;
  13. server_name www.xyz.com;
  14. ssl_certificate /opt/OpenWAF/conf/ssl/xyz.crt;
  15. ssl_certificate_key /opt/OpenWAF/conf/ssl/xyz.key;
  16. ssl_protocols TLSv1.1 TLSv1.2;
  17. location / {
  18. ...
  19. }
  20. }
  21. ...

原始 nginx 配置如上,那么加上 WAF 防护,且经过 access_rule 的优化后,可写为:

  1. server {
  2. listen 443 ssl;
  3. server_name _;
  4. ssl_certificate /opt/OpenWAF/conf/ssl/nginx.crt;
  5. ssl_certificate_key /opt/OpenWAF/conf/ssl/nginx.key;
  6. ssl_protocols TLSv1.1 TLSv1.2;
  7. include /opt/OpenWAF/conf/twaf_server.conf; #添加 WAF 防护
  8. ssl_certificate_by_lua_file /opt/OpenWAF/app/twaf_ssl_cert.lua; #动态指定 SSL 证书
  9. set $twaf_https 1;
  10. location / {
  11. ...
  12. }
  13. }

此时只需在 access_rule 中指定 SSL 证书即可,如:

  1. {
  2. "twaf_access_rule": [
  3. "rules": [
  4. {
  5. "ngx_ssl": true,
  6. "ngx_ssl_cert": "opt/OpenWAF/conf/ssl/abc.crt",
  7. "ngx_ssl_key": "/opt/OpenWAF/conf/ssl/abc.key",
  8. "host": "www.abc.com",
  9. "path": "/",
  10. "port": 443,
  11. ...
  12. },
  13. {
  14. "ngx_ssl": true,
  15. "ngx_ssl_cert": "opt/OpenWAF/conf/ssl/xyz.crt",
  16. "ngx_ssl_key": "/opt/OpenWAF/conf/ssl/xyz.key",
  17. "host": "www.xyz.com",
  18. "path": "/",
  19. "port": 443,
  20. ...
  21. }
  22. ]
  23. }
  24. }

如此,多个 ssl 站点,也可用 access_rule 实现动态分配 SSL 证书,不需变更 nginx 配置

rewrite_by_lua

rewrite_by_lua 阶段,会依据请求头中的 host,port,uri 等信息,确认后端服务器地址及选用的策略

下面详细讨论 nginx 配置是如何转到 access_rule 中配置的

  1. upstream aaa {
  2. server 1.1.1.1;
  3. }
  4. server {
  5. listen 80;
  6. server_name www.aaa.com;
  7. location / {
  8. proxy_pass http://aaa;
  9. }
  10. }

上面 nginx 配置,加上 OpenWAF 防御后,对应 nginx 配置如下:

  1. upstream test {
  2. server 0.0.0.1; #just an invalid address as a place holder
  3. balancer_by_lua_file /opt/OpenWAF/app/twaf_balancer.lua;
  4. }
  5. server {
  6. listen 80;
  7. server_name _;
  8. include /opt/OpenWAF/conf/twaf_server.conf;
  9. location / {
  10. proxy_pass $twaf_upstream_server;
  11. }
  12. }

对应 access_rule 配置如下:

  1. {
  2. "twaf_access_rule": [
  3. "rules": [
  4. {
  5. "host": "www.aaa.com",
  6. "path": "/",
  7. "port": 80,
  8. "forward": "test",
  9. "forward_addr": "1.1.1.1",
  10. "forward_port": 80
  11. ...
  12. }
  13. ]
  14. }
  15. }

其中 forward 是为 nginx 配置中的 $twaf_upstream_server 变量赋值
forward_addr 和 forward_port 只在 upstream 中使用 balancer_by_lua 才会生效,否则不需配置这两个值

前面 ssl_certificate_by_lua 的配置,节省了因 ssl 证书配置使得一个 ssl 站点对应一个 nginx 的 server 配置的重复性

这部分 rewrite_by_lua 的配置同样可以节省 nginx 中配置的重复性,如:

  1. upstream aaa_1 {
  2. server 1.1.1.1;
  3. }
  4. upstream_aaa_2 {
  5. server 1.1.1.2;
  6. }
  7. upstream bbb {
  8. server 2.2.2.2:8000;
  9. }
  10. server {
  11. listen 80;
  12. server_name www.aaa.com;
  13. location / {
  14. proxy_pass http://aaa_1;
  15. }
  16. location /a {
  17. proxy_pass http://aaa_2;
  18. }
  19. }
  20. server {
  21. listen 90;
  22. server_name www.bbb.com;
  23. location / {
  24. proxy_pass http://bbb;
  25. }
  26. }
  27. ...

上面 nginx 配置,加上 OpenWAF 防御后,对应 nginx 配置如下:

  1. upstream test {
  2. server 0.0.0.1; #just an invalid address as a place holder
  3. balancer_by_lua_file /opt/OpenWAF/app/twaf_balancer.lua;
  4. }
  5. server {
  6. listen 80;
  7. listen 90;
  8. server_name _;
  9. include /opt/OpenWAF/conf/twaf_server.conf;
  10. location / {
  11. proxy_pass $twaf_upstream_server;
  12. }
  13. }

对应 access_rule 配置如下:

  1. {
  2. "twaf_access_rule": [
  3. "rules": [
  4. {
  5. "host": "www.aaa.com",
  6. "path": "/a",
  7. "port": 80,
  8. "forward": "test",
  9. "forward_addr": "1.1.1.2",
  10. "forward_port": 80
  11. ...
  12. },
  13. {
  14. "host": "www.aaa.com",
  15. "path": "/",
  16. "port": 80,
  17. "forward": "test",
  18. "forward_addr": "1.1.1.1",
  19. "forward_port": 80
  20. ...
  21. },
  22. {
  23. "host": "www.bbb.com",
  24. "path": "/",
  25. "port": 90,
  26. "forward": "test",
  27. "forward_addr": "2.2.2.2",
  28. "forward_port": 8000
  29. ...
  30. }
  31. ]
  32. }
  33. }

从以上配置可以看出,access_rule 节省了因域名,监听端口,路径,upstream 等因素造成的配置复杂性

而且,以后可通过 api,动态添加接入规则,不需中断业务,而修改 nginx 配置,可能会中断业务

注意:在上例中,www.aaa.com 站点下,有 '/' 和 '/a' 两个路径,access_rule 是数组,因此,要将有关 '/a' 的配置放在 '/' 前

本地资源配置:

  1. upstream test {
  2. server 0.0.0.1; #just an invalid address as a place holder
  3. balancer_by_lua_file /opt/OpenWAF/app/twaf_balancer.lua;
  4. }
  5. server {
  6. listen 80;
  7. server_name www.aaa.com;
  8. include /opt/OpenWAF/conf/twaf_server.conf;
  9. location / {
  10. proxy_pass $twaf_upstream_server;
  11. }
  12. location /a { #本地资源
  13. root /xxx;
  14. index xxx;
  15. }
  16. }

对应 access_rule 配置如下:

  1. {
  2. "twaf_access_rule": [
  3. "rules": [
  4. {
  5. "host": "www.aaa.com",
  6. "path": "/",
  7. "port": 80,
  8. "forward": "test",
  9. "forward_addr": "1.1.1.1",
  10. "forward_port": 80
  11. ...
  12. }
  13. ]
  14. }
  15. }

这里可以看到,仅仅是配置了根目录的接入规则,并不需单独为 '/a' 进行配置

因为访问 www.aaa.com/a 目录下资源,已经匹配中了这条接入规则,但对应的 nginx 配置中并没有 proxy_pass,
因此 forward ,forward_addr 和 forward_port 三个参数并不会生效

当然如果你很任性,非要添加有关 '/a' 目录的接入规则,则配置如下:

  1. {
  2. "twaf_access_rule": [
  3. "rules": [
  4. {
  5. "host": "www.aaa.com",
  6. "path": "/a",
  7. "port": 80,
  8. ...
  9. },
  10. {
  11. "host": "www.aaa.com",
  12. "path": "/",
  13. "port": 80,
  14. "forward": "test",
  15. "forward_addr": "1.1.1.1",
  16. "forward_port": 80
  17. ...
  18. }
  19. ]
  20. }
  21. }

从上面配置看出,因为 forward ,forward_addr 和 forward_port 三个参数并不会生效,所以无需配置

access_rule 中还剩最后两个参数,uuid 和 policy
uuid: 用来标记接入规则的 uuid,api 中会用到,要保证全局唯一
policy: 指定策略名称,OpenWAF 自带策略有 twaf_default_conf 和 twaf_policy_conf,若不配置 policy,缺省使用 twaf_default_conf 策略

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号