Liberty:Java 2 安全性
Java™ 2 安全性 功能在 WebSphere® Application Server Liberty 中受支持。Java 2 安全性提供基于策略的细颗粒度访问控制机制,此机制通过在允许对某些受保护的系统资源进行访问前检查许可权来提高整体系统完整性。
Java 2 安全性独立于 Java Platform Enterprise Edition 的基于角色的授权。Java 2 安全性保护对系统资源(例如,文件输入和输出、套接字和属性)的访问;而 Java Platform Enterprise Edition 安全性保护对 Web 资源(例如,servlet 和 JSP 文件)的访问。
用于部署者和管理员的 Java 2 安全性
启用 Java 2 安全性之前,需要确保所有应用程序被授予所需许可权,否则,应用程序可能运行失败。缺省情况下,系统会针对每个 Java Platform Enterprise Edition 7.0 规范向应用程序授予许可权。如果应用程序未准备好使用 Java 2 安全性 或者应用程序提供程序未在应用程序中提供 permissions.xml 文件,那么启用 Java 2 安全性时,该应用程序可能导致运行时发生 Java 2 安全性 访问控制异常。即使应用程序正在运行,它也可能不会正常运行。用于应用程序开发者的 Java 2 安全性
应用程序开发者必须了解在缺省 WebSphere 策略中授予的许可权及 Java SDK API 的许可权需求。您需要知道应用程序调用的 API 是否需要额外许可权。有关哪些 Java API 需要许可权的更多信息,请参阅 Java 2 SDK 中的许可权。许可权是通过
permissions.xml 文件添加至应用程序的,与所列示许可权相关联的代码库基于该文件的位置。对于独立 .war 应用程序,permissions.xml
文件捆绑在 META-INF 目录中,并且所有指定许可权适用于 .war 文件中包含的所有模块。对于 .ear
应用程序,permissions.xml 直接捆绑在 .ear 本身的 META-INF 目录下,指定许可权适用于 .ear 文件中包含的所有模块。
注: 对于
.ear 应用程序,捆绑在 .ear 以外的任何模块的 META-INF 目录下的 permissions.xml 文件被忽略。
启用 Java 2 安全性
Java 2 安全性功能包含在内核扩展中,在引导时通过使用 websphere.java.security 属性更新 bootstrap.properties 文件启用。如果在 bootstrap.properties 文件中指定了 websphere.java.security 属性,那么系统会强制实施 Java 2 安全性;否则,不会进行许可权检查。
指定受限许可权
Liberty 提供一种机制以在运行 Web 或 EJB 应用程序组件时指定受限许可权。受限许可权确保不向捆绑软件或应用程序授予该许可权的任何实例。它们提供一种机制以阻止应用程序向其自身授予必须允许的许可权之外的其他许可权,例如,退出 VM 的许可权。受限许可权是在
server.xml 文件和 client.xml 文件中指定的。以下示例显示如何限制用于编写系统属性 os.name 的 PropertyPermission。此语法在
server.xml 文件和 client.xml 文件中完全相同:
<javaPermission className="java.security.PropertyPermission" name="os.name" actions="write" restriction="true" />
授予许可权
OSGi 捆绑软件可自我调整通过 permissions.perm 文件向该捆绑软件内的库/类授予的许可权。应用程序也可自我调整通过 permissions.xml 文件授予或通过在 server.xml 文件和 client.xml 文件中指定许可权授予来授予的许可权。
OSGi 捆绑软件许可权
OSGi 规范提供一种机制以通过捆绑软件的 OSGI-INF 目录中的 permissions.perm 文件指定对捆绑软件的许可权。此机制允许对捆绑软件的许可权进行细颗粒度访问控制。permissions.perm
文件指定捆绑软件需要的最大许可权。
要点: 空 permissions.perm 文件不等于没有 permissions.perm 文件。如果您想要获取受限许可权,请确保您具有非空
permissions.perm 文件。
在 server.xml 和 client.xml 中对应用程序声明许可权
server.xml 文件和 client.xml 文件中定义的不带指定代码库的许可权适用于该 Liberty 服务器上的所有应用程序。可按以下示例中所示在
server.xml 文件和 client.xml 文件中指定要授予的许可权:在此示例中,授予允许读取所有系统属性的 PropertyPermission:
<javaPermission className="java.util.PropertyPermission" name="*" actions="read" />
可在
server.xml 文件和 client.xml 文件中指定要限制的许可权。以下示例显示如何限制用于编写系统属性 os.name 的 PropertyPermission。此语法在
server.xml 文件和 client.xml 文件中完全相同:
<javaPermission className="java.security.PropertyPermission" name="os.name" actions="write" restriction="true" />
注释:
- 受限许可权的 restriction 设置为 true。
- 如果应用程序尝试向其自身授予定义为受限许可权的许可权,那么受限许可权优先于授权并且不允许授权。
在 permissions.xml 中对应用程序声明许可权
permissions.xml 文件是 Java EE7 规范引入的新文件。它被打包在应用程序目录的 META-INF 目录下。对于打包为独立 .war 文件的应用程序,在 META-INF WAR 级别指定的许可权适用于打包在 .war 文件中的所有模块和库。
对于打包在 .ear 文件中的应用程序,必须在 .ear 文件级别声明许可权。此许可权集适用于打包在 .ear 文件或其所包含模块中的所有模块和库。这类打包模块中的任何 permissions.xml 文件将被忽略,不管是否对 .ear 文件提供了 permissions.xml 文件都是如此。
对于打包在 .rar 文件中的应用程序,必须在 META-INF RAR 级别声明许可权。
no-rethrow 选项
启用 Java 2 安全性后,发生许可权违例时,缺省情况下 JDK 安全管理器会抛出 java.security.AccessControl 异常。如果不处理此异常,那么可能导致运行时失败。如果开发者在准备应用程序以使用 Java 2 安全性时需要帮助,可使用了 no-rethrow 选项。no-rethrow 选项允许将 AccessControl 异常记录在 console.log 和 messages.log 中而不会导致应用程序失败。no-rethrow 选项是通过在 bootstrap.properties 文件中指定 websphere.java.security.norethrow=true 启用的。缺省情况下未启用 no-rethrow 选项,因此,必须在 bootstrap.properties 文件中指定它以启用此属性。注: 因为此属性不允许安全管理器抛出该异常,所以从技术上讲,安全管理器不会强制实施
Java 2 安全性。不能在生产环境中使用 no-rethrow 属性。