您已从环境中删除了需要昂贵的 Oracle Java SE 通用许可证(与 Oracle 主协议 (OMA) 相关)的所有 Oracle JDK。但现在,您需要防止 Oracle Java“偷偷返回”并触发对 Oracle 的新许可责任。本文将介绍如何禁用 JavaUpdater,探讨其他常见的最新防范方法、其有效性和缺点,并为您在考虑 Java 许可问题时提供几种额外机制。
背景
2023 年 1 月,Oracle 将 Java 的许可要求更改为“所有员工指标”。各公司应该仔细查看实际协议中的具体细节,但在本文中,我们将该协议解释为:如果您安装了一个或多个 Oracle Java SE 实例,则无论安装位置如何,每个实例都要遵守 Oracle 技术网络 (OTN) 许可的要求。您的组织可能需要遵守“所有员工”许可要求,不论实际使用 Java的员工人数为何,甚至不论拥有或使用计算机的员工人数为何。有鉴于此,您的组织可能面临重大财务风险,需要持续保持警惕。
Oracle Java 如何返回到您的环境中?
Oracle Java 有多种方法可以悄悄安装或更新。其中一些方法仅适用于台式机,有些则适用于服务器。请同时考虑这两种环境,因为两者都遵循相同的 Oracle 许可要求。Oracle Java 有多种方法可以安装或更新。
- 用户直接从 download.java.com 或 oracle.com/downloads 下载。
- 用户从外部维护的镜像网站下载。
- 通过 JavaUpdater 后台进程(在 Windows 桌面上)与 Oracle Java 开发工具包 (JDK) 或 Java 运行时环境 (JRE) 一起安装。
- 通过 Java 控制面板小程序一键更新现有 JVM(Java 虚拟机)/JDK。
- 迁移前创建的黄金映像或其他基础虚拟桌面基础架构 (VDI)/映像。
- 迁移 Java 之前创建的备份/恢复映像。
- 操作系统便捷通知:如果系统上未安装 Java,并且用户在命令提示符中输入“Java”,他们将收到一条将其指向 java.com 的消息。
- 许多需要 Java 的旧版应用程序可能会提示用户下载 Oracle Java,较新的应用程序通常需要 OpenJDK,但并非所有情况都是如此。
- JavaScript 有多种功能可以让开发者轻而易举地提供直接下载资源或重定向到 Oracle Java 网站的可单击按钮。
以下是针对上述要点需要考虑的一些注意事项:
仅仅阻止 java.com 和 oracle.com/java/download 是不够的
Java 已经面世近 30 年了。在这段时间里,它经历了多次迭代,包括从免费到付费的转变,具体取决于提供商。由于 Java 十分常用并且 Oracle Java 在许多用例中可以免费使用,Oracle Java 可通过许多 Web 渠道、分销合作伙伴和学术机构获取,其中许多渠道并没有费心去维护或删除可公开获取的 JDK 和 JRE 的完整功能副本。从许可的角度来看,这些旧的二进制文件通常并不造成麻烦(安全性是另一回事),但附带的 Java 更新程序和 Java 控制面板小程序使用户很容易无意中将其安装版本更新到需要 Oracle 许可证的版本。
Azul 为现代云企业提供 Java 平台。数百万 Java 开发人员、数亿设备以及世界上最受认可的企业都信赖 Azul,并相信 Azul 能为他们的应用程序提供卓越的功能、性能、安全性、价值和成功。
我们将讨论适用于仍在部署中的最常见版本 (Java 6-21) 的策略,但您应该注意,某些特定版本的 Oracle Java 需要遵守许可要求。这些特定版本是 8u211+、11、12、13、14、15、16。此外,Oracle 还考虑使用“商业功能”作为其许可要求的另一个触发因素,例如使用 MSI (Microsoft Windows Installer) 或使用 JFR (Java Flight Recorder)。
注:从 2024 年 9 月开始,Oracle Java 17 也需要付费 OTN 许可才能用于商业用途。
务必:
- 阻止下载部分(并且在可行的情况下,阻止特定版本)。
请勿:
- 阻止整个域。Java.com 上拥有丰富的信息、文档和讨论,对任何参与 Java 社区的人都有帮助。
禁用 Java 更新
Oracle Java 包含一个后台(TSR,即终止并驻留)进程,默认情况下启用该进程来检查 Java 的新版本。
您可以禁用这些进程,这不会影响已安装的 Java 的当前工作状态。Azul 建议在注册表级别删除或至少禁用这些进程,并禁止用户使用或重新启用它们。一些旧版本的 Oracle JVM/JRE/JDK 允许卸载更新程序,较新的版本没有分离此组件。请注意,虽然修改或删除 JDK 的任何部分都违反 Oracle 条款,但是,限制对任何文件的访问并不构成违规。
禁用 Java 控制面板小程序
Oracle Java JRE 附带的控制面板小程序(Windows 上为 javacpl.exe)提供一个图形界面来控制 Oracle JVM 的许多方面。我在这里要提醒您注意 WebStart(尽管它没有从 Oracle JVM 中分离),因为控制面板小程序与 WebStart 有着密切的联系,并且开放社区单独实现了其等效功能(在 IcedTea-Web 开源项目中)。控制面板小程序包含一个选项卡,用户使用该选项卡能通过多种方式更新其 Java:
通过设置自动化或单击“立即更新”按钮,用户可以开始下载其 JRE/JDK 的最新版本。
务必:
- 完全禁用此功能,此界面中不会保留任何自助式用户级功能(删除对 javacpl.exe 的访问权限)。
- 了解此界面使用的底层属性文件,并在管理员级别修改/更新这些文件。
- 在 Windows 上,您可以禁用 HLM:\SOFTWARE\JavaSoft\Java Update\Policy 中的两个注册表项“EnableJavaUpdate”和“EnableJavaUpdateCheck”(DWORD)。
- 高级用户应该学习有关 IcedTeaWeb-settings 界面的知识,该界面可取代此功能的大部分内容。
请勿:
- 删除 javacpl.exe,这将违反 Oracle 条款。
更新黄金映像或其他基础 VDI/映像
从快速现场测试和敏捷开发,到生产级机器的标准化,许多企业使用黄金映像来实例化各种用例的虚拟机。这些映像通常包括通用或公司授权的软件,并且可能包括用于服务器的 JRE 或用于开发映像的 JDK。这些映像在实例化之前保持离线状态,同时其磁盘处于存档状态,因此它们可以处于休眠状态,不会被正常的扫描/观测机制检测到。如果它们仍然存在于您的环境中,并且您在生产场景中实例化和使用它们,则这确实会带来风险。
务必:
- 访问您的 VDI/映像存储库,确定 Java 是否包含在标准构建版本或映像中。如果发现 Java,请使用适当的二进制文件重建映像。
- 如果您有在映像启动前分类的功能,请确保使用已更新的 JVM。
请勿:
- 将替换的责任转移到映像用户身上。
- 允许临时使用 Oracle JVM。
- 认为短暂存在的映像不会长期存在。
刷新备份、恢复映像和快照
随着时间的推移,备份等用于恢复的内容将不再成为问题,他们会自然消失。但在迁移后的一段时间内,应特别注意跟踪调用任何这些恢复机制的系统。您应小心备份本身。值得注意的是,Oracle 在某些情况下称备份文件仍然随时可用且易于启用,因此这存在违反许可证的风险。从备份中恢复的系统将受到您现有的软件执行策略的约束,因此请确保尽快获取并修复这些备份。修复后,应创建新的备份/快照,并且在可以的情况下,应离线迁移以前的备份并使其“不可立即使用”。
务必:
- 制作/更新不包含 Oracle Java 的快照。
- 确保执行策略解决多余 Oracle Java 二进制文件的执行问题。
请勿:
- 忽略备份存档,如果这些存档能被使用,就会被使用。
- 认为最终用户会发现这种情况并进行补救。
- 允许更旧版本的(非 OTN)Java 在未经检查的情况下运行,至少检查 Java 更新程序和 Java 控制面板设置。
禁用操作系统和便捷更新
如果用户在命令提示符处输入“java”,或者应用程序在未启用的(不含任何 Java 的)MacOS 系统上请求 Java,操作系统会向您发出响应,让您访问 java.com:
务必:
- 告诉您的用户应该使用哪些 Java 版本(基于公司标准或指南)。
- 通过自助式服务选项使 Java 即刻可用。由于存在许多选项和特定于应用程序的要求,您无法期望应用程序和用户坚持使用特定版本。虽然在主要 Java 版本中可以放心允许一定的灵活性,但我们建议用户尽可能选择(主要版本的)最新补丁版本。
- 考虑使用受支持的 OpenJDK,其中包括及时的安全性更新和补丁更新。
- 通过 https://www.azul.com/downloads 中的 dmg/rpm/msi 安装 Java 运行时。
- 通过自制软件安装/构建 Java
- 通过自制软件安装 OpenJDK@<java version number>
请勿:
- 访问 java.com 并安装其中提到的任何版本。
应对与应用程序打包在一起的 Java
这种情况下您需要小心,并且可能需要与软件供应商沟通。有些应用程序以合法方式将 Java JRE 或 JDK 添加为其安装的一部分,例如使用 Java Compact Profile 的低功耗/物联网设备、网络受限环境中使用的虚拟机映像等。在这些情况下,重要的是正确理解应用程序的支持要求和许可责任。
在大多数情况下,当今的供应商将支持其应用程序在经过 TCK(技术兼容性套件)认证的 OpenJDK 版本上运行。如果供应商确实能证明其软件与 OpenJDK 兼容,那么您选择想要的任何 OpenJDK 发行版均可。供应商可能会使用特定的发行版进行证明,但这可能是出于自身便利或是因为他们理解不充分。供应商应该考虑使其测试针对 OpenJDK 规范,这样您选择任何经过认证的 OpenJDK 均可。如果供应商使用特定发行版的类,他们应该专门记录要求。
在极少数情况下,供应商认为使用除规定的 Oracle JRE 之外的任何 JRE 都会使其支持合同失效。此时,您应该要求获取上述要求的书面文档,并要求文档附上一份声明,表明在您的环境中为此目的使用 Oracle Java 不会使您的组织受到 Oracle 所有员工许可模型的约束。
务必:
- 调查符合这种情况的每个应用程序。可以从访问供应商的网站或联系他们的支持部门来着手。
- 要求获取有关将应用程序迁移到 OpenJDK 的说明。不要担心迁移过程会遇到太多麻烦,尤其是对于较新版本的 Java。
请勿:
- 忽略这种情况。如果没有明确声明免除您对 Oracle 的任何许可责任,则将 Oracle JDK 与第三方应用程序一起使用会使您面临许可风险。
降低因使用 JavaScript 或因从外部站点启用造成的风险
只需一行简单的脚本即可创建 HTML 按钮,用户只需单击一下即可下载 Oracle JDK,并带来新的许可证责任。虽然这些情况通常超出您的控制范围,但您可以采取一些主动步骤。
务必:
- 向您的用户介绍可供他们使用、已批准的 Java 版本。
- 简化相应的下载。
请勿:
- 允许用户继续使用从 java.com 或 oracle.com 下载的 Java。
一般性建议
预防持续的 Oracle Java 许可风险是可行的,但您现在应该清楚,单独的外围策略并不是最佳方法,您还需要风险降低策略并保持合理的警惕。
- 监控 Oracle Java 并尽快修复任何新的 Oracle Java 实例。用 OpenJDK 发行版替换 Oracle JDK 并不困难,并且几乎不会带来兼容性、稳定性或安全风险。您的新 Java(非应用程序)供应商也应该能够为此类工作提供指导。
- 如果您有可用的实时桌面管理解决方案(例如 BeyondTrust、CyberArc 等),请使用这种方案来禁用关键 Java 安装程序、可执行文件和启动程序(java.exe、javaw.exe、javaws.exe、jp2launcher.exe 等)。
- 尽可能使用 Windows 上的组策略。这是控制 Java 是否可以运行或安装的更可靠方法,并且可以通过公司范围的策略集中实施。
- 使用文件系统扫描工具或清单工具来检查安装注册表之外的内容。Flexera 或 Microsoft Endpoint Configuration Manager(前身为 System Center Configuration Manager (SCCM))等工具可以通过配置定期运行完整文件系统扫描。
- Azul 可为客户提供 Azul 迁移咨询工具,这是我们的团队在协助迁移工作时使用的一组发现和迁移 (shell) 脚本示例。
结语
由于 Java 的普遍性以及 Oracle Java 许可模型最近的变更,如果您继续让 Oracle Java 在您的环境中运行,则必须了解您的风险和风险暴露情况。
避免代价昂贵的 Java 许可责任需要持续保持警惕和开展分类。上述指南是一种“尽可能全面”的方法,我相信还有其他机制可以将 Oracle Java 重新引入您的环境中。请随意发表评论并补充您认为可能影响他人的任何发现,我们将尽力提供有关如何分类的建议。如果您想了解更多详细信息或有不适合在公共论坛上分享的疑虑,请联系 [email protected],我们会直接回复您。