IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    openresty+lua实现WAF应用防火墙

    C1G发表于 2022-02-24 07:46:04
    love 0

    1.#基础包安装

    yum -y install readline-devel pcre-devel zlib zlib-devel gcc

    2.升级openssl

    #yum -y openssl-devel

    openssl version
    OpenSSL 1.0.1e-fips 11 Feb 2013

    wget –no-check-certificate https://www.openssl.org/source/openssl-1.1.1l.tar.gz
    tar -zxvf openssl-1.1.1l.tar.gz
    cd openssl-1.1.1l
    ./config shared zlib
    make && make install

    #ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key

    备份当前Openssl
    mv /usr/bin/openssl /usr/bin/openssl.old
    mv /usr/lib64/openssl /usr/lib64/openssl.old

    使用新版Openssl
    ln -s /usr/local/bin/openssl /usr/bin/openssl
    ln -s /usr/local/include/openssl/ /usr/include/openssl
    ln -s /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1
    ln -s /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1

    更新动态链接库数据
    echo “/usr/local/lib/” >> /etc/ld.so.conf
    ldconfig

    openssl version
    openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory
    ln -s /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1
    ln -s /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1

    openssl version
    OpenSSL 1.1.1l 24 Aug 2021

    3.安装pcre

    pcre没找到,编辑时加上–with-pcre=../pcre-8.30 \
    0.10/src/ngx_stream_lua_regex.c:205: undefined reference to `pcre_jit_stack_alloc’
    collect2: ld returned 1 exit status

    #wget -nv http://downloads.sourceforge.net/project/pcre/pcre/8.30/pcre-8.30.tar.gz -O pcre-8.30.tar.gz

    wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.30.tar.gz
    tar xzvf pcre-8.30.tar.gz
    cd pcre-8.30
    ./configure –enable-utf8 –enable-unicode-properties
    make
    make install
    ln -s /lib64/libpcre.so.0.0.1 /lib64/libpcre.so.1

    4.下载ngx_cache_purge清缓组件

    wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz
    tar zxvf ngx_cache_purge-2.3.tar.gz

    5.安装openresty

    wget https://openresty.org/download/openresty-1.19.9.1.tar.gz
    tar zxvf openresty-1.19.9.1.tar.gz
    cd openresty-1.19.9.1

    伪装openresty为xcdn
    sed -i ‘s/”openresty/”xcdn/g’ bundle/nginx-1.19.9/src/core/nginx.h
    sed -i “s#Server: openresty#Server: xcdn#” bundle/nginx-1.19.9/src/http/ngx_http_header_filter_module.c
    sed -i “s#\”


    openresty<\/center>\”#\”


    xcdn<\/center>\”#” bundle/nginx-1.19.9/src//http/ngx_http_special_response.c

    ./configure –user=www –group=website –prefix=/opt/openresty-1.19.9.1 \
    –with-http_ssl_module –with-http_v2_module –with-http_realip_module –with-http_addition_module \
    –with-http_geoip_module \
    –with-http_gzip_static_module \
    –with-http_auth_request_module \
    –with-http_secure_link_module \
    –with-http_degradation_module \
    –with-http_stub_status_module \
    –add-module=../ngx_cache_purge-2.3 \
    –with-pcre=../pcre-8.30 \
    –with-cc-opt=”-I /usr/local/include/openssl/ ” \
    –with-ld-opt=”-L/usr/local/lib64″

    gmake
    gmake install

    复制原配置文件
    cd /opt/nginx/conf/
    cp -ar ssl webip.conf geo.*.conf GeoIP.dat manageip.conf fcgi.conf htpasswd nginx.conf /opt/openresty-1.19.9.1/nginx/conf/

    4.下载和配置 ngx_lua_waf

    nginx下常见的开源 waf 有 mod_security、naxsi、ngx_lua_waf 这三个,ngx_lua_waf 性能高和易用性强,基本上零配置,而且常见的攻击类型都能防御,是比较省心的选择。

    其git 地址为 https://github.com/loveshell/ngx_lua_waf
    wget --no-check-certificate https://github.com/loveshell/ngx_lua_waf/archive/master.zip
    unzip master.zip
    mv ngx_lua_waf-master /opt/openresty-1.19.9.1/nginx/conf/waf
    chown -R www:website /opt/openresty-1.19.9.1/nginx/conf
    chown -R www:website /opt/openresty-1.19.9.1/nginx/logs
    chmod 775 /opt/openresty-1.19.9.1/nginx/conf
    chmod 775 /opt/openresty-1.19.9.1/nginx/conf/waf
    chmod 775 /opt/openresty-1.19.9.1/nginx/conf/waf/wafconf
    chmod 664 /opt/openresty-1.19.9.1/nginx/conf/.

    mkdir -p /opt/openresty-1.19.9.1/nginx/logs/hack
    chown www:website /opt/openresty-1.19.9.1/nginx/logs/hack
    chmod -R 775 /opt/openresty-1.19.9.1/nginx/logs/hack

    测试配置文件
    /opt/openresty-1.19.9.1/nginx/sbin/nginx -t

    注意和tengine的不兼容配置
    注释掉server_info和#server_tag
    [emerg] unknown directive “server_info” in /opt/openresty-1.19.9.1/nginx/conf/nginx.conf:49

    #server_info off;

    #server_tag off;

    在http段增加清除server头
    more_clear_headers "Server";

    去除dso段

    limit_req_zone 不支持多个key
    ginx: [emerg] invalid number of arguments in “limit_req_zone” directive in /opt/openresty-1.19.9.1/nginx/conf/nginx.conf:90

    #limit_req_zone $binary_remote_addr $uri zone=two:30m rate=20r/s;

    5.配置ngx_lua_waf

    https://github.com/loveshell/ngx_lua_waf在nginx.conf的http段添加

    lua_package_path "/opt/openresty-1.19.9.1/lualib/?.lua;/opt/nginx/conf/waf/?.lua";
    lua_shared_dict limit 10m;
    init_by_lua_file  /opt/openresty-1.19.9.1/nginx/conf/waf/init.lua; 
    access_by_lua_file /opt/openresty-1.19.9.1/nginx/conf/waf/waf.lua;

    配置config.lua里的waf规则目录(一般在waf/conf/目录下)

    RulePath = "/opt/nginx/conf/waf/wafconf/"

    然后重启nginx即可
    部署完毕可以尝试如下命令:

    curl http://xxxx/test.php?id=../etc/passwd
    日志文件名称格式如下:虚拟主机名_sec.log

    配置时一些错误
    nginx: [alert] failed to load the ‘resty.core’ module (https://github.com/openresty/lua-resty-core); ensure you are using an OpenResty release from https://openresty.org/en/download.html (reason: module ‘resty.core’ not found:
    no field package.preload[‘resty.core’]
    no file ‘/opt/nginx/conf/waf/resty/core.lua’
    no file ‘/opt/openresty-1.19.9.1/lualib/resty/resty/core.lua’
    no file ‘/opt/openresty-1.19.9.1/site/lualib/resty/core.so’
    no file ‘/opt/openresty-1.19.9.1/lualib/resty/core.so’
    no file ‘./resty/core.so’
    no file ‘/usr/local/lib/lua/5.1/resty/core.so’
    no file ‘/opt/openresty-1.19.9.1/luajit/lib/lua/5.1/resty/core.so’
    no file ‘/usr/local/lib/lua/5.1/loadall.so’
    no file ‘/opt/openresty-1.19.9.1/site/lualib/resty.so’
    no file ‘/opt/openresty-1.19.9.1/lualib/resty.so’
    no file ‘./resty.so’
    no file ‘/usr/local/lib/lua/5.1/resty.so’
    no file ‘/opt/openresty-1.19.9.1/luajit/lib/lua/5.1/resty.so’
    no file ‘/usr/local/lib/lua/5.1/loadall.so’) in /opt/openresty-1.19.9.1/nginx/conf/nginx.conf:214

    将/opt/openresty-1.19.9.1/lualib/?.lua; 加进lua_package_path
    lua_package_path “/opt/openresty-1.19.9.1/lualib/?.lua;/opt/nginx/conf/waf/?.lua”;

    user-agent中去除|bench,允许NetworkBench访问
    “Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.77.34.5 Safari/537.36; NetworkBench/79.0.3917.0-8710402-0” “(HTTrack|harvest|audit|dirbuster|pangolin|nmap|sqln|-scan|hydra|Parser|libwww|BBBike|sqlmap|w3af|owasp|Nikto|fimap|havij|PycURL|zmeu|BabyKrokodil|netsparker|httperf|bench| SF/)”

    user-agent中去除|PycURL,允许监控访问

    openresty编辑说明
    –help this message

    –prefix=PATH set the installation prefix (default to /usr/local/openresty)

    –with-debug enable debug logging

    –with-no-pool-patch enable the no-pool patch for debugging memory issues

    -jN pass -jN option to make while building LuaJIT 2.1

    –without-http_echo_module disable ngx_http_echo_module
    –without-http_xss_module disable ngx_http_xss_module
    –without-http_coolkit_module disable ngx_http_coolkit_module
    –without-http_set_misc_module disable ngx_http_set_misc_module
    –without-http_form_input_module disable ngx_http_form_input_module
    –without-http_encrypted_session_module
    disable ngx_http_encrypted_session_module
    –without-http_srcache_module disable ngx_http_srcache_module
    –without-http_lua_module disable ngx_http_lua_module
    –without-http_lua_upstream_module disable ngx_http_lua_upstream_module
    –without-http_headers_more_module disable ngx_http_headers_more_module
    –without-http_array_var_module disable ngx_http_array_var_module
    –without-http_memc_module disable ngx_http_memc_module
    –without-http_redis2_module disable ngx_http_redis2_module
    –without-http_redis_module disable ngx_http_redis_module
    –without-http_rds_json_module disable ngx_http_rds_json_module
    –without-http_rds_csv_module disable ngx_http_rds_csv_module
    –without-stream_lua_module disable ngx_stream_lua_module
    –without-ngx_devel_kit_module disable ngx_devel_kit_module
    –without-stream disable TCP/UDP proxy module
    –without-http_ssl_module disable ngx_http_ssl_module
    –without-stream_ssl_module disable ngx_stream_ssl_module

    –with-http_iconv_module enable ngx_http_iconv_module
    –with-http_drizzle_module enable ngx_http_drizzle_module
    –with-http_postgres_module enable ngx_http_postgres_module

    –without-lua_cjson disable the lua-cjson library
    –without-lua_tablepool disable the lua-tablepool library (and by consequence, the
    lua-resty-shell library)
    –without-lua_redis_parser disable the lua-redis-parser library
    –without-lua_rds_parser disable the lua-rds-parser library
    –without-lua_resty_dns disable the lua-resty-dns library
    –without-lua_resty_memcached disable the lua-resty-memcached library
    –without-lua_resty_redis disable the lua-resty-redis library
    –without-lua_resty_mysql disable the lua-resty-mysql library
    –without-lua_resty_upload disable the lua-resty-upload library
    –without-lua_resty_upstream_healthcheck
    disable the lua-resty-upstream-healthcheck library
    –without-lua_resty_string disable the lua-resty-string library
    –without-lua_resty_websocket disable the lua-resty-websocket library
    –without-lua_resty_limit_traffic disable the lua-resty-limit-traffic library
    –without-lua_resty_lock disable the lua-resty-lock library
    –without-lua_resty_lrucache disable the lua-resty-lrucache library
    –without-lua_resty_signal disable the lua-resty-signal library (and by consequence,
    the lua-resty-shell library)
    –without-lua_resty_shell disable the lua-resty-shell library
    –without-lua_resty_core disable the lua-resty-core library

    –with-luajit=DIR use the external LuaJIT 2.1 installation specified by DIR
    –with-luajit-xcflags=FLAGS Specify extra C compiler flags for LuaJIT 2.1
    –with-luajit-ldflags=FLAGS Specify extra C linker flags for LuaJIT 2.1
    –without-luajit-lua52 Turns off the LuaJIT extensions from Lua 5.2 that may break
    backward compatibility
    –without-luajit-gc64 Turns off the LuaJIT GC64 mode (which is enabled by default
    on x86_64)

    –with-libdrizzle=DIR specify the libdrizzle 1.0 (or drizzle) installation prefix
    –with-libpq=DIR specify the libpq (or postgresql) installation prefix
    –with-pg_config=PATH specify the path of the pg_config utility

    Options directly inherited from nginx

    –sbin-path=PATH set nginx binary pathname
    –modules-path=PATH set modules path
    –conf-path=PATH set nginx.conf pathname
    –error-log-path=PATH set error log pathname
    –pid-path=PATH set nginx.pid pathname
    –lock-path=PATH set nginx.lock pathname

    –user=USER set non-privileged user for
    worker processes
    –group=GROUP set non-privileged group for
    worker processes

    –build=NAME set build name
    –builddir=DIR set build directory

    –with-select_module enable select module
    –without-select_module disable select module
    –with-poll_module enable poll module
    –without-poll_module disable poll module

    –with-threads enable thread pool support

    –with-file-aio enable file AIO support

    –with-http_ssl_module enable ngx_http_ssl_module (default on)
    –with-http_v2_module enable ngx_http_v2_module
    –with-http_realip_module enable ngx_http_realip_module
    –with-http_addition_module enable ngx_http_addition_module
    –with-http_xslt_module enable ngx_http_xslt_module
    –with-http_xslt_module=dynamic enable dynamic ngx_http_xslt_module
    –with-http_image_filter_module enable ngx_http_image_filter_module
    –with-http_image_filter_module=dynamic
    enable dynamic ngx_http_image_filter_module
    –with-http_geoip_module enable ngx_http_geoip_module
    –with-http_geoip_module=dynamic enable dynamic ngx_http_geoip_module
    –with-http_sub_module enable ngx_http_sub_module
    –with-http_dav_module enable ngx_http_dav_module
    –with-http_flv_module enable ngx_http_flv_module
    –with-http_mp4_module enable ngx_http_mp4_module
    –with-http_gunzip_module enable ngx_http_gunzip_module
    –with-http_gzip_static_module enable ngx_http_gzip_static_module
    –with-http_auth_request_module enable ngx_http_auth_request_module
    –with-http_random_index_module enable ngx_http_random_index_module
    –with-http_secure_link_module enable ngx_http_secure_link_module
    –with-http_degradation_module enable ngx_http_degradation_module
    –with-http_slice_module enable ngx_http_slice_module
    –with-http_stub_status_module enable ngx_http_stub_status_module

    –without-http_charset_module disable ngx_http_charset_module
    –without-http_gzip_module disable ngx_http_gzip_module
    –without-http_ssi_module disable ngx_http_ssi_module
    –without-http_userid_module disable ngx_http_userid_module
    –without-http_access_module disable ngx_http_access_module
    –without-http_auth_basic_module disable ngx_http_auth_basic_module
    –without-http_mirror_module disable ngx_http_mirror_module
    –without-http_autoindex_module disable ngx_http_autoindex_module
    –without-http_geo_module disable ngx_http_geo_module
    –without-http_map_module disable ngx_http_map_module
    –without-http_split_clients_module disable ngx_http_split_clients_module
    –without-http_referer_module disable ngx_http_referer_module
    –without-http_rewrite_module disable ngx_http_rewrite_module
    –without-http_proxy_module disable ngx_http_proxy_module
    –without-http_fastcgi_module disable ngx_http_fastcgi_module
    –without-http_uwsgi_module disable ngx_http_uwsgi_module
    –without-http_scgi_module disable ngx_http_scgi_module
    –without-http_grpc_module disable ngx_http_grpc_module
    –without-http_memcached_module disable ngx_http_memcached_module
    –without-http_limit_conn_module disable ngx_http_limit_conn_module
    –without-http_limit_req_module disable ngx_http_limit_req_module
    –without-http_empty_gif_module disable ngx_http_empty_gif_module
    –without-http_browser_module disable ngx_http_browser_module
    –without-http_upstream_hash_module
    disable ngx_http_upstream_hash_module
    –without-http_upstream_ip_hash_module
    disable ngx_http_upstream_ip_hash_module
    –without-http_upstream_least_conn_module
    disable ngx_http_upstream_least_conn_module
    –without-http_upstream_random_module
    disable ngx_http_upstream_random_module
    –without-http_upstream_keepalive_module
    disable ngx_http_upstream_keepalive_module
    –without-http_upstream_zone_module
    disable ngx_http_upstream_zone_module

    –with-http_perl_module enable ngx_http_perl_module
    –with-http_perl_module=dynamic enable dynamic ngx_http_perl_module
    –with-perl_modules_path=PATH set Perl modules path
    –with-perl=PATH set perl binary pathname

    –http-log-path=PATH set http access log pathname
    –http-client-body-temp-path=PATH set path to store
    http client request body temporary files
    –http-proxy-temp-path=PATH set path to store
    http proxy temporary files
    –http-fastcgi-temp-path=PATH set path to store
    http fastcgi temporary files
    –http-uwsgi-temp-path=PATH set path to store
    http uwsgi temporary files
    –http-scgi-temp-path=PATH set path to store
    http scgi temporary files

    –without-http disable HTTP server
    –without-http-cache disable HTTP cache

    –with-mail enable POP3/IMAP4/SMTP proxy module
    –with-mail=dynamic enable dynamic POP3/IMAP4/SMTP proxy module
    –with-mail_ssl_module enable ngx_mail_ssl_module
    –without-mail_pop3_module disable ngx_mail_pop3_module
    –without-mail_imap_module disable ngx_mail_imap_module
    –without-mail_smtp_module disable ngx_mail_smtp_module

    –with-stream enable TCP/UDP proxy module (default on)
    –with-stream=dynamic enable dynamic TCP/UDP proxy module
    –with-stream_ssl_module enable ngx_stream_ssl_module (default on)
    –with-stream_realip_module enable ngx_stream_realip_module
    –with-stream_geoip_module enable ngx_stream_geoip_module
    –with-stream_geoip_module=dynamic enable dynamic ngx_stream_geoip_module
    –with-stream_ssl_preread_module enable ngx_stream_ssl_preread_module
    –without-stream_limit_conn_module disable ngx_stream_limit_conn_module
    –without-stream_access_module disable ngx_stream_access_module
    –without-stream_geo_module disable ngx_stream_geo_module
    –without-stream_map_module disable ngx_stream_map_module
    –without-stream_split_clients_module
    disable ngx_stream_split_clients_module
    –without-stream_return_module disable ngx_stream_return_module
    –without-stream_upstream_hash_module
    disable ngx_stream_upstream_hash_module
    –without-stream_upstream_least_conn_module
    disable ngx_stream_upstream_least_conn_module
    –without-stream_upstream_random_module
    disable ngx_stream_upstream_random_module
    –without-stream_upstream_zone_module
    disable ngx_stream_upstream_zone_module

    –with-google_perftools_module enable ngx_google_perftools_module
    –with-cpp_test_module enable ngx_cpp_test_module

    –add-module=PATH enable external module
    –add-dynamic-module=PATH enable dynamic external module

    –with-compat dynamic modules compatibility

    –with-cc=PATH set C compiler pathname
    –with-cpp=PATH set C preprocessor pathname
    –with-cc-opt=OPTIONS set additional C compiler options
    –with-ld-opt=OPTIONS set additional linker options
    –with-cpu-opt=CPU build for the specified CPU, valid values:
    pentium, pentiumpro, pentium3, pentium4,
    athlon, opteron, sparc32, sparc64, ppc64

    –without-pcre disable PCRE library usage
    –with-pcre force PCRE library usage
    –with-pcre=DIR set path to PCRE library sources
    –with-pcre-opt=OPTIONS set additional build options for PCRE
    –with-pcre-jit build PCRE with JIT compilation support

    –with-zlib=DIR set path to zlib library sources
    –with-zlib-opt=OPTIONS set additional build options for zlib
    –with-zlib-asm=CPU use zlib assembler sources optimized
    for the specified CPU, valid values:
    pentium, pentiumpro

    –with-libatomic force libatomic_ops library usage
    –with-libatomic=DIR set path to libatomic_ops library sources

    –with-openssl=DIR set path to OpenSSL library sources
    –with-openssl-opt=OPTIONS set additional build options for OpenSSL

    –dry-run dry running the configure, for testing only
    –platform=PLATFORM forcibly specify a platform name, for testing only

    参考:
    接入层限流之OpenResty提供的Lua限流模块lua-resty-limit-tra
    https://www.jianshu.com/p/687e63118d84

    又拍云张聪:OpenResty 动态流控的几种姿势
    https://www.cnblogs.com/upyun/p/10307741.html

    The post openresty+lua实现WAF应用防火墙 first appeared on C1G军火库.



沪ICP备19023445号-2号
友情链接