在你的群集上验证 Log4j 的版本

Databricks 最近发布了关于 Log4j 2 漏洞(CVE-2021-44228)的研究和评估的博客。 Databricks 不会直接在 Azure Databricks 平台中使用已知受此漏洞影响的 Log4j 版本,我们理解这可能容易受到攻击。

如果你在群集中使用 Log4j(例如,如果你通过 Log4j 处理用户控制的字符串),如果你已安装并正在使用受影响的版本或已安装,你的使用可能会受到攻击传递依赖于受影响版本的服务。

本文解释了如何检查你的群集以获取已安装的 Log4j 2 版本以及如何升级这些实例。

重要

免责声明:本文中提供的建议反映了 Databricks 对此时做出这些决定的方法的最佳理解。 由于我们无法控制你的代码,因此我们无法保证如果你按照这些说明或使用建议的扫描仪未能找到 Log4j,那么受影响的 Log4j 代码一定不会出现在你的代码中。

检查是否安装了 Log4j 2

检查手动安装

手动查看群集上安装的库

如果你已通过 Maven 显式安装了 Log4j 2 版本,则它会列在群集 UI 中的“库”下面。

扫描类路径

扫描你的类路径以检查 Log4j 2 的版本。

  1. 启动群集。

  2. 将笔记本附加到你的群集。

  3. 运行此代码以扫描你的类路径:

    {
      import scala.util.{Try, Success, Failure}
      import java.lang.ClassNotFoundException
      Try(Class.forName("org.apache.logging.log4j.core.Logger", false, this.getClass.getClassLoader)) match {
        case Success(loggerCls) =>
          Option(loggerCls.getPackage) match {
              case Some(pkg) =>
                println(s"Version: ${pkg.getSpecificationTitle} ${pkg.getSpecificationVersion}")
              case None =>
                println("Could not determine Log4J 2 version")
          }
        case Failure(e: ClassNotFoundException) =>
          println("Could not load Log4J 2 class")
        case Failure(e) =>
          println(s"Unexpected Error: $e")
          throw e
      }
    }
    
  • 如果 Log4j 2 不在你的类路径中,你会看到如下结果:

    Could not load Log4J 2 class
    
  • 如果 Log4j 2 在你的类路径中存在,你应该会看到如下结果,其中包括 Log4j 2 版本:

    Version: Apache Log4j Core 2.15.0
    

注意

此方法不识别 Log4j 类被遮蔽或传递包含的情况。

扫描所有用户安装的 jar

在你的群集上找到所有用户安装的 jar 文件并运行扫描程序以检查易受攻击的 Log4j 2 版本。

  1. 启动群集。

  2. 将笔记本附加到你的群集。

  3. 运行此代码以识别 jar 文件的位置:

    import org.apache.spark._
    
    val sparkEnv = SparkEnv.get
    val field = SparkEnv.get.getClass.getDeclaredField("driverTmpDir")
    field.setAccessible(true)
    println(s"Your jars are installed under ${field.get(sparkEnv).asInstanceOf[Option[String]].get}\n")
    
  4. 该代码显示你的 jar 文件的位置。

    Your jars are installed under /local_disk0/spark-1a6be695-9318-463c-b966-256c32e3771c/userFiles-582ca64b-93c9-444c-85b8-7779bd2c5e52
    
  5. 将 jar 文件下载到本地计算机。

  6. 运行 Logpresso 之类的扫描程序来检查易受攻击的 Log4j 2 版本。

重要

免责声明:Logpresso 扫描程序是由第三方提供的开源软件。 Databricks 不对 Logpresso 的功能或质量做任何形式的陈述。

升级你的 Log4j 2 版本

通过群集 UI 升级

  • 如果你通过群集 UI 手动安装 Log4j 2,请确保它是 2.17 或更高版本。 在这种情况下,不需要执行任何操作。
  • 如果你通过群集UI 手动安装 Log4j 2,并且它是 2.16 或更低版本,则应从群集卸载库并安装 2.17 或更高版本。

注意

如果 Log4j 2 是另一个库的传递依赖项,请将使用 Log4j 2 的库升级到安全版本。 你还可以在拉入过时的库时排除 Log4j 2 包,并明确包含 Log4j 2 的安全版本。 但不能保证完全这样做。

通过命令行升级

如果你通过命令行(或通过 SSH)安装了 Log4j 2,请使用相同的方法将 Log4j 2 升级到安全版本。

升级自定义生成的 jar

如果你在自定义生成的 jar 中包含 Log4j 2,请将 Log4j 2 升级到安全版本并重新生成 jar。

将更新后的 jar 重新附加到群集。

升级后重新启动群集

升级 Log4j 2 后,请重新启动群集。