【高性能网关soul学习】18. 插件之 waf

【高性能网关soul学习】18. 插件之 waf

本文目标:

  1. 分析 soul 插件 SentinelPlugin 集成 Sentinel 的源码

官网文档


waf 插件是由 soul网关自己实现的,是 soul 其他插件的前置插件,主要用来拦截非法请求,或者异常请求,并且给与相关的拒绝策略。

Soul 中 Waf 插件启动流程
  • 依次启动 soul-admin、http测试服务、soul-bootstrap 网关服务

    • 不需要额外增加依赖
  • 打开 系统管理 >> 插件 >> 启用 Waf 插件

    • 黑名单模式:当 model 设置为 black 模式,只有匹配的流量才会执行拒绝策略
    • 混合模式:当 model 设置为 mixed 模式,针对不同的流量,可以选择通过或者拒绝
  • 打开 插件列表 >> waf >> 选择器和规则配置

  • 选择器中可以针对 ip 和 host 进行匹配,然后执行拒绝策略,这种配置方式在针对攻击的时候非常有用

WafPlugin 执行流量过滤的原理

WafPlugin 继承于 AbstractSoulPlugin, 因此和其他流量插件一样,核心方法为 doExecute

  • doExecute执行前,已经筛选到了最匹配的规则
  • black模式
  • mixed模式
    • 如果没有配置 选择器和规则,则会直接报错返回403 error
protected Mono<Void> doExecute(final ServerWebExchange exchange, final SoulPluginChain chain, final SelectorData selector, final RuleData rule) {
    WafConfig wafConfig = Singleton.INST.get(WafConfig.class);
    if (Objects.isNull(selector) && Objects.isNull(rule)) {
      // 黑名单模式下,会继续执行
        if (WafModelEnum.BLACK.getName().equals(wafConfig.getModel())) {
            return chain.execute(exchange);
        }
      // 返回拒绝
        exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
        Object error = SoulResultWrap.error(403, Constants.REJECT_MSG, null);
        return WebFluxResultUtils.result(exchange, error);
    }
  // 从匹配的规则中获取配置的属性
    String handle = rule.getHandle();
    WafHandle wafHandle = GsonUtils.getInstance().fromJson(handle, WafHandle.class);
  // 如果未配置则默认允许通过
    if (Objects.isNull(wafHandle) || StringUtils.isBlank(wafHandle.getPermission())) {
        log.error("waf handler can not configuration:{}", handle);
        return chain.execute(exchange);
    }
  // 如果是拒绝策略,则执行拒绝逻辑
    if (WafEnum.REJECT.getName().equals(wafHandle.getPermission())) {
        exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
        Object error = SoulResultWrap.error(Integer.parseInt(wafHandle.getStatusCode()), Constants.REJECT_MSG, null);
        return WebFluxResultUtils.result(exchange, error);
    }
    return chain.execute(exchange);
}

总结

  • 由以上代码克制,Waf 插件的实现非常简单,只是简单的对两种模式及拒绝与否两种状态的判断、考虑选择器与规则未配置的情况等
  • 关键的匹配 selector 和 rule 的逻辑已经在 AbstractSoulPlugin 中进行了实现
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
OpenStar是一个基于OpenResty的,高性能web平台,不仅仅包含了传统WAF的功能模块,还相应增加了其他灵活、友好、实用的功能,是增强的WAF、WEB扩展、CC防护的集合。 WAF防护 在OpenStar中的WAF防护模块,采用传统的黑白名单、正则过滤的方式(有人会问现在不是流行自主学习么;正则、黑白名单会有盲点、会被绕过......)。这里我简单说明一下,自主分析学习引擎是我们的日志分析引擎做的,这里是高性能、高并发的点,就用简单粗暴的方法解决,根据业务实际调整好防护策略,可以解决绝大多数WEB安全1.0和WEB安全2.0类型的漏洞(90% 的问题)。 WAF 防护从header,args,post,访问频率等层面分层进行防护,详细在后面的功能会详细说明 WEB安全1.0 在1.0时代下,攻击是通过服务器漏洞(IIS6溢出等)、WEB应用漏洞(SQL注入、文件上传、命令执行、文件包含等)属于服务器类的攻击,该类型漏洞虽然经历了这么多年,很遗憾,此类漏洞还是存在,并且重复在犯相同的错误。 WEB安全2.0 随着社交络的兴起,原来不被重视的XSS、CSRF等漏洞逐渐进入人们的视野,那么在2.0时代,漏洞利用的思想将更重要,发挥你的想象,可以有太多可能。 WEB安全3.0 同开发设计模式类似(界面、业务逻辑、数据),3.0将注应用本身的业务逻辑和数据安全,如密码修改绕过、二级密码绕过、支付类漏洞、刷钱等类型的漏洞,故注重的是本身产品的业务安全、数据安全。 安全不仅仅是在技术层面、还应该在行政管理层面、物理层面去做好安全的防护,才能提供最大限度的保护。 安全行业多年的从业经验:人,才是最大的威胁;无论是外部、内部、无心、有意过失。(没有丑女人、只有懒女人)我想可以套用在此处,纯属个人见解。 CC/采集防护 什么是CC攻击,简单的说一下,就是用较少的代价恶意请求web(应用)中的重资源消耗点(CPU/IO/数据库等等)从而达到拒绝服务的目的;数据采集,就是内容抓取了,简单这么理解吧  非官方学术类的解释,先将就理解下 于本文对CC攻击的分析和相的防护算法,都是我在实战中分析总结,并形成自己的方法论,不足之处、欢迎指正。 标签:OpenStar  Web框架

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值