“Kubernetes Ingress with mod_security and OWASP”——我们在今天的博文中展示了这一切的意义。

在今天的博文中,我们将向您展示一种阻止恶意流量离开 Kubernetes 集群的方法。我们从“零信任”的技术魔盒中抓出一个话题,立即解开技术术语的魔幻。

目标是正确设置 Nginx Ingress 和 WAF 以保护所有 Web 服务

opensight.ch — roman husler

Image - 本博客的目标。 Kubernetes NGINX 控制器 WAF 的网络安全中心。 Kibana 中的仪表板

Mod_Security 是一个开源的 web 应用程序防火墙 (WAF),由各种 Web 服务器(NGINX、Apache、IIS)支持,自 2002 年以来一直存在。OWASP 组织提供了相应的Core Rule Set (CRS ) 用于防火墙,它将各种恶意流量拒之门外。

条款

Kubernetes(也称为“K8s”)是最初由 Google 开发的开源 contrainducer 编排引擎。

下面是一个简化的参考架构示例,通常以类似的形式出现——不同之处取决于云提供商。传入流量首先通过负载均衡器(在我们的裸机测试集群“MetalLB”中)路由到所示的两个 Kubernetes 节点之一。 “NGINX 入口控制器”确保在每个 Kubernetes 节点上运行 NGINX 服务(容器),充当 SSL 终止和反向代理,然后最终通过所谓的“Kubernetes 服务”将流量转发到正确的容器。 Web 服务/微服务在容器上执行。这些微服务使敏感数据可用,因此我们不希望将它们暴露给未经过滤的网络流量——零信任。

因此,我们今天想从 NGINX 服务(绿色)开始,并使用Web 应用程序防火墙 (WAF) 检查传入流量,以提高集群中的一般安全性。我们正在使用名为“mod_security”的开源 WAF,并将使用开放 Web 应用程序安全项目 (OWASP) 核心规则集 (CRS),我们将根据它检查传入流量。

顺便说一句,在 Microsoft Azure 的情况下,提供了“Azure Web 应用程序防火墙”服务,该服务也是基于本博客中描述的 OWASP 规则集。 Azure 服务的定价可在链接的网站上找到。

开放式 Web 应用程序安全项目 (OWASP)

OWASPModSecurity 核心规则集 (CRS) 是一个可免费访问的“检测规则”集合,即可用于检查传入流量的规则。然后可以将这些规则与兼容的 Web 应用程序防火墙(例如 Mod_Security)结合使用。

“核心规则集”的开发旨在保护 Web 应用程序免受各种已知攻击,包括“OWASP 十大”。这是 Web 应用程序中最常发生的安全风险和安全漏洞的前 10 名列表,每 3 年重新定义一次。

核心规则集当前包含保护我们的 Web 服务免受以下风险的规则:

  • SQL注入(SQLi)

  • 跨站脚本(XSS)

  • 本地文件包含 (LFI)

  • 远程文件包含 (RFI)

  • PHP代码注入

  • Java 代码注入 HTTPoxy

  • 冲击波

  • Unix/Windows Shell 注入

  • 会话固定

  • 脚本/扫描仪/机器人检测

  • 元数据/错误泄漏

休斯顿,我们有问题

首先,作为测试,我们向其中一个测试 Web 服务发送 HTTP 请求。我们以这样一种方式设计请求,使其看起来像SQL 注入攻击。您也可以使用自己现有的 Web 服务之一进行测试——我们只是假设我们的微服务有一个“用户”端点并发送一个示例 SQL 注入(“ExampleSQLInjection”-“)。为此,我们使用著名的工具“邮递员”。正如你所看到的,我们从微服务获得了一个 Swagger 文档作为响应——因此流量未经过滤就发送到微服务——休斯顿,我们遇到了问题。

让我振作起来,斯科蒂

为了提高安全性,我们现在对 Kubernetes 中的 NGINX 入口控制器进行了一些更改。

我们在 Kubernetes 中编辑 NGINX 入口控制器的配置映射并激活“mod_security”,以及 OWASP CRS(开放 Web 应用程序安全项目 - 核心规则集)。根据文档,在“modsecurity-snippet”行的帮助下,我们可以在 nginx.conf (“modsecurity_rule”) 中写几行,以便真正激活引擎。 (默认情况下,引擎仅在“DetectionOnly”模式下运行)。

kubectl 编辑 configmap openzilla-ingress-ingress-nginx-controller -n ingress-nginx

...

api版本:v1

数据:

启用-modsecurity:“真”

启用-owasp-modsecurity-crs:“真”

modsecurity-snippet: |-

SecRuleEngine 开启

SecRequestBodyAccess 开启

SecAuditLog /var/log/modsecurity_audit.log

SecAuditLogParts ABCIJDEFHZ

SecAuditEngine RelevantOnly

种类:ConfigMap

元数据:

注释:

......

PS:如果需要,您也可以在 ConfigMap 中定义自己的 Mod_Security Rules,例如将您知道的 IP 地址列入白名单:“**SecRule REMOTE_ADDR “@streq 192.168.254.1” \allow,phase:1,nolog **”或停用现有规则。

如果我们现在连接到 Kubernetes 中的 NGINX Ingress Controller Pod 之一,我们将在“/etc/nginx/owasp-modsecurity-crs”下找到核心规则集(此处对应的GIT 存储库)。在 nginx.conf 中,我们看到相应的配置文件也已包含在内:

...

modsecurity_rules_file /etc/nginx/owasp-modsecurity-crs/nginx-modsecurity.conf;

...

看起来不错——现在让我们用 Postman 再次运行上面的测试。

现在,NGINX Ingress 和 Mod_Security 已经停止了 Web 服务的流量——太棒了!

如果我们检查 Mod_Security 日志文件,我们会看到请求被阻止,因为根据 CRS(REQUEST-942-APPLICATION-ATTACK-SQLI.conf)中的规则“942100”检测到 SQL 注入。

这是 Kubernetes NGINX Ingress Controller 的基本配置。在我们的下一篇文章中,更多有关将日志摄取到 Elasticsearch 和仪表板创建的配置。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐