- 创建者: 虚拟的现实,上次更新时间:1月 24, 2024 需要 5 分钟阅读时间
一、说明
操作系统:CentOS 7 (最小化安装)
Kong版本:1.4.2
二、系统配置
1、按系统标准完成操作系统初始化配置。
2、注意关闭 Selinux 配置
3、配置阿里云 更新源(含EPEL),增加 npm 国内配置源
4、配置 pgsql 安装源和 kong 安装源
三、编译升级
下载 Openresty 的源码包,需要注意 Kong 会严格验证 nginx 的版本,如果出现版本不一致的情况将无法正常启动。如果使用高版本的 nginx 编译需求调整源文件的版本号。
yum install libtool perl-core gcc gcc-c++ tree git elfutils-devel -y npm config set registry https://registry.npm.taobao.org wget https://bintray.com/kong/kong-rpm/rpm -O bintray-kong-kong-rpm.repo baseurl=https://kong.bintray.com/kong-rpm/centos/7 yum install kong-1.4.2 wget https://openresty.org/download/openresty-1.15.8.2.tar.gz wget http://mirrors.sohu.com/nginx/nginx-1.17.4.tar.gz git clone https://github.com/openresty/openresty cp /tmp/openresty/patches/nginx-1.17.4* /root/openresty-1.15.8.2/patches/ /root/openresty-1.15.8.2/bundle/openssl-1.1.1c/Configure linux-x86_64 make && make install /root/openresty-1.15.8.2/bundle/pcre-8.42/configure make && make install /root/openresty-1.15.8.2/bundle/zlib-1.2.11/configure make && make install cd LuaJIT-2.1-20190507/ make clean make&&make install export LUAJIT_INC=/usr/local/include/luajit-2.1 export LUAJIT_LIB=/usr/local/lib wget https://openresty.org/download/openresty-1.15.8.2.tar.gz tar zxvf openresty-1.15.8.2.tar.gz wget https://github.com/Kong/openresty-patches/archive/master.tar.gz tar zxvf master.tar.gz cd openresty-1.15.8.2/bundle for i in ../../openresty-patches-master/patches/1.15.8.2/*.patch; do patch -p1 < $i; done /root/openresty-1.15.8.2/configure vim /root/openresty-1.15.8.2/bundle/nginx-1.17.4/src/core/nginx.h
nginx.h
#define nginx_version 1015008
#define NGINX_VERSION "1.15.8"
#define NGINX_VER "openresty/" NGINX_VERSION ".2"
./configure --prefix=/usr/local/openresty/nginx \ --with-cc-opt='-O2 -DNGX_LUA_ABORT_AT_PANIC -I/usr/local/openresty/zlib/include -I/usr/local/openresty/pcre/include -I/usr/local/openresty/openssl/include' \ --add-module=../ngx_devel_kit-0.3.1rc1 --add-module=../echo-nginx-module-0.61 --add-module=../xss-nginx-module-0.06 --add-module=../ngx_coolkit-0.2 \ --add-module=../set-misc-nginx-module-0.32 --add-module=../form-input-nginx-module-0.12 --add-module=../encrypted-session-nginx-module-0.08 \ --add-module=../srcache-nginx-module-0.31 --add-module=../ngx_lua-0.10.15 --add-module=../ngx_lua_upstream-0.07 \ --add-module=../headers-more-nginx-module-0.33 --add-module=../array-var-nginx-module-0.05 --add-module=../rds-json-nginx-module \ --add-module=../memc-nginx-module-0.19 --add-module=../redis2-nginx-module-0.15 --add-module=../redis-nginx-module-0.3.7 \ --add-module=../ngx_stream_lua-0.0.7 --add-module=../nginx-upload-module --add-module=../rds-csv-nginx-module-0.09 \ --add-module=../lua-kong-nginx-module --add-module=../naxsi-0.56/naxsi_src \ --with-ld-opt='-Wl,-rpath,/usr/local/openresty/luajit/lib -L/usr/local/openresty/zlib/lib -L/usr/local/openresty/pcre/lib -L/usr/local/openresty/openssl/lib -Wl,-rpath,/usr/local/openresty/zlib/lib:/usr/local/openresty/pcre/lib:/usr/local/openresty/openssl/lib' \ --with-cc='ccache gcc -fdiagnostics-color=always' --with-pcre --with-openssl=../openssl-1.1.1c --with-pcre-jit --with-debug \ --with-stream --with-stream_ssl_module --with-stream_ssl_preread_module --with-http_v2_module --without-mail_pop3_module \ --without-mail_imap_module --without-mail_smtp_module --with-http_stub_status_module --with-http_realip_module \ --with-http_addition_module --with-http_auth_request_module --with-http_secure_link_module --with-http_random_index_module \ --with-http_gzip_static_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module \ --with-http_gunzip_module --with-threads --with-stream --with-stream_ssl_preread_module --with-http_ssl_module make cp /root/openresty-1.15.8.2/bundle/nginx-1.17.4/objs/nginx /usr/local/openresty/nginx/sbin kong start -vv
四、加入 Modsecurity 策略支持
REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example 和 RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf.example 是自定义白名单文件。
yum install gcc-c++ flex bison yajl yajl-devel curl-devel curl GeoIP-devel doxygen lmdb-devel ssdeep-devel git clone https://github.com/SpiderLabs/ModSecurity cd ModSecurity git checkout -b v3/master origin/v3/master sh build.sh git submodule init git submodule update ./configure make make install export MODSECURITY_INC="/root/openresty-1.15.8.2/bundle/ModSecurity/headers/" export MODSECURITY_LIB="/root/openresty-1.15.8.2/bundle/ModSecurity/src/.libs/" git clone https://github.com/SpiderLabs/ModSecurity-nginx git clone https://bitbucket.org/lazy_dogtown/doxi-rules.git ./configure --prefix=/usr/local/openresty/nginx \ --with-cc-opt='-O2 -DNGX_LUA_ABORT_AT_PANIC -I/usr/local/openresty/zlib/include -I/usr/local/openresty/pcre/include -I/usr/local/openresty/openssl/include' \ --add-module=../ngx_devel_kit-0.3.1rc1 --add-module=../echo-nginx-module-0.61 --add-module=../xss-nginx-module-0.06 \ --add-module=../ngx_coolkit-0.2 --add-module=../set-misc-nginx-module-0.32 --add-module=../form-input-nginx-module-0.12 \ --add-module=../encrypted-session-nginx-module-0.08 --add-module=../srcache-nginx-module-0.31 --add-module=../ngx_lua-0.10.15 \ --add-module=../ngx_lua_upstream-0.07 --add-module=../headers-more-nginx-module-0.33 --add-module=../array-var-nginx-module-0.05 \ --add-module=../rds-json-nginx-module --add-module=../memc-nginx-module-0.19 --add-module=../redis2-nginx-module-0.15 \ --add-module=../redis-nginx-module-0.3.7 --add-module=../ngx_stream_lua-0.0.7 --add-module=../nginx-upload-module --add-module=../rds-csv-nginx-module-0.09 \ --add-module=../lua-kong-nginx-module --add-module=../ModSecurity-nginx \ --with-ld-opt='-Wl,-rpath,/usr/local/openresty/luajit/lib -L/usr/local/openresty/zlib/lib -L/usr/local/openresty/pcre/lib -L/usr/local/openresty/openssl/lib -Wl,-rpath,/usr/local/openresty/zlib/lib:/usr/local/openresty/pcre/lib:/usr/local/openresty/openssl/lib' \ --with-cc='ccache gcc -fdiagnostics-color=always' --with-pcre --with-openssl=../openssl-1.1.1c --with-pcre-jit --with-debug --with-stream \ --with-stream_ssl_module --with-stream_ssl_preread_module --with-http_v2_module --without-mail_pop3_module --without-mail_imap_module \ --without-mail_smtp_module --with-http_stub_status_module --with-http_realip_module --with-http_addition_module --with-http_auth_request_module \ --with-http_secure_link_module --with-http_random_index_module --with-http_gzip_static_module --with-http_sub_module --with-http_dav_module \ --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-threads --with-stream --with-stream_ssl_preread_module \ --with-http_ssl_module make git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git cp ../ModSecurity/modsecurity.conf-recommended /usr/local/kong/modsec/modsecurity.conf cp ../ModSecurity/unicode.mapping /usr/local/kong/modsec/ cp /root/openresty-1.15.8.2/bundle/owasp-modsecurity-crs/crs-setup.conf.example /usr/local/kong/modsec/crs-setup.conf cp -R /root/openresty-1.15.8.2/bundle/owasp-modsecurity-crs/rules/ /usr/local/kong/modsec/ sed -i "s/SecRuleEngine DetectionOnly/SecRuleEngine On/" /usr/local/kong/modsec/modsecurity.conf sed -i "s/SecAuditLogType Serial/SecAuditLogType Concurrent/" /usr/local/kong/modsec/modsecurity.conf sed -i "s|SecAuditLog /var/log/modsec_audit.log|SecAuditLog /usr/local/kong/logs/modsec.log|" /usr/local/kong/modsec/modsecurity.conf
4.1 修改模版文件,加入安全策略
vim /usr/lib/systemd/system/kong.servic
[Unit] Description=Kong After=rsyslog.target network.target postgresql-11.service [Service] User=root Group=root Type=forking ExecStart=/usr/local/bin/kong start ExecReload=/usr/local/bin/kong reload ExecStop=/usr/local/bin/kong stop LimitAS=infinity LimitRSS=infinity LimitCORE=infinity LimitNOFILE=4096 [Install] WantedBy=multi-user.target
4.2 修改配置文件,加入策略
4.3 Naxsi 配置
git clone https://bitbucket.org/lazy_dogtown/doxi-rules.git mkdir -p /usr/local/kong/naxsi cp /root/openresty-1.15.8.2/bundle/naxsi-0.56/naxsi_config/naxsi_core.rules /usr/local/kong/naxsi/ cp /root/openresty-1.15.8.2/bundle/doxi-rules/*.rules /usr/local/kong/naxsi/
4.4 fail2ban 配置
vim /etc/fail2ban/jail.conf [kong-naxsi] enabled = true port = http,https filter = kong-naxsi logpath = /usr/local/kong/logs/naxsi.log maxretry = 3 vim /etc/fail2ban/filter.d/kong-naxsi.conf [INCLUDES] before = common.conf [Definition] failregex = NAXSI_FMT: ip=<HOST>&server=.*&uri=.*&learning=0 NAXSI_FMT: ip=<HOST>.*&config=block ignoreregex = NAXSI_FMT: ip=<HOST>.*&config=learning
五、编译故障处理
1、nginx 启动时提示”no file '/usr/local/lib/lua/5.1/rex_pcre.so'“
原因:
加载 lua-resty-waf 插件后提示没有 pcre 动态库文件
解决方法:
luarocks install lrexlib-pcre cp /usr/lib64/lua/5.1/rex_pcre.so /usr/local/openresty/lualib/
2、编译提示”WARNING: 'aclocal-1.15' is missing on your system.
You should only need it if you modified 'acinclude.m4' or
'configure.ac' or m4 files included by 'configure.ac'.
The 'aclocal' program is part of the GNU Automake package:
<http://www.gnu.org/software/automake>“
原因:
缺乏 aclocal 指令
解决办法:
yum install automake
然后到出错的文件夹执行 autoreconf
g++ ac_lua.cxx -c -fvisibility=hidden -Wall -msse2 -msse3 -msse4.1 -O3 -fPIC -I/usr/include/lua5.1 -MMD -o build_so/ac_lua.o
ac_lua.cxx:11:14: fatal error: lua.h: No such file or directory
#include <lua.h>
^~~~~~~
lua-resty-waf
git clone git://github.com/vozlt/nginx-module-vts.git wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.36.tar.bz2 wget https://mirrors.yangxingzhen.com/pcre/pcre-8.39.tar.gz wget https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz wget https://www.zlib.net/zlib-1.2.11.tar.gz wget https://openresty.org/package/centos/openresty.repo yum install openresty-pcre-devel openresty-openssl-devel openresty-zlib-devel openresty-debug ./configure --prefix=/usr/local/openresty/nginx --with-cc-opt='-O2 -DNGX_LUA_ABORT_AT_PANIC -I/usr/local/openresty/zlib/include -I/usr/local/openresty/pcre/include -I/usr/local/openresty/openssl/include' \ --add-module=../ngx_devel_kit-0.3.1rc1 --add-module=../echo-nginx-module-0.61 --add-module=../xss-nginx-module-0.06 --add-module=../ngx_coolkit-0.2 \ --add-module=../nginx-module-vts --add-module=../set-misc-nginx-module-0.32 --add-module=../form-input-nginx-module-0.12 --add-module=../encrypted-session-nginx-module-0.08 \ --add-module=../srcache-nginx-module-0.31 --add-module=../ngx_lua-0.10.15 --add-module=../ngx_lua_upstream-0.07 --add-module=../headers-more-nginx-module-0.33 --add-module=../array-var-nginx-module-0.05 \ --add-module=../memc-nginx-module-0.19 --add-module=../redis2-nginx-module-0.15 --add-module=../redis-nginx-module-0.3.7 --add-module=../ngx_stream_lua-0.0.7 \ --with-ld-opt='-Wl,-rpath,/usr/local/openresty/luajit/lib -L/usr/local/openresty/zlib/lib -L/usr/local/openresty/pcre/lib -L/usr/local/openresty/openssl/lib \ -Wl,-rpath,/usr/local/openresty/zlib/lib:/usr/local/openresty/pcre/lib:/usr/local/openresty/openssl/lib' --with-cc='ccache gcc -fdiagnostics-color=always' --with-pcre=../pcre-8.42 \ --with-pcre-jit --with-debug --with-stream --with-stream_ssl_module --with-stream_ssl_preread_module --with-http_v2_module --without-mail_pop3_module --without-mail_imap_module \ --without-mail_smtp_module --with-http_stub_status_module --with-http_realip_module --with-http_addition_module --with-http_auth_request_module --with-http_secure_link_module \ --with-http_random_index_module --with-http_gzip_static_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module \ --with-threads --with-stream --with-stream_ssl_preread_module --with-http_ssl_module yum install luarocks ccache automake luarocks install lua-resty-waf lrexlib-pcre yum install perl-JSON perl-Clone perl-List perl-List-MoreUtils perl-Try-Tiny perl-Exporter-Declare echo "SecRule REQUEST_URI /XinXiBu/WebResource.axd \"id:11008, phase:1,log,allow,msg:'WhiteList-Different URL Accessed'\"" \ | ./luarocks_lua-resty-waf-0.11.1-1-8143/lua-resty-waf/tools/modsec2lua-resty-waf.pl
nginx.conf 的 http 配置区域增加以下内容
lua_package_path '/usr/local/openresty/site/lualib/?.lua;/usr/local/openresty/lualib/?.lua;;'; lua_package_cpath '/usr/local/openresty/site/lualib/?.so;/usr/local/openresty/lualib/?.so;;'; init_by_lua_block { local lua_resty_waf = require "resty.waf" local ok, errs = pcall(function() lua_resty_waf.load_secrules("/usr/local/openresty/site/lualib/rules/21000_http_anomaly.json") lua_resty_waf.load_secrules("/usr/local/openresty/site/lualib/rules/35000_user_agent.json") lua_resty_waf.load_secrules("/usr/local/openresty/site/lualib/rules/40000_generic_attack.json") lua_resty_waf.load_secrules("/usr/local/openresty/site/lualib/rules/41000_sqli.json") end) if errs then for i = 1, #errs do ngx.log(ngx.ERR, errs[i]) end end } include vhost/*.conf;
具体配置文件增加以下内容
location / { access_by_lua_block { local lua_resty_waf = require "resty.waf" local waf = lua_resty_waf:new() waf:set_option("event_log_request_body", true) waf:set_option("event_log_request_headers", true) waf:set_option("debug", true) waf:set_option("mode", "ACTIVE") waf:set_option("debug_log_level", ngx.DEBUG) waf:set_option("info", "true") waf:set_option("event_log_request_arguments", true) waf:set_option("event_log_target", "file") waf:set_option("event_log_target_path", "/var/log/waf/" .. ngx.var.http_host .. "_" .. ngx.today() .. ".log") waf:set_option("process_multipart_body", true) waf:set_option("res_body_max_size", 1024 * 1024 * 2) ############################################### # lua resty waf usage ############################################### header_filter_by_lua_block { local lua_resty_waf = require "resty.waf" local waf = lua_resty_waf:new() waf:exec() } body_filter_by_lua_block { local lua_resty_waf = require "resty.waf" local waf = lua_resty_waf:new() waf:exec() } log_by_lua_block { local lua_resty_waf = require "resty.waf" local waf = lua_resty_waf:new() waf:exec() waf:write_log_events() } root html; index index.html index.htm; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://caiyang-cn; proxy_connect_timeout 600; proxy_read_timeout 600; proxy_send_timeout 600; proxy_buffering on; proxy_buffer_size 8k; proxy_buffers 8 32k; proxy_busy_buffers_size 128k; proxy_temp_file_write_size 128k; proxy_http_version 1.1; proxy_set_header Connection ""; }
拦截情况
{"timestamp":1575525013,"request_headers":{"host":"www.caiyang.com.cn","connection":"keep-alive","sec-fetch-site":"none","upgrade-insecure-requests":"1","sec-fetch-mode":"navigate","accept-encoding":"gzip, deflate, br","user-agent":"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/78.0.3904.108 Safari\/537.36","cookie":"_csrf_token=6eb2dc40f3acb235633184c2dde6bb236c756760; session=eyJfY3NyZl90b2tlbiI6IjZlYjJkYzQwZjNhY2IyMzU2MzMxODRjMmRkZTZiYjIzNmM3NTY3NjAiLCJfZnJlc2giOmZhbHNlLCJfcGVybWFuZW50Ijp0cnVlfQ.Xeiaiw.YO6EAoO4R3CkrKBi5YCmX7Ua1kc","accept-language":"en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7","accept":"text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/webp,image\/apng,*\/*;q=0.8,application\/signed-exchange;v=b3","sec-fetch-user":"?1"},"id":"f721035c7cd42b38d9bd","method":"GET","uri":"\/login","client":"192.168.13.43","uri_args":{"..\/..\/.svn":true},"alerts":[{"msg":"Repetitive non-word characters anomaly detected","id":40002,"match":1},{"msg":"Directory traversal (volatile match)","id":40022,"match":3},{"logdata":8,"msg":"Request score greater than score threshold","id":99001,"match":8}]} {"timestamp":1575525013,"request_headers":{"host":"www.caiyang.com.cn","connection":"keep-alive","sec-fetch-site":"none","upgrade-insecure-requests":"1","sec-fetch-mode":"navigate","accept-encoding":"gzip, deflate, br","user-agent":"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/78.0.3904.108 Safari\/537.36","cookie":"_csrf_token=6eb2dc40f3acb235633184c2dde6bb236c756760; session=eyJfY3NyZl90b2tlbiI6IjZlYjJkYzQwZjNhY2IyMzU2MzMxODRjMmRkZTZiYjIzNmM3NTY3NjAiLCJfZnJlc2giOmZhbHNlLCJfcGVybWFuZW50Ijp0cnVlfQ.Xeiaiw.YO6EAoO4R3CkrKBi5YCmX7Ua1kc","accept-language":"en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7","accept":"text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/webp,image\/apng,*\/*;q=0.8,application\/signed-exchange;v=b3","sec-fetch-user":"?1"},"id":"f721035c7cd42b38d9bd","method":"GET","uri":"\/login","client":"192.168.13.43","uri_args":{"..\/..\/.svn":true},"alerts":[{"msg":"Repetitive non-word characters anomaly detected","id":40002,"match":1},{"msg":"Directory traversal (volatile match)","id":40022,"match":3},{"logdata":8,"msg":"Request score greater than score threshold","id":99001,"match":8}]}
- 无标签
添加评论