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 子系统中定义策略
security-manager
子系统允许您为所有部署定义共享或常见权限。这可以通过定义最小和最大权限集来完成。所有部署将至少被授予在最低权限中定义的所有权限。如果部署请求权限超过最大权限集中定义的权限,则部署过程会失败。
命令更新最小权限集示例
/subsystem=security-manager/deployment-permissions=default:write-attribute(name=minimum-permissions, value=[{class="java.util.PropertyPermission", actions="read", name="*"}])
更新最大权限集的命令示例
/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
,它是 JSR 342 的一部分,它是 Java EE 7 规范的一部分。此文件允许您指定部署所需的权限。如果在 security-manager
子系统中定义了最小权限,并且将 META-INF/permissions.xml
添加至您的部署中,则将授予这些权限的联合。如果 permissions.xml
中请求的权限超过 security-manager
子系统中定义的最大策略,其部署将无法成功。如果部署中存在 META-INF/permissions.xml
和 META-INF/jboss-permissions.xml
,则只授予 META-INF/jboss-permissions.xml
中请求的权限。
Java EE 7 规范规定 permissions.xml
涵盖了整个应用程序或顶级部署模块。如果要为子部署定义特定权限,您可以使用特定于 JBoss EAP 的 META-INF/jboss-permissions.xml
。它采用与 permissions.xml
完全相同的格式,并且仅应用到声明它的部署模块。
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>
元素,则模块不会有限制。