• waf之ModSecurity


    参考网站 ModSecurity中文社区

    Github GitHub - SpiderLabs/ModSecurity: ModSecurity is an open source, cross platform web application firewall (WAF) engine for Apache, IIS and Nginx that is developed by Trustwave's SpiderLabs. It has a robust event-based programming language which provides protection from a range of attacks against web applications and allows for HTTP traffic monitoring, logging and real-time analysis. With over 10,000 deployments world-wide, ModSecurity is the most widely deployed WAF in existence. 

    实验环境

    环境:centos8

    waf: ModSecurity

    web: nginx

    操作:

    1. 基础环境安装

    dnf install git wget epel-release -y

    2. 增加powertools 安装源

    1. [root@localhost ~]# cat /etc/yum.repos.d/powertools.repo 
    2. [powertools]
    3. name=Extra Packages for Enterprise Linux $releasever - $basearch
    4. baseurl=https://mirrors.aliyun.com/centos/8/PowerTools/x86_64/os/
    5. enabled=1
    6. gpgcheck=0

    3.安装依赖包

    dnf install -y gcc-c++ flex bison yajl yajl-devel curl-devel curl GeoIP-devel doxygen zlib-devel pcre-devel lmdb-devel libxml2-devel ssdeep-devel lua-devel libtool autoconf automake make openssl-devel gd-devel

    4.下载ModSecurity源码,并编译安装

    1. git clone --depth 1 -b v3/master --single-branch 
    2.  
    3. cd ModSecurity
    4. git submodule init
    5. git submodule update
    6. sh build.sh
    7. ./configure  --with-lmdb
    8. make -j 4 
    9. make install

    5.安装 nginx 连接器

    1. cd /usr/local
    2. git clone --depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git

    6.编译安装NGINX

    1. wget http://nginx.org/download/nginx-1.18.0.tar.gz
    2. tar xvf nginx-1.18.0.tar.gz
    3. cd nginx-1.18.0
    1. ./configure \
    2. --prefix=/usr/local/nginx \
    3. --with-http_ssl_module \
    4. --with-http_flv_module \
    5. --with-http_stub_status_module \
    6. --with-http_gzip_static_module \
    7. --with-pcre \
    8. --with-file-aio \
    9. --with-http_secure_link_module \
    10. --with-compat \
    11. --with-http_addition_module \
    12. --with-http_auth_request_module \
    13. --with-http_dav_module \
    14. --with-http_random_index_module \
    15. --with-http_realip_module \
    16. --with-http_v2_module \
    17. --with-stream \
    18. --with-stream_ssl_module \
    19. --with-stream_ssl_preread_module \
    20. --with-http_image_filter_module \
    21. --with-http_gunzip_module \
    22. --with-http_sub_module \
    23. --with-http_mp4_module \
    24. --with-ld-opt=-Wl,-E \
    25. --with-cc-opt=-Wno-error \
    26. --add-module=/usr/local/ModSecurity-nginx
    27. make -j 4
    28. make install
     
    

    7.配置modsecurity

    1. mkdir /usr/local/nginx/conf/modsecurity
    2. cp /usr/local/ModSecurity/modsecurity.conf-recommended /usr/local/nginx/conf/modsecurity/modsecurity.conf
    3. cp  /usr/local/ModSecurity/unicode.mapping /usr/local/nginx/conf/modsecurity/
    1. #下载modsecurity核心拦截规则,并对其配置文件进行配置(ps.是从owasp中发布的进行下载)
    2. #git clone https://github.com/coreruleset/coreruleset.git
    3. wget https://github.com/coreruleset/coreruleset/archive/v3.3.0.tar.gz
    4. tar xvf v3.3.0.tar.gz 
    5. cd coreruleset-3.3.0/
    6. cp -a rules /usr/local/nginx/conf/modsecurity/
    7. cp crs-setup.conf.example /usr/local/nginx/conf/modsecurity/crs-setup.conf
    1. cd /usr/local/nginx/conf/modsecurity/rules/
    2. #可将自己写的规则放置于此两个文件中
    3. mv REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf
    4. mv RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf.example RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf

    8.编辑NGINX 配置

    1. 在http或server节点中添加以下内容(在http节点添加表示全局配置,在server节点添加表示为指定网站配置):
    2. vim /usr/local/nginx/conf/nginx.conf
    3. modsecurity on;
    4. modsecurity_rules_file /usr/local/nginx/conf/modsecurity/modsecurity.conf;
    5. #  编辑modsecurity.conf
    6. vim /usr/local/nginx/conf/modsecurity/modsecurity.conf
    7. SecRuleEngine DetectionOnly改为SecRuleEngine On
    8. 同时添加以下内容:
    9. Include /usr/local/nginx/conf/modsecurity/crs-setup.conf
    10. Include /usr/local/nginx/conf/modsecurity/rules/*.conf
    1. #重载配置文件
    2. /usr/local/nginx/sbin/nginx -s reload

    9.配置拦截国外ip

    1. 安装geoip,拦截国外ip 
    2. 下载geoip 库 https://www.maxmind.com/en/accounts/387514/geoip/downloads
    3. mkdir -pv /usr/local/GeoIP/
    4. cp GeoLite2-Country_20200915/GeoLite2-Country.mmdb /usr/local/GeoIP/
    5. 在 /usr/local/nginx/conf/modsecurity/crs-setup.conf 添加下面配置
    6. SecGeoLookupDB /usr/local/GeoIP/GeoLite2-Country.mmdb
    1. 配置规则
    2. vim /usr/local/nginx/conf/modsecurity/rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf
    3. 将以下规则,复制到文件中,规则id如与自己编写的规则ID冲突,直接更改即可:
    4. SecRule REMOTE_ADDR "@geoLookup" "chain,id:22,deny,phase:1,log,msg:'Non-China IP address'"
    5. SecRule GEO:COUNTRY_CODE "!@rx CN|HK|TW|MO"
    6. 上规则表示,仅允许中国的IP地址进行访问,其他国家的IP地址若访问网站,则直接阻断。
    7. 之所以同时使用CN、HK、TW、MO,是因为在ISO 3166-1标准中,CN仅代表中国内地,不包含港澳台,因此在此直接将港澳台的代码添加其中,如果只希望中国内地的IP地址进行访问,复制以下规则即可:
    8. SecRule REMOTE_ADDR "@geoLookup" "chain,id:22,deny,phase:1,log,msg:'Non-CN IP address'"
    9. SecRule GEO:COUNTRY_CODE "!@rx CN"
    10. SecMarker "END-BEFORE-RULE-EXCLUSIONS"

    10.防CC攻击、防采集规则配置【apache 建议使用】

    1. 在crs-setup.conf文件中,找到ID为900260、900700的两条规则,并取消注释:
    2. http://www.modsecurity.cn/practice/post/16.html

    nginx 通过自带的limit 模块进行限制】

    1. http://nginx.org/en/docs/http/ngx_http_limit_req_module.html
    2. limit_req_zone  $binary_remote_addr  zone=one:10m   rate=1r/s;
    3. 可以放到http 里面
    4. 第一个参数:$binary_remote_addr 表示通过remote_addr这个标识来做限制,“binary_”的目的是缩写内存占用量;
    5. 第二个参数:zone=one:10m表示生成一个大小为10M,名字为one的内存区域,用来存储访问的频次信息
    6. 第三个参数:rate=1r/s表示允许相同标识的客户端的访问频次,这里限制的是每秒1次,还可以有比如30r/m
    7. limit_req   zone=one  burst=5  nodelay;
    8. 可以放到 Server里面
    9. 第一个参数:zone=one 设置使用哪个配置区域来做限制,与上面limit_req_zone 里的name对应
    10. 第二个参数:burst=5,重点说明一下这个配置,burst爆发的意思,这个配置的意思是设置一个大小为5的缓冲区
    11. 当有大量请求(爆发)过来时,超过了访问频次限制的请求可以先放到这个缓冲区内
    12. 第三个参数:nodelay,如果设置,超过访问频次而且缓冲区也满了的时候就会直接返回503

    【自动跳转拦截页面 仅支持Self-contained 模式】

    1. crs-setup.conf
    2. SecDefaultAction "phase:1,log,auditlog,redirect:'http://%{request_headers.host}/',tag:'Host: %{request_headers.host}'"
    3. SecDefaultAction "phase:2,log,auditlog,redirect:'http://%{request_headers.host}/',tag:'Host: %{request_headers.host}'"

    # 默认是异常平分模式,下面命令可以修改为 独立控制模式:

    1. sed -ie 's/SecDefaultAction "phase:1,log,auditlog,pass"/#SecDefaultAction "phase:1,log,auditlog,pass"/g' crs-setup.conf
    2. sed -ie 's/SecDefaultAction "phase:2,log,auditlog,pass"/#SecDefaultAction "phase:2,log,auditlog,pass"/g' crs-setup.conf
    3. sed -ie 's/#.*SecDefaultAction "phase:1,log,auditlog,deny,status:403"/SecDefaultAction "phase:1,log,auditlog,deny,status:403"/g' crs-setup.conf
    4. sed -ie 's/# SecDefaultAction "phase:2,log,auditlog,deny,status:403"/SecDefaultAction "phase:2,log,auditlog,deny,status:403"/g' crs-setup.conf

    nginxwaf.service

    1. [Unit]
    2. Description=The nginxwaf HTTP and reverse proxy server
    3. After=network.target remote-fs.target nss-lookup.target
    4. [Service]
    5. Type=forking
    6. PIDFile=/run/nginxwaf.pid
    7. # Nginx will fail to start if /run/nginx.pid already exists but has the wrong
    8. # SELinux context. This might happen when running `nginx -t` from the cmdline.
    9. # https://bugzilla.redhat.com/show_bug.cgi?id=1268621
    10. ExecStartPre=/usr/bin/rm -f /run/nginxwaf.pid
    11. ExecStartPre=/usr/local/nginx/sbin/nginx -t
    12. ExecStart=/usr/local/nginx/sbin/nginx
    13. ExecReload=/bin/kill -s HUP $MAINPID
    14. KillSignal=SIGQUIT
    15. TimeoutStopSec=5
    16. KillMode=mixed
    17. PrivateTmp=true
    18. [Install]
    19. WantedBy=multi-user.target

  • 相关阅读:
    Linux 用户注意!GNOME 45 将影响所有扩展!
    android 记录Activity和Fragment生命周期顺序
    k8s-7部署kube-state-metrics监控组件
    基于SSM的在线房屋租赁和电子签约系统的设计与实现
    SQL语句性能优化
    JVM中jhat虚拟机堆转储快照分析工具
    BM23 二叉树的前序遍历
    Visual Studio无法调试特定的ASP.Net项目
    autoware.ai感知随笔--地面滤波
    【实测】python模拟jenkins的定时设置时间库:------------------【 python_jenkins_monitor 】
  • 原文地址:https://blog.csdn.net/ly1358152944/article/details/126448260