5.2. 关于 Java 安全策略

Java 安全策略是为不同类型的代码定义的一组权限。Java 安全管理器将应用程序请求的操作与安全策略进行比较。如果策略允许某个操作,则安全管理器将允许执行该操作。如果策略不允许该操作,则安全管理器将拒绝该操作。

重要

较早版本的 JBoss EAP 使用外部文件定义了策略,如 EAP_HOME/bin/server.policy。JBoss EAP 7 通过两种方式定义了 Java 安全策略:security-manager 子系统,以及各个部署中的 XML 文件。security-manager 子系统定义 ALL 部署的最低和最大权限,而 XML 文件则指定各个部署请求的权限。

5.2.1. 关于在安全管理器子系统中定义策略

security-manager 子系统允许您为所有部署定义共享或常见权限。这可以通过定义最小和最大权限集来实现。所有部署将获得至少在最小权限中定义的所有权限。如果部署流程请求了超过最大权限集中定义的权限的权限,部署过程将失败。

示例:用于更新最小权限集的管理 CLI 命令

/subsystem=security-manager/deployment-permissions=default:write-attribute(name=minimum-permissions, value=[{class="java.util.PropertyPermission", actions="read", name="*"}])

示例:更新最大权限集的管理 CLI 命令

/subsystem=security-manager/deployment-permissions=default:write-attribute(name=maximum-permissions, value=[{class="java.util.PropertyPermission", actions="read,write", name="*"}, {class="java.io.FilePermission", actions="read,write", name="/-"}])

注意

如果未定义最大权限集,则其值默认为 java.security.AllPermission

其他资源

  • 您可以在 JBoss EAP 配置指南 中找到 security-manager 子系统的完整参考。

5.2.2. 关于在部署中定义策略

在 JBoss EAP 7 中,您可以在部署中添加 META-INF/permissions.xml。此文件允许您指定部署所需的权限。

如果在 security-manager 子系统中定义了最小权限,并且将 META-INF/permissions.xml 添加至您的部署中,则将授予这些权限的联合。如果 permissions.xml 中请求的权限超过 security-manager 子系统中定义的最大策略,其部署将无法成功。如果 META-INF/permissions.xmlMETA-INF/jboss-permissions.xml 都显示在部署中,则只授予 META-INF/jboss-permissions.xml 中请求的权限。

该规范规定 permissions.xml 涵盖了整个应用或顶级部署模块。如果您要为子部署定义特定权限,您可以使用 JBoss EAP 特定的 META-INF/jboss-permissions.xml。它采用与 permissions.xml 完全相同的格式,并且仅应用到声明它的部署模块。

示例:Sample permissions.xml

<permissions version="7">
  <permission>
    <class-name>java.util.PropertyPermission</class-name>
    <name>*</name>
    <actions>read</actions>
  </permission>
</permissions>

5.2.3. 关于在模块中定义策略

您可以通过在 module.xml 文件中添加 <permissions> 元素来限制模块的权限。<permissions> 元素包含零个或多个 <grant> 元素,它定义了授予该模块的权限。每个 <grant> 元素包含以下属性:

权限
要授予的权限的合格类名称。
name
向权限类构造器提供的权限名称。
操作
某些权限类型所需的(可选)操作列表。

示例:带有定义策略的 module.xml

<module xmlns="urn:jboss:module:1.5" name="org.jboss.test.example">
  <permissions>
    <grant permission="java.util.PropertyPermission" name="*" actions="read,write" />
    <grant permission="java.io.FilePermission" name="/etc/-" actions="read" />
  </permissions>
  ...
</module>

如果存在 <permissions> 元素,则该模块将限制为您列出的权限。如果没有 <permissions> 元素,则模块不会有限制。