Traefik 如何保护应用免受 Log4j2 漏洞的影响

简介: 2021 年 12 月 10 日,Apache Log4j2 中的一个被称为 “Log4Shell” 的漏洞被发布(CVE-2021-44228),引入了严重的安全风险。作为 Java 应用程序日志库中的一个核心组件,其广泛用于著名的开源项目以及企业级后端应用程序。在本文中,我们将向您展示 Traefik 如何基于插件系统帮助我们的业务缓解此问题。

作者 | Manuel Zapf

译者 | Luga Lee      

策划 | Luga Lee

   2021 年 12 月 10 日,Apache Log4j2 中的一个被称为 “Log4Shell” 的漏洞被发布(CVE-2021-44228),引入了严重的安全风险。作为 Java 应用程序日志库中的一个核心组件,其广泛用于著名的开源项目以及企业级后端应用程序。在本文中,我们将向您展示 Traefik 如何基于插件系统帮助我们的业务缓解此问题。

漏洞简介

    Log4j 漏洞使攻击者可以执行任意代码或从被攻击的系统中检索机密信息。可以通过两个不同的步骤来缓解此漏洞:修补系统中的实际漏洞并重新部署它们,或者阻止恶意请求进入反向代理级别。这是可能的,因为在插入可以查询 LDAP 服务器的字符串时出现问题。

   在反向代理级别拦截 Log4j 漏洞

   得知该漏洞后,我们立即寻找帮助我们的用户和客户降低风险的最佳方法。从下图中可以看出,阻止攻击的最合乎逻辑的位置就在网络入口处,即恶意请求到达易受攻击的系统之前。这正是 Traefik 代理所在的位置。


   虽然 HeadersRegexp 匹配器的内部架构允许您阻止简单的请求,例如 curl 127.0.0.1:8080 -H 'User-Agent: jndi:ldap://127.0.0.1/a},但有一种较为容易的方法可以屏蔽用户代理,从而防止对这些标头进行简单的匹配。为了帮助缓解这些问题,我们利用了 Traefik 插件系统。

Traefik 插件

    从 Traefik 2.3 版本开始,Traefik 可以加载和使用自定义插件(在我们的 Go 解释器 Yaegi 的帮助下)充当中间件或提供者,以处理和匹配请求头或用户代理中间件的职责。为了缓解 Log4j 问题,我们需要快速采取行动,而不必消耗大量时间来进行软件的实际发布。因此,我们决定在插件中实现所需的功能。

   插件的代码地址:https://github.com/traefik/plugin-log4shell

   通过利用插件系统,每个 Traefik Proxy 用户或 Traefik Enterprise 客户只需几行配置和重新启动 Traefik 即可有效缓解 CVE。这种做法对双方都有利。我们节省了时间,因为我们不需要经过实际的发布过程,而用户和客户可以更快地访问帮助他们缓解该问题的软件。

   要使用插件,与之前的更新配置流程一样,首先,必须在静态配置中声明它,然后重新启动 Traefik fu w 即可。

    以下为通过命令行进行配置更新:


--pilot.token=xxx
--experimental.plugins.log4shell.modulename=github.com/traefik/plugin-log4shell
--experimental.plugins.log4shell.version=v0.1.1

    或者基于通用的方法在静态文件中进行配置更新

    Yaml 文件模型

pilot:  token: xxx
--pilot.token=xxx
--experimental.plugins.log4shell.modulename=github.com/traefik/plugin-log4shell
--experimental.plugins.log4shell.version=v0.1.1
experimental:
  plugins:
    log4shell:
      modulename: github.com/traefik/plugin-log4shell
      version: v0.1.0

    Toml 文件模型

[pilot]
    token = "xxx"
[experimental.plugins.log4shell]
    modulename = "github.com/traefik/plugin-log4shell"
    version = "v0.1.0"

    一旦插件安装完成并重新启动 Traefik 后,插件充当普通中间件,此时,我们需要在路由器上进行引用:


http:
  middlewares:
    log4shell-foo:
      plugin:
        log4shell:
          errorCode: 200
  routers:
    my-router:
      rule: Host(`localhost`)
      middlewares:
        - log4shell-foo
      service: my-service
  services:
    my-service:
      loadBalancer:
        servers:
          - url: 'http://127.0.0.1'

    除此之外,也可以在 K8s Ingress 或 K8s Ingress Route 上进行引用。

    K8s Ingress:


---
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: log4shell-foo
spec:
  plugin:
    log4shell:
      errorCode: secretName
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myingress
  annotations:
    traefik.ingress.kubernetes.io/router.middlewares: log4shell-foo@kubernetescrd
spec:
  rules:
    - host: example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name:  whoami
                port:
                  number: 80

    K8s Ingress Route:


---
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: log4shell-foo
spec:
  plugin:
    log4shell:
      errorCode: secretName
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: whoami
spec:
  entryPoints:
    - web
  routes:
    - kind: Rule
      match: Host(`whoami.example.com`)
      middlewares:
        - name: log4shell-foo
      services:
        - kind: Service
          name: whoami-svc
          port: 80

    基于此插件中间件并准备好相关配置更新,即便更棘手的查询,比如 curl 127.0.0.1:8080 -H 'User-Agent: ${${lower:j}ndi:ldap://127.0.0.1/a} 在入口控制器级别也能够有效阻止,因此,后端服务免受传入的恶意请求。

    结论

    除了 CVE-2021-44228 漏洞之外,还有第二个 CVE 发布 (CVE-2021-45046) 用于 Log4shell 中一个不太严重的漏洞,这将迫使管理员、操作员和开发人员再次更新他们的所有应用程序并执行新的部署集。基于 Traefik 的保护,使得后端服务器免受漏洞的压力就变得尤为渺小,毕竟, Traefik 阻止了外部攻击。这不会使更新实际应用程序过时,但它消除了这样做的直接压力。

    这种缓解措施并不是 Traefik 可以帮助您保护后端应用程序的唯一方式。中间件,例如 Rate-Limiting 或 Traefik Enterprise 的增强功能,也有助于保护您的系统免受各种攻击。


  # 参考


相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
27天前
|
存储 运维 监控
【Flume】flume 日志管理中的应用
【4月更文挑战第4天】【Flume】flume 日志管理中的应用
|
2月前
|
监控 Serverless 数据库
Serverless 应用引擎常见问题之biphon-education-配置了SLS后一直重启如何解决
Serverless 应用引擎(Serverless Application Engine, SAE)是一种完全托管的应用平台,它允许开发者无需管理服务器即可构建和部署应用。以下是Serverless 应用引擎使用过程中的一些常见问题及其答案的汇总:
28 5
|
2月前
|
运维 监控 数据挖掘
应用研发平台EMAS产品常见问题之将阿里后台的日志落到我们后台失败如何解决
应用研发平台EMAS(Enterprise Mobile Application Service)是阿里云提供的一个全栈移动应用开发平台,集成了应用开发、测试、部署、监控和运营服务;本合集旨在总结EMAS产品在应用开发和运维过程中的常见问题及解决方案,助力开发者和企业高效解决技术难题,加速移动应用的上线和稳定运行。
|
3月前
|
Web App开发 前端开发 JavaScript
乱花渐欲迷人眼 - 让 SAP UI5 应用的日志输出不再素面朝天
乱花渐欲迷人眼 - 让 SAP UI5 应用的日志输出不再素面朝天
48 0
|
4月前
|
存储 监控 iOS开发
iOS应用崩溃了,如何通过崩溃手机连接电脑查找日志方法
在iOS应用开发过程中,调试日志和奔溃日志是开发者必不可少的工具。当iOS手机崩溃时,我们可以连接电脑并使用Xcode Console等工具来查看日志。然而,这种方式可能不够方便,并且处理奔溃日志也相当繁琐。克魔助手的出现为开发者带来了极大的便利,本文将详细介绍其功能和使用方法。 克魔助手会提供两种日志,一种是实时的,一种的是崩溃的。(由于崩溃日志的环境很麻烦,目前只展示实时日志操作步骤)
|
3月前
电子书阅读分享《Elasticsearch全观测技术解析与应用(构建日志、指标、APM统一观测平台)》
电子书阅读分享《Elasticsearch全观测技术解析与应用(构建日志、指标、APM统一观测平台)》
235 1
|
3月前
让 SAP UI5 应用的日志打印变得五彩缤纷试读版
让 SAP UI5 应用的日志打印变得五彩缤纷试读版
98 2
|
4天前
|
Dubbo Java Serverless
Serverless 应用引擎操作报错合集之Nacos中nacos启动正常,访问白页,启动日志显示正常如何解决
Serverless 应用引擎(SAE)是阿里云提供的Serverless PaaS平台,支持Spring Cloud、Dubbo、HSF等主流微服务框架,简化应用的部署、运维和弹性伸缩。在使用SAE过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
11 0
Serverless 应用引擎操作报错合集之Nacos中nacos启动正常,访问白页,启动日志显示正常如何解决
|
9天前
|
监控 JavaScript Java
|
16天前
|
存储 Prometheus 监控
Flask监控与日志记录:掌握应用运行状况
【4月更文挑战第16天】本文介绍了在Flask应用中实现监控和日志记录的方法,以确保应用稳定性和问题排查。推荐使用Prometheus、Grafana、New Relic或Flask-MonitoringDashboard等工具进行监控,并通过Python的logging模块记录日志。监控集成涉及安装配置工具、添加监控代码,而日志管理则需要集中存储和使用分析工具。安全是关键,要防止未授权访问和数据泄露,避免记录敏感信息。监控和日志记录有助于提升应用性能和用户体验。