Web应用安全防护-WAF

web应用开发中不可避免需要考虑web应用的安全问题,那么常见的安全风险包含哪些呢?

Web应用常见的安全风险

 在web应用开发中可能存在以下的安全风险:

安全风险Top 10
A1:2017-注入 将不受信任的数据作为命令或查询的一部分发送到解析器时,会产生诸如SQL注入、NoSQL注入、OS注入和LDAP注入的注入缺陷。攻击者的恶意数据可以诱使解析器在没有适当授权的情况下执行非预期命令或访问数据。
A2:2017-失效的身份认证 通常,通过错误使用应用程序的身份认证和会话管理功能,攻击者能够破译密码、密钥或会话令牌,或者利用其它开发缺陷来暂时性或永久性冒充其他用户的身份。
A3:2017-敏感数据泄露 许多Web应用程序和API都无法正确保护敏感数据,例如:财务数据、医疗数据和PII数据。攻击者可以通过窃取或修改未加密的数据来实施信用卡诈骗、身份盗窃或其他犯罪行为。未加密的敏感数据容易受到破坏,因此,我们需要对敏感数据加密,这些数据包括:传输过程中的数据、存储的数据以及浏览器的交互数据。
A4:2017-XML 外部实体(XXE) 许多较早的或配置错误的XML处理器评估了XML文件中的外部实体引用。攻击者可以利用外部实体窃取使用URI文件处理器的内部文件和共享文件、监听内部扫描端口、执行远程代码和实施拒绝服务攻击。
A5:2017-失效的访问控制 未对通过身份验证的用户实施恰当的访问控制。攻击者可以利用这些缺陷访问未经授权的功能或数据,例如:访问其他用户的帐户、查看敏感文件、修改其他用户的数据、更改访问权限等。
A6:2017-安全配置错误 安全配置错误是最常见的安全问题,这通常是由于不安全的默认配置、不完整的临时配置、开源云存储、错误的 HTTP 标头配置以及包含敏感信息的详细错误信息所造成的。因此,我们不仅需要对所有的操作系统、框架、库和应用程序进行安全配置,而且必须及时修补和升级它们。
A7:2017-跨站脚本(XSS) 当应用程序的新网页中包含不受信任的、未经恰当验证或转义的数据时,或者使用可以创建 HTML或JavaScript 的浏览器 API 更新现有的网页时,就会出现 XSS 缺陷。XSS 让攻击者能够在受害者的浏览器中执行脚本,并劫持用户会话、破坏网站或将用户重定向到恶意站点。

A8:2017-不安全的反序列化

不安全的反序列化会导致远程代码执行。即使反序列化缺陷不会导致远程代码执行,攻击者也可以利用它们来执行攻击,包括:重播攻击、注入攻击和特权升级攻击。
A9:2017-使用含有已知漏洞的组件 组件(例如:库、框架和其他软件模块)拥有和应用程序相同的权限。如果应用程序中含有已知漏洞的组件被攻击者利用,可能会造成严重的数据丢失或服务器接管。同时,使用含有已知漏洞的组件的应用程序和API可能会破坏应用程序防御、造成各种攻击并产生严重影响。
A10:2017-不足的日志记录和监控 不足的日志记录和监控,以及事件响应缺失或无效的集成,使攻击者能够进一步攻击系统、保持持续性或转向更多系统,以及篡改、提取或销毁数据。大多数缺陷研究显示,缺陷被检测出的时间超过200天,且通常通过外部检测方检测,而不是通过内部流程或监控检测。

 那么,这些风险有什么办法进行避免呢?——WAF

1、WAF

  Web 应用防火墙 (WAF-Web Application Firewall) 旨在保护 Web 应用免受各类应用层攻击,例如跨站点脚本 (XSS)、SQL 注入,以及 cookie 中毒等。应用是您重要数据的网关,因此针对应用发起的攻击就成为了造成漏洞的主要原因。

  有了 WAF 就可以拦截一系列企图通过入侵系统来泄漏数据的攻击。 

 工作原理:

  WAF 通过过滤、监控和拦截恶意 HTTP 或 HTTPS 流量对 Web 应用的访问来保护您的 Web 应用,并能够阻止未经授权的数据离开应用。因此,WAF 需要遵守一套策略,帮助其确定哪些流量是恶意的,哪些流量是安全的。

  WAF 的操作方式与代理服务器类似,虽然同为“中介”,但后者旨在保护客户端身份,前者却被称为反向代理,因为其使命在于保护 Web 应用服务器免受潜在恶意客户端的影响。

  WAF 不拘泥于形式,是软件、设备,亦是即服务。策略可定制,以满足您对 Web 应用或 Web 应用组合的独特需求。虽然许多 WAF 要求您定期更新策略以解决新的漏洞,但机器学习的进步使一些 WAF 能够自动更新。随着威胁环境愈发复杂和不确定,这种自动化变得越来越重要。

  Web应用安全防护-WAF

 IPS与WAF区别:

  IPS :入侵防御系统,一款目标范围更加广泛的安全产品。IPS 通常以签名和政策为基础。换言之,它可以根据签名数据库和既定政策,检查众所周知的漏洞和攻击载体。IPS 根据数据库和策略建立一个标准,然后会在流量偏离标准时发出警报。随着时间的推移,新漏洞层出不穷,签名和策略也会积少成多。一般来说,IPS 保护对象是一系列协议类型的流量,例如 DNS、SMTP、TELNET、RDP、SSH 和 FTP。通常情况下,IPS 会运行于第 3 层和第 4 层并对其提供保护,相较于网络层和会话层,对应用层(第 7 层)提供的保护力度着实有限。

  Web 应用防火墙 (WAF): WAF设计专为保护应用层而生,旨在分析应用层上各 HTTP 或 HTTPS 请求。它通常会感知用户、会话和应用,了解其背后的 Web 应用及其提供的服务。正因如此,WAF 可以看作是用户和应用之间的中介,并会提前对往来于两者之前的通信进行分析。传统的 WAF 确保仅执行允许的操作(基于安全策略)。对于许多组织来说,WAF 是应用值得信赖的第一道防线,尤其是在抵御 前面描述的10大安全风险。

 WAF部署方式:

  • 基于云服务商提供的WAF:如AWS WAF、Amazon WAF
  • 基于软件实现:如:Nginx方式

2、基于Nginx实现的WAF

 ngx_lua_waf是一个基于ngx_lua的web应用防火墙。可以实现WAF的相关防护功能。

 安装步骤:

  • 安装依赖包:
    yum -y install gcc gcc-c++ autoconf automake make unzip
    yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel
  • 安装LuaJIT2.0

    下载luajit 2.0并安装
    cd /usr/local/src/
    wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz
    tar xf LuaJIT-2.0.5.tar.gz
    cd LuaJIT-2.0.5
    make && make install
  • 安装ngx_devel_kit(NDK(nginx development kit)模块是一个拓展nginx服务器核心功能的模块,第三方模块开发可以基于它来快速实现。)
    cd /user/local/src/
    wget https://github.com/simplresty/ngx_devel_kit/archive/v0.3.0.tar.gz
    tar xf v0.3.0.tar.gz
  • 安装nginx_lua_module
    wget https://github.com/openresty/lua-nginx-module/archive/v0.10.20.tar.gz
    tar xf v0.10.20.tar.gz
  • 导入环境变量
    echo "export LUAJIT_LIB=/usr/local/lib" >> /etc/profile
    echo "export LUAJIT_INC=/usr/local/include/luajit-2.0" >> /etc/profile
    source /etc/profile
  • 编译安装Nginx
    cd /usr/local/src/
    wget http://nginx.org/download/nginx-1.21.0.tar.gz
    tar xf nginx-1.21.0.tar.gz  
    cd nginx-1.21.0
    useradd -s /sbin/nologin -M www
    cd nginx-1.21.0
     ./configure --user=www --group=www \
    --prefix=/usr/local/nginx-1.21.0 \
    --with-http_stub_status_module \
    --with-http_ssl_module \
    --with-http_gzip_static_module \
    --pid-path=/usr/local/nginx-1.21.0/nginx.pid \
    --with-http_realip_module \
    --add-module=/usr/local/src/ngx_devel_kit-0.3.0 \
    --add-module=/usr/local/src/lua-nginx-module-0.10.20 \
    --with-ld-opt="-Wl,-rpath,$LUAJIT_LIB"
    make -j2
    make install
    ln -s /usr/local/nginx-1.14.0 /usr/local/nginx
  • 新建/usr/local/nginx/logs/hack/攻击日志目录,并赋予nginx用户对该目录的写入权限。
    mkdir -p /usr/local/nginx/logs/hack/
    chown -R www.www /usr/local/nginx/logs/hack/
    chmod -R 755 /usr/local/nginx/logs/hack/

   一键部署命令:  

#!/bin/bash
#Author: Template
yum -y install gcc gcc-c++ autoconf automake make unzip wget
yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel
cd /usr/local/src/

[ ! -f "LuaJIT-2.0.5.tar.gz" ] && wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz 
[ ! -f "nginx-1.14.0.tar.gz" ] && wget http://nginx.org/download/nginx-1.21.0.tar.gz && 
[ ! -f "v0.3.0.tar.gz" ] && wget https://github.com/simplresty/ngx_devel_kit/archive/v0.3.0.tar.gz 
[ ! -f "v0.10.13.tar.gz" ] && wget https://github.com/openresty/lua-nginx-module/archive/v0.10.20.tar.gz
[ ! -f "master.zip" ] && wget https://github.com/loveshell/ngx_lua_waf/archive/master.zip --no-check-certificate

ls *.tar.gz | xargs -n 1  tar xf

cd LuaJIT-2.0.5 && make && make install && cd ..

echo "export LUAJIT_LIB=/usr/local/lib" >> /etc/profile && \
echo "export LUAJIT_INC=/usr/local/include/luajit-2.0" >> /etc/profile
source /etc/profile
cd nginx-1.21.0 && useradd -s /sbin/nologin -M www
./configure --user=www --group=www \
--prefix=/usr/local/nginx-1.21.0 \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-http_gzip_static_module \
--pid-path=/usr/local/nginx-1.21.0/nginx.pid \
--with-http_realip_module \
--add-module=/usr/local/src/ngx_devel_kit-0.3.0 \
--add-module=/usr/local/src/lua-nginx-module-0.10.20 \
--with-ld-opt="-Wl,-rpath,$LUAJIT_LIB" && make -j8 && make install && ln -s /usr/local/nginx-1.21.0 /usr/local/nginx

mkdir -p /usr/local/nginx/logs/hack/ && chown -R www.www /usr/local/nginx/logs/hack/ && chmod -R 755 /usr/local/nginx/logs/hack/

sed -i '25 a lua_package_path \"/usr/local/nginx/conf/waf/?.lua\";\nlua_shared_dict limit 10m;\ninit_by_lua_file  /usr/local/nginx/conf/waf/init.lua;\naccess_by_lua_file /usr/local/nginx/conf/waf/waf.lua;' /usr/local/nginx/conf/nginx.conf

cd /usr/local/src/ && unzip master.zip -d /usr/local/nginx/conf/ && mv /usr/local/nginx/conf/ngx_lua_waf-master /usr/local/nginx/conf/waf

/usr/local/nginx/sbin/nginx

 使用方式:

  nginx安装路径假设为:/usr/local/nginx/conf/

  把ngx_lua_waf下载到conf目录下,解压命名为waf

wget https://github.com/loveshell/ngx_lua_waf/archive/master.zip
unzip master.zip -d /usr/local/nginx/conf/
mv /usr/local/nginx/conf/ngx_lua_waf-master /usr/local/nginx/conf/waf

  在nginx.conf的http段添加

lua_package_path "/usr/local/nginx/conf/waf/?.lua";
lua_shared_dict limit 10m;
init_by_lua_file  /usr/local/nginx/conf/waf/init.lua; 
access_by_lua_file /usr/local/nginx/conf/waf/waf.lua;

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

RulePath = "/usr/local/nginx/conf/waf/wafconf/" #绝对路径如有变动,需对应修改

  然后重启nginx即可.  

RulePath = "/usr/local/nginx/conf/waf/wafconf/"
    --规则存放目录
    attacklog = "off"
    --是否开启攻击信息记录,需要配置logdir
    logdir = "/usr/local/nginx/logs/hack/"
    --log存储目录,该目录需要用户自己新建,切需要nginx用户的可写权限
    UrlDeny="on"
    --是否拦截url访问
    Redirect="on"
    --是否拦截后重定向
    CookieMatch = "on"
    --是否拦截cookie攻击
    postMatch = "on" 
    --是否拦截post攻击
    whiteModule = "on" 
    --是否开启URL白名单
    black_fileExt={"php","jsp"}
    --填写不允许上传文件后缀类型
    ipWhitelist={"127.0.0.1"}
    --ip白名单,多个ip用逗号分隔
    ipBlocklist={"1.0.0.1"}
    --ip黑名单,多个ip用逗号分隔
    CCDeny="on"
    --是否开启拦截cc攻击(需要nginx.conf的http段增加lua_shared_dict limit 10m;)
    CCrate = "100/60"
    --设置cc攻击频率,单位为秒.
    --默认1分钟同一个IP只能请求同一个地址100次
    html=[[Please go away~~]]
    --警告内容,可在中括号内自定义
    备注:不要乱动双引号,区分大小写

参考:

 OWASP Top10

 https://github.com/EnableSecurity/wafw00f 

 https://www.bilibili.com/video/BV1tt4y167CG/

 https://github.com/loveshell/ngx_lua_waf

上一篇:一起聊聊好玩的Openresty


下一篇:redis操作命令