作者:Erik Costlow
译者:弯月
原文:https://foojay.io/today/log4j-isnt-killing-java/
译文:https://blog.csdn.net/csdnnews/article/details/121951895
Java 作为顶级编程语言之一,已经在企业级软件开发领域活跃 25 年了。有人不断宣传 Java 已死,同时也有人坚称 Java 活得好好的。最近,又有报道称 log4j 2 漏洞将再次“杀死” Java。我们曾开玩笑说,Java 博物馆就好像是一个墓园,记录了每一次“死亡”的经过。
本文将简单介绍一下 Java 生态系统,说明什么是日志记录框架、在何处使用以及使用的原因,此外,还将介绍各个团队应当如何观察和控制 JVM 的行为。
1、Java 开发人员应该做哪些安全工作
快速给 JDK 和库打补丁是当前最有效的技术,可避免绝大多数大规模的黑客攻击。
给库文件打补丁(必需)
当代码库中存在漏洞时,最有效的技术就是打补丁以去除漏洞。如果不给库文件打补丁,那么应用程序很有可能被黑客入侵,攻击者将获得系统及其数据的完整访问权限。
无论在何种情况下,通常打补丁都很有效。
日志框架可能来自任何依赖项,可能由另一个库引入(即传递依赖项),而非由开发人员添加(即直接依赖项)。我们可以使用依赖项分析工具,例如 Contrast Community Edition,来检测依赖项和其他自定义的漏洞。
此外,还有一些分析依赖关系的开源工具,比如 Maven 依赖树(dependency:tree)和 Gradle 依赖树。NetBeans 等 IDE 也提供了依赖关系图可视化工具。
对于 log4j2 漏洞,你必须升级到 2.15.0 或更高版本。
给 JRE 打补丁,升级到 Java 的安全基线(推荐,定期执行)
每个Java 主要版本都会维护一个安全基线。由于每个季度 JDK 都会提供带有新安全改进的补丁,因此这个安全基线也会不断向前移动。低于安全基线的 Java 包含已知的安全问题,应该升级。
这是标准的安全最佳实践,与 log4j 2 漏洞没有直接关系,也不会修复该漏洞。
各个团队可以使用 Foojay Disco API 自动监控安全基线,并及时地升级系统。开发人员可以将这个更新与 GitHub 操作相结合,确保在每次构建代码时,都使用最新的安全更新。如果发生安全事件,则立即升级 JRE,同时重新构建并重新部署代码。下面这个测试矩阵中就包含了这类的 GitHub 操作(https://github.com/foojayio/discoTestingMatrix)。
推荐一个 Spring Boot 基础教程及实战示例:https://github.com/javastacks/spring-boot-best-practice
Java 安全基线的升级时间为:每年 1 月、4 月、7 月和 10 月,17 日前后的周二。详细信息包含在Oracle 重要补丁更新计划(https://www.oracle.com/security-alerts/)中,OpenJDK 漏洞组(https://foojay.io/pedia/security-vulnerability-management/)也采用了同一个计划。此外,如果出现重大问题,Oracle 还会提供计划外的安全更新。但 log4j 2 漏洞不属于这种情况。
另外,最新最全的 Java 面试题整理好了,微信搜索Java面试库小程序在线刷题。
以下配置演示了如何使用 Java 11 的安全基线:
jobs:
java11:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
update: [x]
package: [jdk, jre]
fail-fast: false
max-parallel: 4
name: ${{ matrix.package }} 11.0.${{ matrix.update }}, ${{ matrix.os }}
steps:
- uses: actions/checkout@v1
- name: Set up JDK 11 Zulu
uses: foojayio/setup-java@disco
with:
java-package: ${{ matrix.package }}
java-version: 11.0.${{ matrix.update }}
distro: zulu
- name: java -version
run: java -version
定期检测自定义安全漏洞(推荐测试采用)
例如,集成分析器不只是简单地检查 log4j2 存在与否及其版本,而且还可以确定攻击者是否可以控制远程日志输入。
此外,Contrast Community Edition 之类的免费分析器还能够即时捕获 log4j 2,并捕获许多其他的安全漏洞,例如:
使用 JDK Flight Recorder 监控安全事件
JDK Flight Recorder 是现代 OpenJDK 发行版中包含的性能分析工具,它不仅可以生成一些安全信息,而且开销非常低。各个团队可以使用 JDK Flight Recorder 来记录许多 IO 操作,例如 JRE 访问了哪些文件,或者哪些类会被反序列化。
通过使用 JDK Flight Recorder 监视 Java 应用程序事件,并通过数据流将事件传输到安全信息和事件管理(Security Information and Event Management,即SIEM)系统中,Java 团队就可以监视异常行为,并通过可防止漏洞的 Java 反序列化过滤器来检查各个类是否安全。
2、哪些安全措施没有太大作用
对于 log4j 2 漏洞的问题,Web Application Firewall(WAF)之类基于网络的防御和工具可能在短期内有一定的效果,但通常都没有太大作用,而且工作量非常大。
![99892fd2a5c63bd5ca6f383c36711653.png](https://i-blog.csdnimg.cn/blog_migrate/a6abcfcccf7f723a3f5c9b29e1c0a94b.png)
图:该图演示了网络层无法检测到的漏洞
系统属性和动态补丁的效果一般
有几个补丁和系统属性可以控制 log4j 2 的行为并阻止攻击。有时候,有些库无法及时更新,或者团队在努力更新依赖项,但需要一定的时间,在这两种情况下,就可以考虑这几个补丁和系统属性。
最新面试题整理好了,大家可以在Java面试库小程序在线刷题。
相关的 Java 系统属性有两个:
将这两个属性设置为 false 可以阻止远程攻击。
还有一个动态的补丁,它可以连接到正在运行的 JVM 并给其打补丁。这个补丁必须在 JVM 每次启动时应用。虽然这两种方法有一定的作用,但相较而言,更新库更简单。
3、Java 如何处理日志
Java 开发人员一般可以从多个日志系统和记录方式中进行选择。多年来,随着社区的发展,许多日志框架也可以协同工作了:
JDK Logger(2004 年推出)是 Java 1.4 中引入的日志系统。由于 JDK 中大量使用了该日志系统,因此变得很流行,但是 API 有点蹩脚。虽然这个日志系统也不错,但不如其他框架。
Log4j 和 Log4j2 是社区推荐的日志系统,二者改进了 API,因此开发团队可以更轻松地控制记录的内容以及各个级别的日志记录数据的方式。
JBoss Logger 是 JBoss 生态系统中的另一个流行的日志系统。该系统性能良好,而且运行速度很快。如今它还支持其他流行框架,如 Quarkus。
2022年推荐的日志系统
依赖项越少越好,项目越新越好,因此我们可以考虑 System Logger。
有些项目拥有大量依赖项,但优势在于它们使用的日志记录工具与大多数的依赖项相同,只不过选用了其他日志记录方式。
如果你没有任何日志系统,则可以考虑 System Logger,它是一款拥有良好 API 的 JDK 日志记录工具。
日志系统到底是做什么的?
日志框架能够让应用程序的主人看到通用格式的日志消息、时间戳、线程名称以及其他数据。
此外,团队可以将不同的输出重定向到不同的位置,甚至无需显示出来,例如,你可以将访问日志发送到一个文件,将系统报告发送到其他地方,然后选择显示所有级别的日志信息,或者动态查看某个库的调试信息。
1. 回复“m”可以查看历史记录;
2. 回复“h”或者“帮助”,查看帮助;
开发者已开通多个技术群交流学习,请加若飞微信:1321113940 (暗号k)进开发群学习交流
说明:我们都是开发者。视频或文章来源于网络,如涉及版权或有误,请您与若飞(1321113940)联系,将在第一时间删除或者修改,谢谢!
面向全栈工程师的开发者
专注于前端、Java/Python/Go/PHP的技术社区