龙空技术网

使用 Pipy 和 ModSecruity 打造可编程的 WAF

opendotnet 63

前言:

目前姐妹们对“dotnetspider真难用”大约比较注意,各位老铁们都需要了解一些“dotnetspider真难用”的相关文章。那么小编同时在网络上汇集了一些有关“dotnetspider真难用””的相关文章,希望姐妹们能喜欢,你们一起来学习一下吧!

在不断变化、快速发展的网络安全领域,保护网络应用程序免受恶意攻击至关重要。这就是网络应用防火墙 (Web Application Firewalls,WAF) 发挥关键作用的地方。WAF 是一种旨在通过分析 HTTP 流量来保护网络应用程序免受各种攻击的安全措施。它在用户和网络应用程序之间充当中介,过滤并阻止恶意请求。实施 WAF 的一些主要好处包括:

1. 威胁预防:WAF 旨在缓解广泛的常见漏洞和基于 Web 的攻击技术。这包括解决 OWASP 十大漏洞,如 SQL 注入 (SQLi)、跨站脚本 (XSS)、本地文件包含 (LFI)、远程文件包含 (RFI) 等。WAF 通过有效阻止恶意流量并过滤出恶意负载来实现这一目标。

2. 针对应用的安全性:WAF 提供了针对其保护的特定 Web 应用程序量身定制的安全层,允许自定义和细化安全规则以满足应用程序的独特需求。

3. 合规和监管要求:WAF 通常通过提供针对已知漏洞的保护并确保敏感数据的安全来帮助组织满足合规性标准。

4. 事件监控和报告:WAF 生成的日志和报告使安全团队能够监控和调查潜在事件,有助于事件响应和取证分析。

在所有流行且强大的 WAF 中,ModSecurity 以其健壮和有效的解决方案而脱颖而出。ModSecurity 是一款开源的,跨平台的网络应用防火墙 (WAF) 引擎。在这篇博客文章中,我们将深入探讨 Pipy[1],这是一个高性能、轻量级的可编程网络代理,以及 Libmodsecurity[2] - ModSecurity v3 项目的开源组件。

libmodsecurity 代码库充当 ModSecurity 连接器的接口,接收 Web 流量并应用传统的 ModSecurity 处理。一般来说,它提供了加载/解释以 ModSecurity SecRules 格式编写的规则并将其应用于应用程序通过连接器提供的 HTTP 内容的功能。

Pipy 通过 Native Module Interface (NMI)[3] 提供了一个扩展机制,允许编写原生 C 接口的外部模块进行交互,我们将利用 Pipy NMI 与 libmodsecurity 或者 libmodsecurity 术语中的Connector进行连接。

通过结合 Pipy 的网络流处理、libmodsecurity 的 WAF 功能,以及广受认可的 OWASP ModSecurity 核心规则集 (CRS)[4] 中精心挑选的安全规则集,我们可以创建一个非常强大且可编程的网络应用防火墙,其主要优势如下:

1. 可编程性:Pipy 通过其类似 JavaScript 的语言 PJS[5] 具有极高的可编程性,与依赖 YAML 配置文件和类似方法的其他产品相比,可以提供完全的控制权和无与伦比的自由。

2. 完全控制:Pipy 给你完全的控制权,不代表你做决定。Pipy 的真正力量在于提供了一系列基本的可插拔构建块,称为“过滤器”,并且不对它们的组合方式施加任何限制。

3. 平台无关:通过 Pipy NMI 编写模块,可以在 Pipy 上以原生方式运行模块,可以在从边缘到 Kubernetes 的各种平台上部署。

4. 实时监控:通过 Pipy 作为网络流处理器拦截和 ModSecurity 实时分析请求和响应,提供对攻击的实时防护。

5. 威胁检测和预防:通过其规则集,ModSecurity 检测并阻止各种类型的攻击,如 SQL 注入、跨站脚本、命令注入等,保护网络应用程序免受潜在的漏洞威胁。

6. 自定义规则开发:ModSecurity 允许用户创建和自定义规则以满足特定的应用程序需求。这种灵活性确保防火墙可以适应独特的用例和安全需求。

7. 日志和报告:ModSecurity 维护对所有安全事件的详细日志,包括检测到的攻击和阻止的请求。这些日志有助于取证分析,并提供对潜在安全漏洞的洞察。

8. 积极的安全模型:ModSecurity 遵循积极的安全模型,这意味着它只允许已知的安全请求并阻止任何偏离预期模式的请求。这种方法确保了主动防御态势。

前提条件

1. 下载编译好的二进制文件,或自行编译 Pipy[6]

2. 下载并安装 libmodsecurity[7]

3. 下载并编译 ModSecurity-Pipy[8] 连接器。

4. 下载并解压 OWASP ModSecurity Core Rule Set (CRS)[9]

将 ModSecurity-Pipy 模块加载到 Pipy 中

打开文本编辑器,如 vim 或其他,粘贴以下 PJS 内容,保存为文件 main.js。

pipy()

.import({

__msc_inbound: 'mod-sec',

__msc_intervention: 'mod-sec',

__msc_warnings: 'mod-sec',

__msc_rules: 'mod-sec',

})

.listen(8080)

.demuxHTTP().to(

$=>$

.onStart(() => void(

__msc_inbound = {...__inbound},

__msc_warnings = [],

__msc_rules = `

SecRuleEngine On

SecResponseBodyAccess On

SecStatusEngine On

SecAuditEngine RelevantOnly

SecAuditLogRelevantStatus "^(?:5|4(?!04))"

SecAuditLogParts ABIJDEFHZ

SecAuditLogType Serial

SecAuditLog modsec_audit.log

include location_of_owasp_crs/crs-setup.conf

include location_of_owasp_crs/rules/*.conf

`,

))

.use('./bin/modsecurity-nmi.so','request')

.branchMessage(

() => (__msc_intervention.disruptive), (

$=>$.replaceMessage(()=>(

(__msc_intervention?.log && console.log(__msc_intervention.log)),

new Message({ status: __msc_intervention.status }, 'Forbidden' )

))

),

() => (__msc_intervention.status && __msc_intervention.status != 200), (

$=>$.replaceMessage(()=>(

(__msc_intervention?.url) && console.log(`Redirecting to ${__msc_intervention.url}`),

new Message({ status: __msc_intervention.status,

location: __msc_intervention.url })

))

),

() => (__msc_intervention.status == 200),

(

$=>$.muxHTTP().to(

$=>$.connect('your_service_host:port')

)

)

)

.use('./bin/modsecurity-nmi.so','response')

.branchMessage(

() => (__msc_intervention.disruptive), (

$=>$.replaceMessage(()=>(

(__msc_intervention?.log && console.log(__msc_intervention.log)),

new Message({ status: __msc_intervention.status }, 'Forbidden' )

))

),

(

$=>$

)

)

.handleMessageEnd(() => __msc_warnings.forEach(w => console.log(w)))

)

说明:

• 我们直接使用变量 __msc_rules 嵌入规则。你也可以使用其他方式如 __msc_rules_file 来指定本地文件的路径,或者通过设置 __msc_rules_remote 来远程加载规则。确保将 location_of_owasp_crs 更改为解压 OWASP CRS 的位置。

• listen(8080) 指示 Pipy 在本地机器的端口 8080 上启动一个连接监听器。可以根据需求进行修改为其他端口。

• .use('./bin/modsecurity-nmi.so','request') 是让 Pipy 加载指定位置的外部 NMI 模块。请确保将其调整到编译 ModSecurity-Pipy 连接器的位置。第二个参数指定此模块的 request 管道,因为我们在 demuxHTTP 过滤器后加载它。因此,解码的请求消息会作为该 NMI 模块的输入。

• 我们使用 branchMessage 分支过滤器来处理 NMI 模块的输出。在这里,我们根据 Intervention 状态来决定执行哪个操作。

• connect('your_service_host:port') - 使用希望保护的服务地址替换 your_service_host:port。

• use('./bin/modsecurity-nmi.so','response') 表示我们希望 Pipy 使用 NMI 模块的 response 管道布局创建一个子管道。由于我们将它放在 muxHTTP() 过滤器后,所以我们的 response 管道的输入将是 muxHTTP() 的输出,也就是服务生成的响应。

• 我们检查响应中的 Intervention 状态,并返回 Intervention 状态代码和 "Forbidden" 消息。

• 最后,最后一行只是打印由 libmodsecurity 生成的所有警告或事务日志,这是应用了我们提供的规则的结果。

如上所见,作为开发者,可以完全控制要执行的动作以及如何处理生成的结果。Pipy 不会替你做任何决定;它处理较低级别的网络处理,而其模块则在 Pipy 提供的较高级别的抽象上运行。

ModSecurity-Pipy 从 Pipy 接收 HTTP 流量,并向 libmodsecurity 提供所需的数据,包括:

1. 连接详情(客户端 IP、客户端端口、服务器 IP、服务器端口)

2. HTTP URI 和如 Scheme、Protocol 和 Method 的详细信息

3. HTTP 请求头

4. HTTP 请求体

5. HTTP 响应头

6. HTTP 响应体

它从 libmodsecurity 中检索响应,并将其提供给 PJS 开发者,以决定如何处理它。

运行演示

根据具体路径调整上述 PJS 脚本,并执行以下命令:

path_to_pipy_binary/pipy script_file_you_saved_above_pjs.js

例如,如果你将 Pipy 二进制文件下载或编译到同一文件夹,并将你的 PJS 脚本命名为 main.js,你可以运行命令:

./pipy main.js

确保你提供了正确的 NMI 模块和规则文件的路径。将会看到 Pipy 正在运行,并显示管道和它正在监听的端口。

现在,尝试调用一些包含跨站脚本/SQL 注入/目录遍历的 URL,将会从 Pipy 代理收到 "403 Forbidden" 的响应。同时,Pipy 控制台上会显示所有 ModSecurity 生成的日志。

可以使用 URL 进行测试:

 # Directory Traversal protection

curl ""

# Restricted command protection for a restricted file

curl ""

# XSS

curl ""

# Unix Shell

curl ""

总结

总的来说,Pipy、libmodsecurity 和 OWASP CRS 的结合提供了一个极其强大且可适应的 Web 应用防火墙解决方案。借助 Pipy 的可编程性、ModSecurity 的全面安全特性,以及业界认可的 OWASP CRS,企业可以提高他们的 web 应用安全性,有效抵御不断演变的网络威胁。

引用链接

[1] Pipy:

[2] Libmodsecurity:

[3] Native Module Interface (NMI):

[4] OWASP ModSecurity 核心规则集 (CRS):

[5] PJS:

[6] Pipy:

[7] libmodsecurity:

[8] ModSecurity-Pipy:

[9] OWASP ModSecurity Core Rule Set (CRS):

[10] Pipy 网站:

标签: #dotnetspider真难用