如何配置服务器安全性
用于 Red Hat JBoss Enterprise Application Platform 7.0
摘要
第 1 章 安全概述
Red Hat JBoss Enterprise Application Platform 安全架构指南中介绍了 JBoss EAP 安全性以及一般安全 概念的基础知识。在阅读本指南前,务必要了解有关身份验证、授权、安全域、加密和 SSL/TLS 的安全架构指南中涵盖的基本信息。
第 2 章 保护服务器及其接口
2.1. 构建块
2.1.1. 接口和套接字绑定
JBoss EAP 使用其主机的接口(如 inet-address、nic 等)以及用于 Web 应用程序及其管理界面的通信端口。这些接口和端口通过 JBoss EAP 配置文件中的 interfaces 和 socket-binding-groups 设置(如 standalone.xml
、domain.xml
、host.xml
等)定义和配置。
有关如何定义和配置 interfaces 和 socket-binding-groups 的更多信息,请参阅 配置指南中的套接字绑定部分。
接口示例
<interfaces> <interface name="management"> <inet-address value="${jboss.bind.address.management:127.0.0.1}"/> </interface> <interface name="public"> <inet-address value="${jboss.bind.address:127.0.0.1}"/> </interface> </interfaces>
<interfaces>
<interface name="management">
<inet-address value="${jboss.bind.address.management:127.0.0.1}"/>
</interface>
<interface name="public">
<inet-address value="${jboss.bind.address:127.0.0.1}"/>
</interface>
</interfaces>
Socket Binding Group 示例
<socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}"> <socket-binding name="management-http" interface="management" port="${jboss.management.http.port:9990}"/> <socket-binding name="management-https" interface="management" port="${jboss.management.https.port:9993}"/> <socket-binding name="ajp" port="${jboss.ajp.port:8009}"/> <socket-binding name="http" port="${jboss.http.port:8080}"/> <socket-binding name="https" port="${jboss.https.port:8443}"/> <socket-binding name="txn-recovery-environment" port="4712"/> <socket-binding name="txn-status-manager" port="4713"/> <outbound-socket-binding name="mail-smtp"> <remote-destination host="localhost" port="25"/> </outbound-socket-binding> </socket-binding-group>
<socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">
<socket-binding name="management-http" interface="management" port="${jboss.management.http.port:9990}"/>
<socket-binding name="management-https" interface="management" port="${jboss.management.https.port:9993}"/>
<socket-binding name="ajp" port="${jboss.ajp.port:8009}"/>
<socket-binding name="http" port="${jboss.http.port:8080}"/>
<socket-binding name="https" port="${jboss.https.port:8443}"/>
<socket-binding name="txn-recovery-environment" port="4712"/>
<socket-binding name="txn-status-manager" port="4713"/>
<outbound-socket-binding name="mail-smtp">
<remote-destination host="localhost" port="25"/>
</outbound-socket-binding>
</socket-binding-group>
2.1.2. Security Realms
JBoss EAP 使用安全域来定义身份验证和授权机制(如本地、LDAP 和属性等),然后供管理接口使用。有关安全域的更多信息,请参阅 Red Hat JBoss Enterprise Application Platform 安全架构指南中的 Security Realms 部分。
Security Realms 示例
<security-realms> <security-realm name="ManagementRealm"> <authentication> <local default-user="$local" skip-group-loading="true"/> <properties path="mgmt-users.properties" relative-to="jboss.server.config.dir"/> </authentication> <authorization map-groups-to-roles="false"> <properties path="mgmt-groups.properties" relative-to="jboss.server.config.dir"/> </authorization> </security-realm> <security-realm name="ApplicationRealm"> <authentication> <local default-user="$local" allowed-users="*" skip-group-loading="true"/> <properties path="application-users.properties" relative-to="jboss.server.config.dir"/> </authentication> <authorization> <properties path="application-roles.properties" relative-to="jboss.server.config.dir"/> </authorization> </security-realm> </security-realms>
<security-realms>
<security-realm name="ManagementRealm">
<authentication>
<local default-user="$local" skip-group-loading="true"/>
<properties path="mgmt-users.properties" relative-to="jboss.server.config.dir"/>
</authentication>
<authorization map-groups-to-roles="false">
<properties path="mgmt-groups.properties" relative-to="jboss.server.config.dir"/>
</authorization>
</security-realm>
<security-realm name="ApplicationRealm">
<authentication>
<local default-user="$local" allowed-users="*" skip-group-loading="true"/>
<properties path="application-users.properties" relative-to="jboss.server.config.dir"/>
</authentication>
<authorization>
<properties path="application-roles.properties" relative-to="jboss.server.config.dir"/>
</authorization>
</security-realm>
</security-realms>
除了更新现有的安全域外,JBoss EAP 还允许您创建新的安全域。您可以通过管理控制台以及从管理 CLI 调用以下命令来创建新的安全域:
/core-service=management/security-realm=NEW-REALM-NAME:add()
/core-service=management/security-realm=NEW-REALM-NAME:add()
如果您创建新的安全域并希望使用属性文件进行身份验证或授权,则必须为新的安全域创建新的属性文件。JBoss EAP 不重复使用其他安全域使用的现有文件,也不会自动创建新的配置中指定的新文件(如果它们不存在)。
2.1.3. 使用安全域和套接字绑定来保护管理接口
默认情况下,JBoss EAP 定义了一个 http-interface 来连接管理界面。此接口在 JBoss EAP 配置的 <management-interfaces > 部分中定义:
<management-interfaces> <http-interface security-realm="ManagementRealm" http-upgrade-enabled="true"> <socket-binding http="management-http"/> </http-interface> </management-interfaces>
<management-interfaces>
<http-interface security-realm="ManagementRealm" http-upgrade-enabled="true">
<socket-binding http="management-http"/>
</http-interface>
</management-interfaces>
请注意,接口指定了 security-realm 和 socket-binding。更新指定安全域和套接字绑定的配置允许以不同的方式保护管理接口。除了能够通过安全域和套接字绑定保护每个接口外,这两个接口也可以完全禁用,并且这些接口的用户可以配置为具有各种角色和访问权限。本指南中也有一些主题,如安全审计、安全密码和 JMX,它们与其他 JBoss EAP 中的其他子系统重叠,但仍然与保护 JBoss EAP 相关。
2.2. 如何保护管理接口
以下小节介绍了如何执行与保护 JBoss EAP 管理接口和相关子系统相关的各种操作。
显示的管理 CLI 命令假定您正在运行 JBoss EAP 单机服务器。有关使用 JBoss EAP 受管域的管理 CLI 的详情,请参阅 JBoss EAP 管理 CLI 指南。
2.2.1. 配置 JBoss EAP 使用的联网和端口
根据主机的配置,可将 JBoss EAP 配置为使用各种网络接口和端口。这使得 JBoss EAP 能够处理不同的主机、网络和防火墙要求。
有关 JBoss EAP 使用的网络和端口以及如何配置这些设置的更多信息,请参阅配置指南中的网络和 端口 配置部分。
2.2.2. 为 HTTPS 配置管理接口
仅使用 HTTPS 为通信配置 JBoss EAP 管理接口可提高安全性。客户端和管理界面之间的所有网络流量都是加密的,这降低了安全攻击的风险,如中间人攻击。
在此过程中,禁用与 JBoss EAP 实例的未加密通信。此流程适用于独立服务器和受管域配置。对于受管域,使用主机名称作为管理 CLI 命令前缀,例如: /host=master
。
在管理界面上执行启用 HTTPS 的步骤时,除非明确指示,否则请不要重新加载配置。这样做可能会导致您被锁定在管理界面之外。
创建密钥存储来保护管理接口。
注意此密钥存储必须采用 JKS 格式,因为管理接口与 JCEKS 格式的密钥存储不兼容。
使用以下内容来生成密钥存储,将参数的示例值(如
别名
,keypass
,keystore
,storepass
和dname
)替换为环境的正确值。注意参数
validity
指定密钥有效的天数。730
等于两年。使用
keytool
命令从终端生成密钥存储Copy to Clipboard Copied! Toggle word wrap Toggle overflow keytool -genkeypair -alias appserver -storetype jks -keyalg RSA -keysize 2048 -keypass password1 -keystore EAP_HOME/standalone/configuration/identity.jks -storepass password1 -dname "CN=appserver,OU=Sales,O=Systems Inc,L=Raleigh,ST=NC,C=US" -validity 730 -v
$ keytool -genkeypair -alias appserver -storetype jks -keyalg RSA -keysize 2048 -keypass password1 -keystore EAP_HOME/standalone/configuration/identity.jks -storepass password1 -dname "CN=appserver,OU=Sales,O=Systems Inc,L=Raleigh,ST=NC,C=US" -validity 730 -v
确保管理接口绑定到 HTTPS。
运行单机服务器.
要确保管理接口绑定到 HTTPS,您必须添加
management-https
配置并移除management-http
配置。使用以下 CLI 命令将管理接口绑定到 HTTPS:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /core-service=management/management-interface=http-interface:write-attribute(name=secure-socket-binding, value=management-https) /core-service=management/management-interface=http-interface:undefine-attribute(name=socket-binding)
/core-service=management/management-interface=http-interface:write-attribute(name=secure-socket-binding, value=management-https) /core-service=management/management-interface=http-interface:undefine-attribute(name=socket-binding)
运行受管域
通过添加
secure-port
并删除端口配置来更改management-interface
部分中的 socket 元素。使用以下命令将管理接口绑定到 HTTPS:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /host=master/core-service=management/management-interface=http-interface:write-attribute(name=secure-port,value=9993) /host=master/core-service=management/management-interface=http-interface:undefine-attribute(name=port)
/host=master/core-service=management/management-interface=http-interface:write-attribute(name=secure-port,value=9993) /host=master/core-service=management/management-interface=http-interface:undefine-attribute(name=port)
可选: 使用自定义 socket-binding-group。如果要使用自定义
socket-binding-group
,您必须确保定义了management-https
绑定,该绑定默认为绑定到端口9993
。您可以通过查看服务器配置文件的socket-binding-group
部分或使用管理 CLI 来验证这一点:使用管理 CLI 读取 socket-binding-group 配置示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /socket-binding-group=standard-sockets/socket-binding=management-https:read-resource(recursive=true) { "outcome" => "success", "result" => { "client-mappings" => undefined, "fixed-port" => false, "interface" => "management", "multicast-address" => undefined, "multicast-port" => undefined, "name" => "management-https", "port" => expression "${jboss.management.https.port:9993}" } }
/socket-binding-group=standard-sockets/socket-binding=management-https:read-resource(recursive=true) { "outcome" => "success", "result" => { "client-mappings" => undefined, "fixed-port" => false, "interface" => "management", "multicast-address" => undefined, "multicast-port" => undefined, "name" => "management-https", "port" => expression "${jboss.management.https.port:9993}" } }
创建新的安全域。在本例中,使用 HTTPS, ManagementRealmHTTPS 的新安全域使用位于
EAP_HOME/standalone/configuration/
目录中的名为https-mgmt-users.properties
的属性文件来存储用户名和密码。用户名和密码可以添加到文件中,但现在您需要创建一个名为https-mgmt-users.properties
的空文件,并将它保存到该位置。以下示例显示使用touch
命令,但也可以使用其他机制,如文本编辑器。使用
touch
命令创建空文件的示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow touch EAP_HOME/standalone/configuration/https-mgmt-users.properties
$ touch EAP_HOME/standalone/configuration/https-mgmt-users.properties
接下来,输入以下 CLI 命令创建名为 ManagementRealmHTTPS 的新安全域:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /core-service=management/security-realm=ManagementRealmHTTPS:add /core-service=management/security-realm=ManagementRealmHTTPS/authentication=properties:add(path=https-mgmt-users.properties,relative-to=jboss.server.config.dir)
/core-service=management/security-realm=ManagementRealmHTTPS:add /core-service=management/security-realm=ManagementRealmHTTPS/authentication=properties:add(path=https-mgmt-users.properties,relative-to=jboss.server.config.dir)
此时,您创建了一个新的安全域,并将其配置为使用属性文件进行身份验证。现在,您必须使用
add-user
脚本将用户添加到属性文件中,该脚本可在EAP_HOME/bin/
目录中。在运行add-user
脚本时,您必须分别使用-up
和-r
选项指定属性文件和安全域。在这里,add-user
脚本将以交互方式提示您输入要存储在https-mgmt-users.properties
文件中的用户名和密码信息。Copy to Clipboard Copied! Toggle word wrap Toggle overflow EAP_HOME/bin/add-user.sh -up EAP_HOME/standalone/configuration/https-mgmt-users.properties -r ManagementRealmHTTPS
$ EAP_HOME/bin/add-user.sh -up EAP_HOME/standalone/configuration/https-mgmt-users.properties -r ManagementRealmHTTPS ... Enter the details of the new user to add. Using realm 'ManagementRealmHTTPS' as specified on the command line. ... Username : httpUser Password requirements are listed below. To modify these restrictions edit the add-user.properties configuration file. - The password must not be one of the following restricted values {root, admin, administrator} - The password must contain at least 8 characters, 1 alphabetic character(s), 1 digit(s), 1 non-alphanumeric symbol(s) - The password must be different from the username ... Password : Re-enter Password : About to add user 'httpUser' for realm 'ManagementRealmHTTPS' ... Is this correct yes/no? yes .. Added user 'httpUser' to file 'EAP_HOME/configuration/https-mgmt-users.properties' ... Is this new user going to be used for one AS process to connect to another AS process? e.g. for a slave host controller connecting to the master or for a Remoting connection for server to server EJB calls. yes/no? no
重要在配置使用属性文件存储用户名和密码的安全域时,建议每个域使用不同的属性文件,它们不与另一个域共享。
配置管理接口以使用新的安全域。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /core-service=management/management-interface=http-interface:write-attribute(name=security-realm,value=ManagementRealmHTTPS)
/core-service=management/management-interface=http-interface:write-attribute(name=security-realm,value=ManagementRealmHTTPS)
配置管理接口以使用密钥存储。
使用以下 CLI 命令,将管理接口配置为使用密钥存储。对于参数文件,必须从 第一步 中复制其值的密码和别名。
将密钥存储添加到安全域的 CLI 命令
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /core-service=management/security-realm=ManagementRealmHTTPS/server-identity=ssl:add(keystore-path=identity.jks,keystore-relative-to=jboss.server.config.dir,keystore-password=password1, alias=appserver)
/core-service=management/security-realm=ManagementRealmHTTPS/server-identity=ssl:add(keystore-path=identity.jks,keystore-relative-to=jboss.server.config.dir,keystore-password=password1, alias=appserver)
注意要更新密钥存储密码,请使用以下 CLI 命令:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /core-service=management/security-realm=ManagementRealmHTTPS/server-identity=ssl:write-attribute(name=keystore-password,value=newpassword)
/core-service=management/security-realm=ManagementRealmHTTPS/server-identity=ssl:write-attribute(name=keystore-password,value=newpassword)
此时,您需要重新载入服务器配置:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow reload
reload
重新载入服务器配置后,日志应包含以下内容,只需在文本之前显示启动的服务数:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 13:50:54,160 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0061: Http management interface listening on https://127.0.0.1:9993/management 13:50:54,162 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0052: Admin console listening on https://127.0.0.1:9993
13:50:54,160 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0061: Http management interface listening on https://127.0.0.1:9993/management 13:50:54,162 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0052: Admin console listening on https://127.0.0.1:9993
管理接口现在侦听端口
9993
,这确认过程是否成功。重要此时,CLI 将断开连接,并且由于端口绑定已更改,因此无法重新连接。继续下一步,以更新
jboss-cli.xml
,以允许 CLI 重新连接。更新
jboss-cli.xml
。如果使用管理 CLI 执行管理操作,则必须对
EAP_HOME/bin/jboss-cli.xml
文件进行以下更改:-
将
<default-protocol>
的值更新为https-remoting
。 -
在
<default-controller>
中,将<protocol>
的值更新为https-remoting
。 在
<default-controller>
中,将<port>
的值更新为9993
。jboss-cli.xml 示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow <jboss-cli xmlns="urn:jboss:cli:2.0"> <default-protocol use-legacy-override="true">https-remoting</default-protocol> <!-- The default controller to connect to when 'connect' command is executed w/o arguments --> <default-controller> <protocol>https-remoting</protocol> <host>localhost</host> <port>9993</port> </default-controller> ...
<jboss-cli xmlns="urn:jboss:cli:2.0"> <default-protocol use-legacy-override="true">https-remoting</default-protocol> <!-- The default controller to connect to when 'connect' command is executed w/o arguments --> <default-controller> <protocol>https-remoting</protocol> <host>localhost</host> <port>9993</port> </default-controller> ...
下一次使用管理 CLI 连接到管理界面时,您必须接受服务器证书并根据
ManagementRealmHTTPS
安全域进行身份验证:接受服务器证书和授权示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ./jboss-cli.sh -c
$ ./jboss-cli.sh -c Unable to connect due to unrecognised server certificate Subject - CN=appserver,OU=Sales,O=Systems Inc,L=Raleigh,ST=NC,C=US Issuer - CN=appserver, OU=Sales, O=Systems Inc, L=Raleigh, ST=NC, C=US Valid From - Tue Jun 28 13:38:48 CDT 2016 Valid To - Thu Jun 28 13:38:48 CDT 2018 MD5 : 76:f4:81:8b:7e:c3:be:6d:ee:63:c1:7a:b7:b8:f0:fb SHA1 : ea:e3:f1:eb:53:90:69:d0:c9:69:4a:5a:a3:20:8f:76:c1:e6:66:b6 Accept certificate? [N]o, [T]emporarily, [P]ermenantly : p Authenticating against security realm: ManagementRealmHTTPS Username: httpUser Password: [standalone@localhost:9993 /]
-
将
2.2.3. 禁用 Just the Management Console
JBoss Operations Network 等其他客户端使用 HTTP 接口运行,用于管理 JBoss EAP。为了继续使用这些服务,可能只禁用基于 Web 的管理控制台本身。这可以通过将 console-enabled 属性设置为 false 来实现:
用于禁用基于 Web 的管理控制台的 CLI 命令
/core-service=management/management-interface=http-interface/:write-attribute(name=console-enabled,value=false)
/core-service=management/management-interface=http-interface/:write-attribute(name=console-enabled,value=false)
2.2.4. 为管理接口设置两个 SSL/TLS
双向 SSL/TLS 身份验证(也称为 客户端身份验证 )使用 SSL/TLS 证书验证客户端和服务器。这与 为 HTTPS 配置管理接口 部分不同,其中客户端和服务器都有证书。这不仅提供了保证,不仅是它所说的服务器,而且客户端也是它所说的服务器。
在本节中,使用以下约定:
- HOST1
-
JBoss 服务器主机名。例如:
jboss.redhat.com
。 - HOST2
-
适合客户端的名称。例如:
myclient
。请注意,这不一定是实际的主机名。 - CA_HOST1
-
用于 HOST1 证书的 DN(区分名称)。例如:
cn=jboss,dc=redhat,dc=com
。 - CA_HOST2
-
用于 HOST2 证书的 DN(区分名称)。例如:
cn=myclient,dc=redhat,dc=com
。
如果使用密码库来存储密钥存储和信任存储密码(推荐),则应已经创建密码 vault。有关密码库的更多信息,请参阅 Red Hat JBoss Enterprise Application Platform 7 安全架构指南中的 Password Vault 部分以及 Password Vault System 部分。
红帽建议显式禁用 SSLv2、SSLv3 和 TLSv1.0,以便在所有受影响的软件包中明确禁用 TLSv1.1 或 TLSv1.2。
生成密钥存储。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow keytool -genkeypair -alias HOST1_alias -keyalg RSA -keysize 1024 -validity 365 -keystore HOST1.keystore.jks -dname "CA_HOST1" -keypass secret -storepass secret keytool -genkeypair -alias HOST2_alias -keyalg RSA -keysize 1024 -validity 365 -keystore HOST2.keystore.jks -dname "CA_HOST2" -keypass secret -storepass secret
$ keytool -genkeypair -alias HOST1_alias -keyalg RSA -keysize 1024 -validity 365 -keystore HOST1.keystore.jks -dname "CA_HOST1" -keypass secret -storepass secret $ keytool -genkeypair -alias HOST2_alias -keyalg RSA -keysize 1024 -validity 365 -keystore HOST2.keystore.jks -dname "CA_HOST2" -keypass secret -storepass secret
导出证书。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow keytool -exportcert -keystore HOST1.keystore.jks -alias HOST1_alias -keypass secret -storepass secret -file HOST1.cer keytool -exportcert -keystore HOST2.keystore.jks -alias HOST2_alias -keypass secret -storepass secret -file HOST2.cer
$ keytool -exportcert -keystore HOST1.keystore.jks -alias HOST1_alias -keypass secret -storepass secret -file HOST1.cer $ keytool -exportcert -keystore HOST2.keystore.jks -alias HOST2_alias -keypass secret -storepass secret -file HOST2.cer
将证书导入到而不是信任存储中。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow keytool -importcert -keystore HOST1.truststore.jks -storepass secret -alias HOST2_alias -trustcacerts -file HOST2.cer keytool -importcert -keystore HOST2.truststore.jks -storepass secret -alias HOST1_alias -trustcacerts -file HOST1.cer
$ keytool -importcert -keystore HOST1.truststore.jks -storepass secret -alias HOST2_alias -trustcacerts -file HOST2.cer $ keytool -importcert -keystore HOST2.truststore.jks -storepass secret -alias HOST1_alias -trustcacerts -file HOST1.cer
定义 CertificateRealm。
在服务器(
host.xml
或standalone.xml
)的配置中定义 CertificateRealm,并将接口指向该服务器。这可以通过以下命令完成:Copy to Clipboard Copied! Toggle word wrap Toggle overflow /core-service=management/security-realm=CertificateRealm:add() /core-service=management/security-realm=CertificateRealm/server-identity=ssl:add(keystore-path=/path/to/HOST1.keystore.jks, keystore-password=secret,alias=HOST1_alias) /core-service=management/security-realm=CertificateRealm/authentication=truststore:add(keystore-path=/path/to/HOST1.truststore.jks,keystore-password=secret)
/core-service=management/security-realm=CertificateRealm:add() /core-service=management/security-realm=CertificateRealm/server-identity=ssl:add(keystore-path=/path/to/HOST1.keystore.jks, keystore-password=secret,alias=HOST1_alias) /core-service=management/security-realm=CertificateRealm/authentication=truststore:add(keystore-path=/path/to/HOST1.truststore.jks,keystore-password=secret)
将
http-interface
的security-realm
更改为新的 CertificateRealm。Copy to Clipboard Copied! Toggle word wrap Toggle overflow /core-service=management/management-interface=http-interface:write-attribute(name=security-realm,value=CertificateRealm)
/core-service=management/management-interface=http-interface:write-attribute(name=security-realm,value=CertificateRealm)
为 CLI 添加 SSL/TLS 配置。
重要除了添加双向 SSL/TLS 外,还应将管理接口 配置为绑定到 HTTPS。
为 CLI 添加 SSL/TLS 配置,它使用
EAP_HOME/bin/jboss-cli.xml
作为设置文件。要将密钥存储和信任存储密码以纯文本形式存储,请编辑
EAP_HOME/bin/jboss-cli.xml
,并使用变量的适当值添加 SSL/TLS 配置:jboss-cli.xml XML 示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow <ssl> <alias>HOST2_alias</alias> <key-store>/path/to/HOST2.keystore.jks</key-store> <key-store-password>secret</key-store-password> <trust-store>/path/to/HOST2.truststore.jks</trust-store> <trust-store-password>secret</trust-store-password> <modify-trust-store>true</modify-trust-store> </ssl>
<ssl> <alias>HOST2_alias</alias> <key-store>/path/to/HOST2.keystore.jks</key-store> <key-store-password>secret</key-store-password> <trust-store>/path/to/HOST2.truststore.jks</trust-store> <trust-store-password>secret</trust-store-password> <modify-trust-store>true</modify-trust-store> </ssl>
要使用存储在密码库中的密钥存储和信任存储密码,您需要将 vault 配置和适当的 vault 值添加到
EAP_HOME/bin/jboss-cli.xml
中:jboss-cli.xml XML 示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow <ssl> <vault> <vault-option name="KEYSTORE_URL" value="path-to/vault/vault.keystore"/> <vault-option name="KEYSTORE_PASSWORD" value="MASK-5WNXs8oEbrs"/> <vault-option name="KEYSTORE_ALIAS" value="vault"/> <vault-option name="SALT" value="12345678"/> <vault-option name="ITERATION_COUNT" value="50"/> <vault-option name="ENC_FILE_DIR" value="EAP_HOME/vault/"/> </vault> <alias>HOST2_alias</alias> <key-store>/path/to/HOST2.keystore.jks</key-store> <key-store-password>VAULT::VB::cli_pass::1</key-store-password> <key-password>VAULT::VB::cli_pass::1</key-password> <trust-store>/path/to/HOST2.truststore.jks</trust-store> <trust-store-password>VAULT::VB::cli_pass::1</trust-store-password> <modify-trust-store>true</modify-trust-store> </ssl>
<ssl> <vault> <vault-option name="KEYSTORE_URL" value="path-to/vault/vault.keystore"/> <vault-option name="KEYSTORE_PASSWORD" value="MASK-5WNXs8oEbrs"/> <vault-option name="KEYSTORE_ALIAS" value="vault"/> <vault-option name="SALT" value="12345678"/> <vault-option name="ITERATION_COUNT" value="50"/> <vault-option name="ENC_FILE_DIR" value="EAP_HOME/vault/"/> </vault> <alias>HOST2_alias</alias> <key-store>/path/to/HOST2.keystore.jks</key-store> <key-store-password>VAULT::VB::cli_pass::1</key-store-password> <key-password>VAULT::VB::cli_pass::1</key-password> <trust-store>/path/to/HOST2.truststore.jks</trust-store> <trust-store-password>VAULT::VB::cli_pass::1</trust-store-password> <modify-trust-store>true</modify-trust-store> </ssl>
2.2.5. 为应用程序设置 SSL/TLS
除了支持 HTTPS 和双向 SSL/TLS 用于管理接口外,JBoss EAP 还支持 SSL/TLS (通过 HTTPS 侦听器)来设置供安全域使用。
作为先决条件,应创建 SSL/TLS 加密密钥和证书,并将其放在可访问的目录中。此外,还应访问相关信息(如密钥存储别名和密码、所需的密码套件等)。有关生成 SSL/TLS 密钥和证书的示例,请参阅为管理接口设置两个 SSL/TLS 部分中的 前两个步骤。有关 HTTPS 侦听器(包括密码套件)的更多信息,请参阅 HTTPS Listener 参考 部分。
设置单向 SSL/TLS
本例假定密钥存储 identity.jks
已复制到服务器配置目录中,并且配置了给定属性。管理员应用示例值替换自己的值。
显示的管理 CLI 命令假定您正在运行 JBoss EAP 单机服务器。有关使用 JBoss EAP 受管域的管理 CLI 的详情,请参阅 JBoss EAP 管理 CLI 指南。
首先添加和配置 HTTPS 安全域。配置 HTTPS 安全域后,在引用安全域的
undertow
子系统中配置https-listener
:Copy to Clipboard Copied! Toggle word wrap Toggle overflow batch /core-service=management/security-realm=HTTPSRealm/:add /core-service=management/security-realm=HTTPSRealm/server-identity= \ ssl:add(keystore-path=identity.jks, \ keystore-relative-to=jboss.server.config.dir, \ keystore-password=password1, alias=appserver) /subsystem=undertow/server=default-server/https-listener=https:add( \ socket-binding=https, security-realm=HTTPSRealm) run-batch
batch /core-service=management/security-realm=HTTPSRealm/:add /core-service=management/security-realm=HTTPSRealm/server-identity= \ ssl:add(keystore-path=identity.jks, \ keystore-relative-to=jboss.server.config.dir, \ keystore-password=password1, alias=appserver) /subsystem=undertow/server=default-server/https-listener=https:add( \ socket-binding=https, security-realm=HTTPSRealm) run-batch
警告红帽建议显式禁用 SSLv2、SSLv3 和 TLSv1.0,以便在所有受影响的软件包中明确禁用 TLSv1.1 或 TLSv1.2。
重新加载服务器以使更改生效。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow reload
reload
2.2.6. 为应用程序设置两个 SSL/TLS
为应用程序设置双向 SSL/TLS 遵循为 管理接口设置双向 SSL/TLS 中描述的 许多相同的步骤。要为应用程序设置两个 SSL/TLS,您需要执行以下操作:
- 为客户端和服务器生成存储
- 导出客户端和服务器的证书
- 将证书导入而不是信任存储中
-
在使用服务器的密钥存储和信任存储的服务器上定义安全域,如
CertificateRealm
-
更新
undertow
子系统,以使用安全域并需要客户端验证
为 管理接口设置两个 SSL/TLS 中介绍了前四个步骤。
如果自新安全域以来没有重新加载服务器,则必须重新加载服务器,然后才能执行下一步。
更新 Undertow 子系统
在创建了并配置了密钥存储、证书、信任存储和安全域后,您需要将 HTTPS 侦听器添加到 undertow
子系统,使用您创建的安全域并需要客户端验证:
/subsystem=undertow/server=default-server/https-listener=https:add( \ socket-binding=https, security-realm=CertificateRealm, verify-client=REQUIRED)
/subsystem=undertow/server=default-server/https-listener=https:add( \
socket-binding=https, security-realm=CertificateRealm, verify-client=REQUIRED)
任何连接到启用了双向 SSL/TLS 的 JBoss EAP 实例的客户端都必须有权访问客户端证书或密钥存储,换句话说,其证书包含在服务器的信任存储中。如果客户端使用浏览器来连接 JBoss EAP 实例,您需要将该证书或密钥存储导入到浏览器的证书管理器。
除了带有应用程序的双向 SSL/TLS 外,请参阅如何配置安全域以使用 JBoss EAP 的身份管理 中的 在应用程序中使用基于证书的身份验证 的更多详细信息。
2.2.7. HTTPS Listener 参考
有关可用于 HTTPS 侦听器的属性的完整列表,请参阅 JBoss EAP 配置指南中的 Undertow 子系统属性。
2.2.7.1. 关于 Cipher Suites
您可以配置允许的加密密码列表。对于 JSSE 语法,它必须用逗号分开的列表。对于 OpenSSL 语法,它必须是以冒号分隔的列表。确定只使用一个语法。默认为 JVM 默认。
使用弱密码是一个重大安全风险。有关加密套件的 NIST 建议,请参阅 http://www.nist.gov/manuscript-publication-search.cfm?pub_id=915295。
有关可用 OpenSSL 密码的列表,请参阅 https://www.openssl.org/docs/manmaster/apps/ciphers.html#CIPHER-STRINGS。请注意,不支持以下内容:
- @SECLEVEL
- SUITEB128
- SUITEB128ONLY
- SUITEB192
有关标准 JSSE 密码的列表,请参阅 http://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html#Cipher。
要更新启用的密码套件的列表,请在 undertow
子系统中使用 HTTPS 侦听器的 enabled-cipher-suites 属性。
CLI 示例
/subsystem=undertow/server=default-server/https-listener=https:write-attribute(name=enabled-cipher-suites,value="TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA")
/subsystem=undertow/server=default-server/https-listener=https:write-attribute(name=enabled-cipher-suites,value="TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA")
这个示例只列出了两个可能的密码,但实际示例可能会使用更多。
2.2.8. 在 Red Hat Enterprise Linux 6 中为 SSL/TLS 启用 FIPS 140-2 Cryptography
您可以将 Undertow 配置为将 FIPS 140-2 兼容加密用于 SSL/TLS。此配置示例的范围仅限于 Red Hat Enterprise Linux 6,在 FIPS 模式下使用 Mozilla NSS 库。
Red Hat Enterprise Linux 6 必须配置为符合 FIPS 140-2。如需更多信息,请参阅 https://access.redhat.com/knowledge/solutions/137833。
在 FIPS 模式下运行时,Oracle/OpenJDK 和 JBoss EAP 不支持 TLS 1.2 协议,并可能导致 NoSuchAlgorithmException。有关此问题的更多详细信息,请参见 https://access.redhat.com/solutions/1309153。
如果您在启用了 SSL/TLS 的 FIPS 140-2 兼容加密的环境中运行 jboss-cli.sh
,则会看到以下错误: FIPS 模式:只有 SunJSSE TrustManagers 可以使用
。可以通过更新 jboss-cli.sh
文件中的 javax.net.ssl.keyStore
和 javax.net.ssl.trustStore
系统属性来解决这个问题:
JAVA_OPTS="$JAVA_OPTS -Djavax.net.ssl.trustStore=NONE -Djavax.net.ssl.trustStoreType=PKCS11" JAVA_OPTS="$JAVA_OPTS -Djavax.net.ssl.keyStore=NONE -Djavax.net.ssl.keyStoreType=PKCS11 -Djavax.net.ssl.keyStorePassword=imapassword"
JAVA_OPTS="$JAVA_OPTS -Djavax.net.ssl.trustStore=NONE -Djavax.net.ssl.trustStoreType=PKCS11"
JAVA_OPTS="$JAVA_OPTS -Djavax.net.ssl.keyStore=NONE -Djavax.net.ssl.keyStoreType=PKCS11 -Djavax.net.ssl.keyStorePassword=imapassword"
要将 Undertow 配置为对 SSL/TLS 使用 FIPS 140-2 兼容加密,您必须执行以下操作:
- 配置 NSS 数据库
- 配置 Undertow
2.2.8.1. 配置 NSS 数据库
创建由相应用户拥有的目录,以存放 NSS 数据库。
创建 NSS 数据库目录的命令示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow mkdir -p /usr/share/jboss-as/nssdb chown jboss /usr/share/jboss-as/nssdb modutil -create -dbdir /usr/share/jboss-as/nssdb
$ mkdir -p /usr/share/jboss-as/nssdb $ chown jboss /usr/share/jboss-as/nssdb $ modutil -create -dbdir /usr/share/jboss-as/nssdb
注意jboss 用户只是一个示例。您需要使用您计划运行 JBoss EAP 的操作系统上的用户替换它。
创建 NSS 配置文件:
/usr/share/jboss-as/nss_pkcsll_fips.cfg
。它必须指定:
- 名称
- NSS 库所在的目录
上一步中创建的 NSS 数据库的目录
nss_pkcsll_fips.cfg
示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow name = nss-fips nssLibraryDirectory=/usr/lib64 nssSecmodDirectory=/usr/share/jboss-as/nssdb nssDbMode = readOnly nssModule = fips
name = nss-fips nssLibraryDirectory=/usr/lib64 nssSecmodDirectory=/usr/share/jboss-as/nssdb nssDbMode = readOnly nssModule = fips
注意如果您没有运行 64 位版本的 Red Hat Enterprise Linux 6,那么
nss1028Directory
设为/usr/lib
,而不是/usr/lib64
。
编辑
$JAVA_HOME/jre/lib/security/java.security
配置文件。将以下行添加到
$JAVA_HOME/jre/lib/security/java.security
:java.security
示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow security.provider.1=sun.security.pkcs11.SunPKCS11 /usr/share/jboss-as/nss_pkcsll_fips.cfg
security.provider.1=sun.security.pkcs11.SunPKCS11 /usr/share/jboss-as/nss_pkcsll_fips.cfg
注意上述行中指定的
nss_pkcsll_fips.cfg
配置文件是上一步中创建的文件。您还需要更新
$JAVA_HOME/jre/lib/security/java.security
中的以下链接:Copy to Clipboard Copied! Toggle word wrap Toggle overflow security.provider.5=com.sun.net.ssl.internal.ssl.Provider
security.provider.5=com.sun.net.ssl.internal.ssl.Provider
至
Copy to Clipboard Copied! Toggle word wrap Toggle overflow security.provider.5=com.sun.net.ssl.internal.ssl.Provider SunPKCS11-nss-fips
security.provider.5=com.sun.net.ssl.internal.ssl.Provider SunPKCS11-nss-fips
重要此文件中的任何其他
security.provider.X
行(如security.provider.2
)都必须增加其 X 的值,以确保此 provider 具有优先权。在您在上一步中创建的 NSS 数据库目录上运行
modutil
命令以启用 FIPS 模式。Copy to Clipboard Copied! Toggle word wrap Toggle overflow modutil -fips true -dbdir /usr/share/jboss-as/nssdb
modutil -fips true -dbdir /usr/share/jboss-as/nssdb
注意此时您可能会收到一个安全库错误,要求您为某些 NSS 共享对象重新生成库签名。
在 FIPS 令牌上设置密码。
令牌的名称必须是 NSS FIPS 140-2 Certificate DB。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow modutil -changepw "NSS FIPS 140-2 Certificate DB" -dbdir /usr/share/jboss-as/nssdb
modutil -changepw "NSS FIPS 140-2 Certificate DB" -dbdir /usr/share/jboss-as/nssdb
重要用于 FIPS 令牌的密码必须是 FIPS 兼容密码。如果密码不够强,您可能会收到错误: ERROR: Unable to change password on token "NSS FIPS 140-2 Certificate DB"。
使用 NSS 工具创建证书。
命令示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow certutil -S -k rsa -n undertow -t "u,u,u" -x -s "CN=localhost, OU=MYOU, O=MYORG, L=MYCITY, ST=MYSTATE, C=MY" -d /usr/share/jboss-as/nssdb
certutil -S -k rsa -n undertow -t "u,u,u" -x -s "CN=localhost, OU=MYOU, O=MYORG, L=MYCITY, ST=MYSTATE, C=MY" -d /usr/share/jboss-as/nssdb
2.2.8.2. 配置 Undertow
为 SSL/TLS 完成 FIPS 140-2 兼容加密的设置:
配置 Undertow 以使用 SSL/TLS。
注意以下命令必须以批处理模式运行,或者在添加 ssl 服务器身份后重新加载服务器。下例中使用了批处理模式。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow batch /core-service=management/security-realm=HTTPSRealm:add /core-service=management/security-realm=HTTPSRealm/server-identity=ssl:add(keystore-provider=PKCS11, keystore-password="strongP@ssword1") /subsystem=undertow/server=default-server/https-listener=https:add(socket-binding=https, security-realm=HTTPSRealm, enabled-protocols="TLSv1.1") run-batch
batch /core-service=management/security-realm=HTTPSRealm:add /core-service=management/security-realm=HTTPSRealm/server-identity=ssl:add(keystore-provider=PKCS11, keystore-password="strongP@ssword1") /subsystem=undertow/server=default-server/https-listener=https:add(socket-binding=https, security-realm=HTTPSRealm, enabled-protocols="TLSv1.1") run-batch
为应用设置 SSL/TLS部分介绍了将 Undertow 配置为 SSL/TLS 的基本信息。
配置 Undertow 使用的加密套件。
配置了 SSL/TLS 后,您需要将 https 侦听器和安全域配置为启用了特定的密码套件:
所需的加密套件
Copy to Clipboard Copied! Toggle word wrap Toggle overflow SSL_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_256_CBC_SHA, TLS_DHE_DSS_WITH_AES_256_CBC_SHA, TLS_DHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, TLS_ECDH_RSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_anon_WITH_AES_128_CBC_SHA, TLS_ECDH_anon_WITH_AES_256_CBC_SHA
SSL_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_256_CBC_SHA, TLS_DHE_DSS_WITH_AES_256_CBC_SHA, TLS_DHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, TLS_ECDH_RSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_anon_WITH_AES_128_CBC_SHA, TLS_ECDH_anon_WITH_AES_256_CBC_SHA
关于为 https 侦听程序启用加密套件的基础知识,请参阅关于加密套件。在 https 监听器上启用密码套件:
在 Https Listener 上启用 Cipher Suites 的命令示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /subsystem=undertow/server=default-server/https-listener=https:write-attribute(name=enabled-cipher-suites,value="SSL_RSA_WITH_3DES_EDE_CBC_SHA,SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_DSS_WITH_AES_128_CBC_SHA,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_DHE_DSS_WITH_AES_256_CBC_SHA,TLS_DHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA,TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA,TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA,TLS_ECDH_RSA_WITH_AES_128_CBC_SHA,TLS_ECDH_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA,TLS_ECDH_anon_WITH_AES_128_CBC_SHA,TLS_ECDH_anon_WITH_AES_256_CBC_SHA")
/subsystem=undertow/server=default-server/https-listener=https:write-attribute(name=enabled-cipher-suites,value="SSL_RSA_WITH_3DES_EDE_CBC_SHA,SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_DSS_WITH_AES_128_CBC_SHA,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_DHE_DSS_WITH_AES_256_CBC_SHA,TLS_DHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA,TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA,TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA,TLS_ECDH_RSA_WITH_AES_128_CBC_SHA,TLS_ECDH_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA,TLS_ECDH_anon_WITH_AES_128_CBC_SHA,TLS_ECDH_anon_WITH_AES_256_CBC_SHA")
在安全域中启用密码套件。
在 Security Realm 上启用 Cipher Suites 的命令示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /core-service=management/security-realm=HTTPSRealm/server-identity=ssl:write-attribute(name=enabled-cipher-suites, value=[SSL_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_256_CBC_SHA, TLS_DHE_DSS_WITH_AES_256_CBC_SHA, TLS_DHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, TLS_ECDH_RSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_anon_WITH_AES_128_CBC_SHA, TLS_ECDH_anon_WITH_AES_256_CBC_SHA])
/core-service=management/security-realm=HTTPSRealm/server-identity=ssl:write-attribute(name=enabled-cipher-suites, value=[SSL_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_256_CBC_SHA, TLS_DHE_DSS_WITH_AES_256_CBC_SHA, TLS_DHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, TLS_ECDH_RSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_anon_WITH_AES_128_CBC_SHA, TLS_ECDH_anon_WITH_AES_256_CBC_SHA])
运行以下命令,验证 JVM 是否可以从 PKCS11 密钥存储中读取私钥:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow keytool -list -storetype pkcs11
keytool -list -storetype pkcs11
2.2.9. IBM JDK 上的 FIPS 140-2 Compliant Cryptography
在 IBM JDK 上,IBM JCE (Java Cryptographic Extension) IBMJCEFIPS 供应商和 IBM JSSE (Java Secure Sockets Extension) FIPS 140-2 Cryptographic Module (IBMJSSE2)为 Multi-platforms 提供 FIPS 140-2 兼容加密。
有关 IBMJCEFIPS 供应商的更多信息,请参阅 IBM 文档 IBM JCEFIPS 和 NIST IBMJCEFIPS - 安全策略。有关 IBMJSSE2 的更多信息,请参阅 此处。
2.2.9.1. 密钥存储
IBM JCE 不提供密钥存储。密钥存储在计算机上,不会离开其物理边界。如果密钥在必须加密的计算机之间移动。
要在 FIPS 兼容模式下运行 keytool,在每个命令中都使用 -providerClass 选项,如下所示:
keytool -list -storetype JCEKS -keystore mystore.jck -storepass mystorepass -providerClass com.ibm.crypto.fips.provider.IBMJCEFIPS
keytool -list -storetype JCEKS -keystore mystore.jck -storepass mystorepass -providerClass com.ibm.crypto.fips.provider.IBMJCEFIPS
2.2.9.2. 检查 FIPS 供应商信息
要检查服务器使用的 IBMJCEFIPS 的信息,请通过将 -Djavax.net.debug=true 添加到 standalone.conf
或 domain.conf
来启用调试级别日志记录。有关 FIPS 供应商的信息会记录到 server.log
中,例如:
04:22:45,685 INFO [stdout] (http-/127.0.0.1:8443-1) JsseJCE: Using MessageDigest SHA from provider IBMJCEFIPS version 1.7 04:22:45,689 INFO [stdout] (http-/127.0.0.1:8443-1) DHCrypt: DH KeyPairGenerator from provider from init IBMJCEFIPS version 1.7 04:22:45,754 INFO [stdout] (http-/127.0.0.1:8443-1) JsseJCE: Using KeyFactory DiffieHellman from provider IBMJCEFIPS version 1.7 04:22:45,754 INFO [stdout] (http-/127.0.0.1:8443-1) JsseJCE: Using KeyAgreement DiffieHellman from provider IBMJCEFIPS version 1.7 04:22:45,754 INFO [stdout] (http-/127.0.0.1:8443-1) DHCrypt: DH KeyAgreement from provider IBMJCEFIPS version 1.7 04:22:45,754 INFO [stdout] (http-/127.0.0.1:8443-1) DHCrypt: DH KeyAgreement from provider from initIBMJCEFIPS version 1.7
04:22:45,685 INFO [stdout] (http-/127.0.0.1:8443-1) JsseJCE: Using MessageDigest SHA from provider IBMJCEFIPS version 1.7
04:22:45,689 INFO [stdout] (http-/127.0.0.1:8443-1) DHCrypt: DH KeyPairGenerator from provider from init IBMJCEFIPS version 1.7
04:22:45,754 INFO [stdout] (http-/127.0.0.1:8443-1) JsseJCE: Using KeyFactory DiffieHellman from provider IBMJCEFIPS version 1.7
04:22:45,754 INFO [stdout] (http-/127.0.0.1:8443-1) JsseJCE: Using KeyAgreement DiffieHellman from provider IBMJCEFIPS version 1.7
04:22:45,754 INFO [stdout] (http-/127.0.0.1:8443-1) DHCrypt: DH KeyAgreement from provider IBMJCEFIPS version 1.7
04:22:45,754 INFO [stdout] (http-/127.0.0.1:8443-1) DHCrypt: DH KeyAgreement from provider from initIBMJCEFIPS version 1.7
2.2.10. 当 JVM 在 FIPS 模式中运行时启动受管域(Managed Domain)
假设配置了受管域、FIPS 以及所有必需的证书。这包括已将域控制器的证书导入到每个控制器的信任存储中。有关配置受管域的更多详细信息,请参阅 JBoss EAP 配置指南中的域管理。https://access.redhat.com/documentation/zh-cn/red_hat_jboss_enterprise_application_platform/7.0/html-single/configuration_guide/#domain_management有关配置 FIPS 的详情,请参阅在 Red Hat Enterprise Linux 6 中为 SSL/TLS 启用 FIPS 140-2 Cryptography。
您需要更新每个主机控制器和主域控制器,以使用 SSL/TLS 进行通信。
红帽建议明确禁用 SSLv2、SSLv3 和 TLSv1.0,以便在所有受影响的软件包中明确禁用 TLSv1.1。
在 master 域控制器上创建 SSL/TLS 安全域。
您需要在配置为使用 NSS 数据库作为 PKCS11 供应商的 master 域控制器上创建 SSL/TLS 安全域。
Security Realm 示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow <security-realm name="HTTPSRealm"> <server-identities> <ssl> <engine enabled-protocols="TLSv1.1"/> <keystore provider="PKCS11" keystore-password="strongP@ssword1"/> </ssl> </server-identities> <authentication> <local default-user="\$local"/> <properties path="https-users.properties" relative-to="jboss.domain.config.dir"/> </authentication> </security-realm>
<security-realm name="HTTPSRealm"> <server-identities> <ssl> <engine enabled-protocols="TLSv1.1"/> <keystore provider="PKCS11" keystore-password="strongP@ssword1"/> </ssl> </server-identities> <authentication> <local default-user="\$local"/> <properties path="https-users.properties" relative-to="jboss.domain.config.dir"/> </authentication> </security-realm>
在每个主机控制器上创建 SSL/TLS 安全域。
您需要创建带有 SSL/TLS 信任存储进行身份验证的安全域。
Security Realm 示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow <security-realm name="HTTPSRealm"> <authentication> <truststore provider="PKCS11" keystore-password="strongP@ssword1"/> </authentication> </security-realm>
<security-realm name="HTTPSRealm"> <authentication> <truststore provider="PKCS11" keystore-password="strongP@ssword1"/> </authentication> </security-realm>
注意您需要在每个主机上重复此过程。
保护 master 域控制器上的原生接口。
您需要确保 master 域控制器上的原生接口使用您刚才创建的安全域进行保护。
原生接口示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow <management-interfaces> ... <native-interface security-realm="HTTPSRealm"> <socket interface="management" port="${jboss.management.native.port:9999}"/> </native-interface> </management-interfaces>
<management-interfaces> ... <native-interface security-realm="HTTPSRealm"> <socket interface="management" port="${jboss.management.native.port:9999}"/> </native-interface> </management-interfaces>
使用每个主机控制器上的 SSL/TLS 域连接到主域控制器。
您需要更新用于连接主域控制器的安全域。此更改必须在主机控制器的配置文件中直接完成,如
host.xml
或host-slave.xml
,而服务器没有运行。主机控制器配置文件示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow <domain-controller> <remote security-realm="HTTPSRealm"> <discovery-options> <static-discovery name="primary" protocol="${jboss.domain.master.protocol:remote}" host="${jboss.domain.master.address}" port="${jboss.domain.master.port:9999}"/> </discovery-options> </remote> </domain-controller>
<domain-controller> <remote security-realm="HTTPSRealm"> <discovery-options> <static-discovery name="primary" protocol="${jboss.domain.master.protocol:remote}" host="${jboss.domain.master.address}" port="${jboss.domain.master.port:9999}"/> </discovery-options> </remote> </domain-controller>
更新每个服务器如何连接其主机控制器。
您还需要更新每个服务器如何连接其主机控制器。
服务器配置示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow <server name="my-server" group="my-server-group"> <ssl ssl-protocol="TLS" trust-manager-algorithm="SunX509" truststore-type="PKCS11" truststore-password="strongP@ssword1"/> </server>
<server name="my-server" group="my-server-group"> <ssl ssl-protocol="TLS" trust-manager-algorithm="SunX509" truststore-type="PKCS11" truststore-password="strongP@ssword1"/> </server>
在受管域中配置双向 SSL/TLS。
要启用双向 SSL/TLS,请在 master 域控制器的 SSL/TLS 安全域中添加信任存储身份验证方法,请执行以下管理 CLI 命令:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /host=master/core-service=management/security-realm=HTTPSRealm/authentication=truststore:add(keystore-provider="PKCS11",keystore-password="strongP@ssword1") reload --host=master
/host=master/core-service=management/security-realm=HTTPSRealm/authentication=truststore:add(keystore-provider="PKCS11",keystore-password="strongP@ssword1") reload --host=master
您还需要更新每个主机控制器的安全域使其包含 SSL 服务器身份,请执行以下管理 CLI 命令:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /host=host1/core-service=management/security-realm=HTTPSRealm/server-identity=ssl:add(keystore-provider=PKCS11, keystore-password="strongP@ssword1",enabled-protocols=["TLSv1.1"]) reload --host=host1
/host=host1/core-service=management/security-realm=HTTPSRealm/server-identity=ssl:add(keystore-provider=PKCS11, keystore-password="strongP@ssword1",enabled-protocols=["TLSv1.1"]) reload --host=host1
重要您还需要确保每个主机的证书导入到域控制器的信任存储中。
2.2.11. 禁用远程访问 JMX
远程访问 jmx
子系统允许远程触发 JDK 和应用程序管理操作。要在 JBoss EAP 中禁止远程访问 JMX,请删除 jmx
子系统中的补救连接器:
删除 Remoting Connector
/subsystem=jmx/remoting-connector=jmx/:remove
/subsystem=jmx/remoting-connector=jmx/:remove
有关 JMX 的更多信息,请参阅 Red Hat JBoss Enterprise Application Platform 安全架构指南中的 JMX 部分
2.2.12. 使用 JAAS 来保护管理界面
JAAS 是 JBoss EAP 用来管理安全性的声明安全 API。有关 JAAS 和声明性安全性的详情和背景信息,请参阅 Red Hat JBoss Enterprise Application Platform 安全架构指南中的 Declarative Security and JAAS 部分。
当 JBoss EAP 实例配置为以 ADMIN_ONLY 模式运行时,不支持使用 JAAS 来保护管理接口。有关 ADMIN_ONLY 模式的更多信息,请参阅 JBoss EAP 配置指南中的在 ADMIN_ONLY 模式中运行 JBoss EAP 部分。
要使用 JAAS 向管理界面进行身份验证,必须执行以下步骤:
创建安全域。
在本例中,使用 UserRoles 登录模块创建一个安全域,但也可以使用其他登录模块:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /subsystem=security/security-domain=UsersLMDomain:add(cache-type=default) /subsystem=security/security-domain=UsersLMDomain/authentication=classic:add /subsystem=security/security-domain=UsersLMDomain/authentication=classic/login-module=UsersRoles:add(code=UsersRoles, flag=required,module-options=[("usersProperties"=>"users.properties"),("rolesProperties"=>"roles.properties")])
/subsystem=security/security-domain=UsersLMDomain:add(cache-type=default) /subsystem=security/security-domain=UsersLMDomain/authentication=classic:add /subsystem=security/security-domain=UsersLMDomain/authentication=classic/login-module=UsersRoles:add(code=UsersRoles, flag=required,module-options=[("usersProperties"=>"users.properties"),("rolesProperties"=>"roles.properties")])
创建具有 JAAS 身份验证的安全域。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /core-service=management/security-realm=SecurityDomainAuthnRealm:add /core-service=management/security-realm=SecurityDomainAuthnRealm/authentication=jaas:add(name=UsersLMDomain)
/core-service=management/security-realm=SecurityDomainAuthnRealm:add /core-service=management/security-realm=SecurityDomainAuthnRealm/authentication=jaas:add(name=UsersLMDomain)
更新
http-interface
管理界面,以使用新的安全域。Copy to Clipboard Copied! Toggle word wrap Toggle overflow /core-service=management/management-interface=http-interface/:write-attribute(name=security-realm,value=SecurityDomainAuthnRealm)
/core-service=management/management-interface=http-interface/:write-attribute(name=security-realm,value=SecurityDomainAuthnRealm)
可选: 分配组成员资格。
属性
assign-groups
决定在安全域中加载的用户成员资格信息是否用于安全域中的组分配。当设置为true
时,这个组分配用于基于角色的访问控制(RBAC)。Copy to Clipboard Copied! Toggle word wrap Toggle overflow /core-service=management/security-realm=SecurityDomainAuthnRealm/authentication=jaas:write-attribute(name=assign-groups,value=true)
/core-service=management/security-realm=SecurityDomainAuthnRealm/authentication=jaas:write-attribute(name=assign-groups,value=true)
2.2.13. 静默身份验证
JBoss EAP 的默认安装包含本地管理 CLI 用户的内部身份验证方法。这允许本地用户在没有用户名或密码身份验证的情况下访问管理 CLI。此功能为方便起见启用,并协助本地用户运行管理 CLI 脚本,而无需身份验证。它被视为对本地配置的访问的一个有用功能,这通常还让用户能够添加自己的用户详情或禁用安全检查。
在需要更大的安全控制时,可以禁用对本地用户进行静默身份验证的方便。这可以通过删除配置文件的 security-realm 部分中的 local 元素来实现。这适用于独立实例和域。
只有在对 JBoss EAP 实例的影响及其配置被完全理解时,才应执行本地元素删除。
从域中删除静默身份验证:
/core-service=management/security-realm=REALM_NAME/authentication=local:remove
/core-service=management/security-realm=REALM_NAME/authentication=local:remove
2.2.14. 删除 Undertow 响应标头
默认的 JBoss EAP undertow
子系统包含两个响应标头,它们附加到 default-host
的每个 HTTP 响应中:
-
服务器
,设置为JBoss-EAP/7
-
X-Powered-By
,设置为Undertow/1
虽然它们对于开发和调试目的很有用,但如果您不希望披露有关服务器的信息,则可能需要删除这些标头。
使用以下管理 CLI 命令,从 default-host
中删除这些响应标头。
/subsystem=undertow/server=default-server/host=default-host/filter-ref=server-header:remove /subsystem=undertow/server=default-server/host=default-host/filter-ref=x-powered-by-header:remove reload
/subsystem=undertow/server=default-server/host=default-host/filter-ref=server-header:remove
/subsystem=undertow/server=default-server/host=default-host/filter-ref=x-powered-by-header:remove
reload
2.3. 安全审计
安全审计指的是触发事件,如写入日志,以响应 安全子系统
或管理界面发生的事件。审计机制被配置为安全域或管理界面的一部分。
审计使用提供程序模块。既包括供应商模块以及自定义实现都可使用。
2.3.1. 为安全域配置安全审计
要为安全域配置安全审计设置,必须从管理控制台执行以下步骤:
打开安全域的详细视图。
- 单击屏幕顶部的 Configuration。
- 在受管域中,从左上角的 Profile 选择框中选择要修改的配置文件。
- 单击 Subsystems,然后单击 Security。
- 单击要编辑的安全域,然后单击 View。
导航到 Auditing 配置。
点屏幕左侧的 Audit。
配置区域分为两个区域:提供程序模块和详细信息。provider 模块是配置的基本单元。安全域可以包含多个提供程序模块,分别可以包含属性和选项。
添加 provider 模块。
点 Add,并使用 provider 模块的 classname 填写 Code 部分。另外,使用所需名称填写 Name 部分。
验证模块是否正常工作。
audit 模块的目标是提供一种监控
security
子系统中的事件的方法。这种监控可以通过写入日志文件、电子邮件通知或其他可测量审计机制来实现。例如,JBoss EAP 默认包含
org.jboss.security.audit.providers.LogAuditProvider
模块。如果按照上述步骤启用,此审计模块会将安全通知写入EAP_HOME
目录中的日志子文件夹中的audit.log
文件中。要验证以上步骤是否在
org.jboss.security.audit.providers.LogAuditProvider
上下文中工作,请执行可能触发通知的操作,然后检查审计日志文件。可选: 添加、编辑或删除模块选项。
要向模块添加选项,请点击 Modules 列表中的条目,然后在页面的 Details 部分中选择 Module Options 选项卡。单击 Add,然后提供 选项的键和值。
要编辑已存在的选项,请点 Remove 将其删除,然后点 Add 来再次添加它,并带有正确的选项。
第 3 章 保护受管域
除了保护管理接口外,您还可以保护受管域中的 JBoss EAP 实例之间的通信。
有关受管域工作模式的概念和常规配置的详情,请参考 JBoss EAP 配置指南中的域管理部分。https://access.redhat.com/documentation/zh-cn/red_hat_jboss_enterprise_application_platform/7.0/html-single/configuration_guide/#domain_management
3.1. 配置 Slaves 和域控制器之间的密码身份验证
在配置受管域时,默认情况下,主域控制器配置为需要连接它的每个从控制器进行身份验证。要使用正确的凭证配置从控制器,您必须执行以下操作:
将用户添加到 master 域控制器
您需要使用 add-user 脚本将用户添加到 master 域控制器。特别是,您需要确保用户被添加到 master 用来保护其管理界面的同一域中,默认为 ManagementRealm。您还需要确保回答" 是",该新用户是否将用于一个 AS 进程连接到另一个 AS 进程? 问题。
重要添加用户后,该脚本将输出一个 < ;secret > 元素,该元素将在下一步中使用。您必须保留这个值才能在下一步中使用。
Adding a Slave User 示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow EAP_HOME/bin/add-user.sh
$ EAP_HOME/bin/add-user.sh What type of user do you wish to add? a) Management User (mgmt-users.properties) b) Application User (application-users.properties) (a): a Enter the details of the new user to add. Using realm 'ManagementRealm' as discovered from the existing property files. Username : slave-user Password recommendations are listed below. To modify these restrictions edit the add-user.properties configuration file. - The password should be different from the username - The password should not be one of the following restricted values {root, admin, administrator} - The password should contain at least 8 characters, 1 alphabetic character(s), 1 digit(s), 1 non-alphanumeric symbol(s) Password : Re-enter Password : What groups do you want this user to belong to? (Please enter a comma separated list, or leave blank for none)[ ]: About to add user 'slave-user' for realm 'ManagementRealm' Is this correct yes/no? yes Added user 'slave-user' to file '/home/user/EAP-7.0.0/jboss-eap-7.0/standalone/configuration/mgmt-users.properties' Added user 'slave-user' to file '/home/user/EAP-7.0.0/jboss-eap-7.0/domain/configuration/mgmt-users.properties' Added user 'slave-user' with groups to file '/home/user/EAP-7.0.0/jboss-eap-7.0/standalone/configuration/mgmt-groups.properties' Added user 'slave-user' with groups to file '/home/user/EAP-7.0.0/jboss-eap-7.0/domain/configuration/mgmt-groups.properties' Is this new user going to be used for one AS process to connect to another AS process? e.g. for a slave host controller connecting to the master or for a Remoting connection for server to server EJB calls. yes/no? yes To represent the user add the following to the server-identities definition <secret value="ABCzc3dv11Qx" />
将从属控制器配置为使用凭据。
在主域控制器上创建用户后,您需要更新每个从属控制器,以便在主机配置文件中使用该凭据,如 host.
xml 或
。要做到这一点,您需要将用户名添加到 域控制器 配置的 < ;remote > 元素中。您还需要将 < secret> 添加到用于保护 < remote> 元素的域的 服务器身份。当用户添加到上一步中的 master 域控制器时,会获取 username 和 < secret >。host
-slave.xmlExample
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ... <security-realm name="ManagementRealm"> <server-identities> <!-- Replace this with either a base64 password of your own, or use a vault with a vault expression --> <secret value="ABCzc3dv11Qx"/> </server-identities> ... <domain-controller> <remote security-realm="ManagementRealm" username="slave-user"> <discovery-options> <static-discovery name="primary" protocol="${jboss.domain.master.protocol:remote}" host="${jboss.domain.master.address}" port="${jboss.domain.master.port:9999}"/> </discovery-options> </remote> </domain-controller>
... <security-realm name="ManagementRealm"> <server-identities> <!-- Replace this with either a base64 password of your own, or use a vault with a vault expression --> <secret value="ABCzc3dv11Qx"/> </server-identities> ... <domain-controller> <remote security-realm="ManagementRealm" username="slave-user"> <discovery-options> <static-discovery name="primary" protocol="${jboss.domain.master.protocol:remote}" host="${jboss.domain.master.address}" port="${jboss.domain.master.port:9999}"/> </discovery-options> </remote> </domain-controller>
3.2. 在域控制器和主机控制器之间配置 SSL/TLS
当您将 SSL/TLS 配置为在受管域中 JBoss EAP 实例之间使用时,每个实例都可以具有客户端或服务器角色,具体取决于交互。这包括所有主机控制器和域控制器。因此,建议您在端点之间设置双向 SSL/TLS。
您可以在受管域中配置 JBoss EAP 实例,以便在主域控制器和主机控制器之间相互通信时使用 SSL/TLS。要做到这一点,您需要执行以下操作:
生成并配置所有必要的证书和密钥存储。
要在端点之间设置双向 SSL/TLS,您需要为 master 域控制器以及每个主机控制器生成并配置证书和密钥存储。您还需要将主域控制器的证书导入到每个主机控制器的密钥存储中,并将每个主机控制器的证书导入到主域控制器的密钥存储中。此过程的具体内容包括在为 管理接口设置双Way SSL/TLS 中。
将 master 域控制器配置为使用 SSL/TLS。
配置所有证书和密钥存储后,您需要将安全域配置为使用双向 SSL/TLS。这可以通过将安全域配置为使用 SSL/TLS 并对其进行身份验证来实现。然后,该安全域用于保护用于在主机控制器和主域控制器之间连接的管理接口。
注意以下命令必须以批处理模式运行,或者在添加 ssl 服务器身份后重新加载服务器。下例中使用了批处理模式。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow batch /host=master/core-service=management/security-realm=CertificateRealm:add() /host=master/core-service=management/security-realm=CertificateRealm/server-identity=ssl:add(alias=domaincontroller,keystore-relative-to=jboss.domain.config.dir,keystore-path=domaincontroller.jks,keystore-password=secret) /host=master/core-service=management/security-realm=CertificateRealm/authentication=truststore:add(keystore-relative-to=jboss.domain.config.dir,keystore-path=domaincontroller.jks,keystore-password=secret) /host=master/core-service=management/security-realm=CertificateRealm/authentication=local:add(default-user=\$local) /host=master/core-service=management/security-realm=CertificateRealm/authentication=properties:add(relative-to=jboss.domain.config.dir,path=mgmt-users.properties) /host=master/core-service=management/management-interface=native-interface:write-attribute(name=security-realm,value=CertificateRealm) run-batch
batch /host=master/core-service=management/security-realm=CertificateRealm:add() /host=master/core-service=management/security-realm=CertificateRealm/server-identity=ssl:add(alias=domaincontroller,keystore-relative-to=jboss.domain.config.dir,keystore-path=domaincontroller.jks,keystore-password=secret) /host=master/core-service=management/security-realm=CertificateRealm/authentication=truststore:add(keystore-relative-to=jboss.domain.config.dir,keystore-path=domaincontroller.jks,keystore-password=secret) /host=master/core-service=management/security-realm=CertificateRealm/authentication=local:add(default-user=\$local) /host=master/core-service=management/security-realm=CertificateRealm/authentication=properties:add(relative-to=jboss.domain.config.dir,path=mgmt-users.properties) /host=master/core-service=management/management-interface=native-interface:write-attribute(name=security-realm,value=CertificateRealm) run-batch
将所有主机控制器配置为使用 SSL/TLS。
将主域控制器配置为使用双向 SSL/TLS 后,还需要配置每个主机控制器来使用它。此过程与主域控制器配置非常相似,但您需要使用特定于每个主机的密钥存储。
注意以下命令必须以批处理模式运行,或者在添加 ssl 服务器身份后重新加载服务器。下例中使用了批处理模式。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow batch /host=instance1/core-service=management/security-realm=CertificateRealm:add() /host=instance1/core-service=management/security-realm=CertificateRealm/server-identity=ssl:add(alias=instance1,keystore-relative-to=jboss.domain.config.dir,keystore-path=instance1.jks,keystore-password=secret) /host=instance1/core-service=management/security-realm=CertificateRealm/authentication=truststore:add(keystore-relative-to=jboss.domain.config.dir,keystore-path=instance1.jks,keystore-password=secret) /host=instance1/core-service=management/security-realm=CertificateRealm/authentication=local:add(default-user="\$local") /host=instance1/core-service=management/security-realm=CertificateRealm/authentication=properties:add(relative-to=jboss.domain.config.dir,path=mgmt-users.properties) /host=instance1/core-service=management/management-interface=native-interface:write-attribute(name=security-realm,value=CertificateRealm) run-batch
batch /host=instance1/core-service=management/security-realm=CertificateRealm:add() /host=instance1/core-service=management/security-realm=CertificateRealm/server-identity=ssl:add(alias=instance1,keystore-relative-to=jboss.domain.config.dir,keystore-path=instance1.jks,keystore-password=secret) /host=instance1/core-service=management/security-realm=CertificateRealm/authentication=truststore:add(keystore-relative-to=jboss.domain.config.dir,keystore-path=instance1.jks,keystore-password=secret) /host=instance1/core-service=management/security-realm=CertificateRealm/authentication=local:add(default-user="\$local") /host=instance1/core-service=management/security-realm=CertificateRealm/authentication=properties:add(relative-to=jboss.domain.config.dir,path=mgmt-users.properties) /host=instance1/core-service=management/management-interface=native-interface:write-attribute(name=security-realm,value=CertificateRealm) run-batch
此外,您需要更新连接主域控制器时使用的安全域。此更改必须在主机控制器的配置文件中直接完成,如
host.xml
或host-slave.xml
,而服务器没有运行。主机控制器配置文件示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow <domain-controller> <remote security-realm="CertificateRealm" username="slave-user"> <discovery-options> <static-discovery name="primary" protocol="${jboss.domain.master.protocol:remote}" host="${jboss.domain.master.address}" port="${jboss.domain.master.port:9999}"/> </discovery-options> </remote> </domain-controller>
<domain-controller> <remote security-realm="CertificateRealm" username="slave-user"> <discovery-options> <static-discovery name="primary" protocol="${jboss.domain.master.protocol:remote}" host="${jboss.domain.master.address}" port="${jboss.domain.master.port:9999}"/> </discovery-options> </remote> </domain-controller>
警告红帽建议显式禁用 SSLv2、SSLv3 和 TLSv1.0,以便在所有受影响的软件包中明确禁用 TLSv1.1 或 TLSv1.2。
第 4 章 保护服务器的用户及其管理界面
除了了解如何保护 JBoss EAP 的各种接口外,还务必要了解如何保护访问这些接口的用户。
4.1. 用户身份验证
4.1.1. 默认用户配置
JBoss EAP 中的所有管理接口都是默认安全的,用户可以以两种不同的方式访问它们:本地接口和远程接口。这些身份验证机制的基础知识包括在 Red Hat JBoss Enterprise Application Platform Security Architecture Guide 的 Default Security and Red Hat JBoss Enterprise Application Platform Out of the Box 部分。默认情况下,在 Management Realm 安全域中配置对这些接口的访问。最初,本地接口已启用,需要访问运行 JBoss EAP 实例的主机计算机。也启用了远程访问,并配置为使用基于文件的身份存储。默认情况下,它使用 mgmt-users.properties
文件来存储用户名和密码,mgmt-groups.properties
来存储用户组信息。
使用 EAP_HOME/bin/
目录中包含的 adduser
脚本,将用户信息添加到这些文件中。
通过 adduser
脚本添加用户:
-
运行
add-user.sh
或add-user.bat
命令。 - 选择是否添加管理用户或应用程序用户。
- 选择用户将添加到的域。默认情况下,唯一可用的域是 ManagementRealm 和 ApplicationRealm。如果添加了自定义域,您可以手动输入其名称。
- 出现提示时,输入所需的用户名、密码和可选角色。这些更改将写入到安全域的每个属性文件中。
4.1.2. 通过 LDAP 添加身份验证
JBoss EAP 还支持使用 LDAP 身份验证来保护管理界面。Red Hat JBoss Enterprise Application Platform 7 安全架构指南的 LDAP 的基本知识及它如何与 LDAP 使用 LDAP,在 Red Hat JBoss Enterprise Application Platform 7 安全架构指南中 使用 LDAP 和 ManagementRealm 部分。有关如何使用 LDAP 身份验证保护管理接口的详情,请参阅 如何配置身份管理指南中的使用 LDAP 保护管理接口 部分。
4.2. 安全密码
4.2.1. 密码 Vault
配置 JBoss EAP 和相关应用需要潜在的敏感信息,如用户名和密码。Password Vault 功能可用于屏蔽密码信息并将其存储在加密的密钥存储中,而不是以纯文本形式存储密码。密码存储之后,可将引用包含在管理 CLI 命令中或部署到 JBoss EAP 的应用中。
Password Vault 使用 Java Keystore 作为其存储机制。密码 Vault 由两个部分组成:存储和密钥存储。Java Keystore 用于存储密钥,该密钥用于在 Vault 存储中加密或解密敏感字符串。
此步骤中使用了由 Java Runtime Environment(JRE)提供的 keytool 程序。找到在 Red Hat Enterprise Linux 上的文件的路径 /usr/bin/keytool
。
JCEKS 密钥存储实现在 Java 供应商之间有所不同,因此必须使用与 JDK 使用的相同供应商的 keytool 程序生成密钥存储。使用 keytool 从不同供应商上运行的 JBoss EAP 7 实例中的一个供应商的 JDK 生成的密钥存储会导致以下例外: java.io.IOException: com.sun.crypto.provider.SealedObjectForKeyProtector
4.2.1.1. 设置密码 Vault
按照以下步骤设置和使用密码 Vault。
创建用于存储密钥存储和其他加密信息的目录。
创建用于存储密钥存储和其他重要信息的目录。此流程的其余部分假定目录为
EAP_HOME/vault/
。由于此目录将包含敏感信息,它应该只能被有限的用户访问。至少运行 JBoss EAP 的用户帐户需要读写访问。确定要与 keytool 程序一起使用的参数。
决定以下参数的值:
- alias
- alias 是密码库或密钥存储中存储的其他数据的唯一标识符。别名区分大小写。
- storetype
- storetype 指定密钥存储类型。建议使用 jceks 值。
- keyalg
- 用于加密的算法。使用 JRE 和操作系统的文档来查看哪些其他选择可用。
- keysize
- 加密密钥的大小会影响通过 brute 强制解密的难度。有关适当的值的信息,请查看使用 keytool 程序发布的文档。
- storepass
- storepass 的值是用于向密钥存储进行身份验证的密码,以便可以读取该密钥。密码长度必须至少为 6 个字符,必须在访问密钥存储时提供。如果省略此参数,则执行该命令后将提示输入 keytool 程序。
- keypass
- keypass 的值是用于访问特定键的密码,必须与 storepass 参数的值匹配。
- 有效期
- validity 的值是键有效的周期(以天数为单位)。
- keystore
keystore 的值是要存储密钥存储的值的 filepath 和 filename。当数据首次添加到它时,会创建密钥存储文件。确保使用正确的文件路径分隔符:用于 Red Hat Enterprise Linux 和类似操作系统的 / (正斜杠),\(backslash)用于 Microsoft Windows Server。
keytool
程序有许多其他选项。详情请查看 JRE 或操作系统的文档。
运行 keytool 命令。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow keytool -genseckey -alias vault -storetype jceks -keyalg AES -keysize 128 -storepass vault22 -keypass vault22 -validity 730 -keystore EAP_HOME/vault/vault.keystore
$ keytool -genseckey -alias vault -storetype jceks -keyalg AES -keysize 128 -storepass vault22 -keypass vault22 -validity 730 -keystore EAP_HOME/vault/vault.keystore
这将生成已在
EAP_HOME/vault/vault.keystore
文件中创建的密钥存储。它存储一个密钥,其别名为 vault,它将用于存储加密字符串(如密码)以用于 JBoss EAP。
4.2.1.2. 初始化密码库。
可以以交互方式初始化密码库,其中会提示您输入每个参数的值,或者非交互方式初始化,其中所有参数值都在命令行中提供。每种方法都给出相同的结果,因此可以使用其中任何一个。
需要以下参数:
- Keystore URL(KEYSTORE_URL)
-
密钥存储文件的文件系统路径或 URI。示例使用
EAP_HOME/vault/vault.keystore
。 - keystore password (KEYSTORE_PASSWORD)
- 用于访问密钥存储的密码。
- Salt (SALT)
- salt 值是一个由八个字符组成的随机字符串,与迭代计数一起使用,用于加密密钥存储的内容。
- keystore Alias (KEYSTORE_ALIAS)
- 已知密钥存储的别名。
- Iteration Count (ITERATION_COUNT)
- 运行加密算法的次数。
- 用于存储加密文件的目录(ENC_FILE_DIR)
- 加密文件的路径。这通常是包含密码库的目录。很方便,但不是强制要求,可将所有加密信息存储在与密钥存储相同的位置。该目录应该只能被有限的用户访问。至少运行 JBoss EAP 7 的用户帐户需要读写访问。该密钥存储应位于您设置密码 vault 时创建的目录中。请注意,目录名称上的结尾反斜杠或正斜杠是必需的。确保使用正确的文件路径分隔符:用于 Red Hat Enterprise Linux 和类似操作系统的 / (正斜杠),\(backslash)用于 Microsoft Windows Server。
- Vault Block (VAULT_BLOCK)
- 在密码 vault 中提供给此块的名称。
- 属性(ATTRIBUTE)
- 要提供给要存储的属性的名称。
- 安全属性(SEC-ATTR)
- 存储在密码库中的密码。
要以非交互方式运行 password vault 命令,可以使用相关信息的参数调用 vault 脚本(位于 EAP_HOME/bin/
中):
vault.sh --keystore KEYSTORE_URL --keystore-password KEYSTORE_PASSWORD --alias KEYSTORE_ALIAS --vault-block VAULT_BLOCK --attribute ATTRIBUTE --sec-attr SEC-ATTR --enc-dir ENC_FILE_DIR --iteration ITERATION_COUNT --salt SALT
$ vault.sh --keystore KEYSTORE_URL --keystore-password KEYSTORE_PASSWORD --alias KEYSTORE_ALIAS --vault-block VAULT_BLOCK --attribute ATTRIBUTE --sec-attr SEC-ATTR --enc-dir ENC_FILE_DIR --iteration ITERATION_COUNT --salt SALT
Example
vault.sh --keystore EAP_HOME/vault/vault.keystore --keystore-password vault22 --alias vault --vault-block vb --attribute password --sec-attr 0penS3sam3 --enc-dir EAP_HOME/vault/ --iteration 120 --salt 1234abcd
$ vault.sh --keystore EAP_HOME/vault/vault.keystore --keystore-password vault22 --alias vault --vault-block vb --attribute password --sec-attr 0penS3sam3 --enc-dir EAP_HOME/vault/ --iteration 120 --salt 1234abcd
输出
========================================================================= JBoss Vault JBOSS_HOME: EAP_HOME JAVA: java ========================================================================= Nov 09, 2015 9:02:47 PM org.picketbox.plugins.vault.PicketBoxSecurityVault init INFO: PBOX00361: Default Security Vault Implementation Initialized and Ready WFLYSEC0047: Secured attribute value has been stored in Vault. Please make note of the following: ******************************************** Vault Block:vb Attribute Name:password Configuration should be done as follows: VAULT::vb::password::1 ******************************************** WFLYSEC0048: Vault Configuration in WildFly configuration file: ******************************************** </extensions> <vault> <vault-option name="KEYSTORE_URL" value="EAP_HOME/vault/vault.keystore"/> <vault-option name="KEYSTORE_PASSWORD" value="MASK-5dOaAVafCSd"/> <vault-option name="KEYSTORE_ALIAS" value="vault"/> <vault-option name="SALT" value="1234abcd"/> <vault-option name="ITERATION_COUNT" value="120"/> <vault-option name="ENC_FILE_DIR" value="EAP_HOME/vault/"/> </vault><management> ... ********************************************
=========================================================================
JBoss Vault
JBOSS_HOME: EAP_HOME
JAVA: java
=========================================================================
Nov 09, 2015 9:02:47 PM org.picketbox.plugins.vault.PicketBoxSecurityVault init
INFO: PBOX00361: Default Security Vault Implementation Initialized and Ready
WFLYSEC0047: Secured attribute value has been stored in Vault.
Please make note of the following:
********************************************
Vault Block:vb
Attribute Name:password
Configuration should be done as follows:
VAULT::vb::password::1
********************************************
WFLYSEC0048: Vault Configuration in WildFly configuration file:
********************************************
</extensions>
<vault>
<vault-option name="KEYSTORE_URL" value="EAP_HOME/vault/vault.keystore"/>
<vault-option name="KEYSTORE_PASSWORD" value="MASK-5dOaAVafCSd"/>
<vault-option name="KEYSTORE_ALIAS" value="vault"/>
<vault-option name="SALT" value="1234abcd"/>
<vault-option name="ITERATION_COUNT" value="120"/>
<vault-option name="ENC_FILE_DIR" value="EAP_HOME/vault/"/>
</vault><management> ...
********************************************
要以互动方式运行 password vault 命令,需要执行以下步骤:
以交互方式启动 password vault 命令。
运行
EAP_HOME/bin/vault.sh
(在 Red Hat Enterprise Linux 和类似操作系统上)或EAP_HOME\bin\vault.bat
(在 Microsoft Windows Server 上)。键入 0 ( 零)启动新的交互式会话。完成提示的参数。
按照提示输入所需参数。
记录已屏蔽的密码信息。
屏蔽的密码、salt 和迭代数将打印到标准输出。记下它们位于安全的位置。它们需要将条目添加到 Password Vault 中。访问密钥存储文件,这些值允许攻击者访问 Password Vault 中的敏感信息。
退出交互式控制台
键入 2 ( 两)退出交互式控制台。
输入和输出示例
Please enter a Digit:: 0: Start Interactive Session 1: Remove Interactive Session 2: Exit 0 Starting an interactive session Enter directory to store encrypted files:EAP_HOME/vault/ Enter Keystore URL:EAP_HOME/vault/vault.keystore Enter Keystore password: vault22 Enter Keystore password again: vault22 Values match Enter 8 character salt:1234abcd Enter iteration count as a number (Eg: 44):120 Enter Keystore Alias:vault Initializing Vault Nov 09, 2015 9:24:36 PM org.picketbox.plugins.vault.PicketBoxSecurityVault init INFO: PBOX000361: Default Security Vault Implementation Initialized and Ready Vault Configuration in AS7 config file: ******************************************** ... </extensions> <vault> <vault-option name="KEYSTORE_URL" value="EAP_HOME/vault/vault.keystore"/> <vault-option name="KEYSTORE_PASSWORD" value="MASK-5dOaAVafCSd"/> <vault-option name="KEYSTORE_ALIAS" value="vault"/> <vault-option name="SALT" value="1234abcd"/> <vault-option name="ITERATION_COUNT" value="120"/> <vault-option name="ENC_FILE_DIR" value="EAP_HOME/vault/"/> </vault><management> ... ******************************************** Vault is initialized and ready for use Handshake with Vault complete
Please enter a Digit:: 0: Start Interactive Session 1: Remove Interactive Session 2: Exit
0
Starting an interactive session
Enter directory to store encrypted files:EAP_HOME/vault/
Enter Keystore URL:EAP_HOME/vault/vault.keystore
Enter Keystore password: vault22
Enter Keystore password again: vault22
Values match
Enter 8 character salt:1234abcd
Enter iteration count as a number (Eg: 44):120
Enter Keystore Alias:vault
Initializing Vault
Nov 09, 2015 9:24:36 PM org.picketbox.plugins.vault.PicketBoxSecurityVault init
INFO: PBOX000361: Default Security Vault Implementation Initialized and Ready
Vault Configuration in AS7 config file:
********************************************
...
</extensions>
<vault>
<vault-option name="KEYSTORE_URL" value="EAP_HOME/vault/vault.keystore"/>
<vault-option name="KEYSTORE_PASSWORD" value="MASK-5dOaAVafCSd"/>
<vault-option name="KEYSTORE_ALIAS" value="vault"/>
<vault-option name="SALT" value="1234abcd"/>
<vault-option name="ITERATION_COUNT" value="120"/>
<vault-option name="ENC_FILE_DIR" value="EAP_HOME/vault/"/>
</vault><management> ...
********************************************
Vault is initialized and ready for use
Handshake with Vault complete
+ 密钥存储密码已被屏蔽,用于配置文件和部署。此外,密码库已初始化并可使用。
4.2.1.3. 将 JBoss EAP 配置为使用密码 vault。
在密码和其他敏感属性可以屏蔽和使用之前,JBoss EAP 7 必须了解存储并解密它们的密码库。
以下命令可将 JBoss EAP 7 配置为使用密码 vault:
/core-service=vault:add(vault-options=[("KEYSTORE_URL" => "PATH_TO_KEYSTORE"),("KEYSTORE_PASSWORD" => "MASKED_PASSWORD"),("KEYSTORE_ALIAS" => "ALIAS"),("SALT" => "SALT"),("ITERATION_COUNT" => "ITERATION_COUNT"),("ENC_FILE_DIR" => "ENC_FILE_DIR")]) /core-service=vault:add(vault-options=[("KEYSTORE_URL" => "EAP_HOME/vault/vault.keystore"),("KEYSTORE_PASSWORD" => "MASK-5dOaAVafCSd"),("KEYSTORE_ALIAS" => "vault"),("SALT" => "1234abcd"),("ITERATION_COUNT" => "120"),("ENC_FILE_DIR" => "EAP_HOME/vault/")])
/core-service=vault:add(vault-options=[("KEYSTORE_URL" => "PATH_TO_KEYSTORE"),("KEYSTORE_PASSWORD" => "MASKED_PASSWORD"),("KEYSTORE_ALIAS" => "ALIAS"),("SALT" => "SALT"),("ITERATION_COUNT" => "ITERATION_COUNT"),("ENC_FILE_DIR" => "ENC_FILE_DIR")])
/core-service=vault:add(vault-options=[("KEYSTORE_URL" => "EAP_HOME/vault/vault.keystore"),("KEYSTORE_PASSWORD" => "MASK-5dOaAVafCSd"),("KEYSTORE_ALIAS" => "vault"),("SALT" => "1234abcd"),("ITERATION_COUNT" => "120"),("ENC_FILE_DIR" => "EAP_HOME/vault/")])
如果使用 Microsoft Windows Server,请在文件路径中使用两个反斜杠(\\),而不是使用一个。例如: C:\\data\\vault\\vault.keystore
。这是因为单个反斜杠字符(\)用于字符转义。
4.2.2. 在 Password Vault 中存储敏感字符串
在纯文本配置文件中包括密码和其他敏感字符串是一个安全风险。将这些字符串保存在 Password Vault 中以提高安全性,然后可以在配置文件中引用它们,使用其屏蔽的形式管理 CLI 命令和应用程序。
敏感字符串可以以交互方式存储在 Password Vault 中,其中工具会提示每个参数的值,或者以非交互方式提示,其中所有参数的值都在命令行中提供。每种方法都给出相同的结果,因此可以使用其中任何一个。这两个方法都使用 vault 脚本调用。
要以非交互方式运行 password vault 命令,可以使用相关信息的参数调用 vault 脚本(位于 EAP_HOME/bin/
中):
vault.sh --keystore KEYSTORE_URL --keystore-password KEYSTORE_PASSWORD --alias KEYSTORE_ALIAS --vault-block VAULT_BLOCK --attribute ATTRIBUTE --sec-attr SEC-ATTR --enc-dir ENC_FILE_DIR --iteration ITERATION_COUNT --salt SALT
$ vault.sh --keystore KEYSTORE_URL --keystore-password KEYSTORE_PASSWORD --alias KEYSTORE_ALIAS --vault-block VAULT_BLOCK --attribute ATTRIBUTE --sec-attr SEC-ATTR --enc-dir ENC_FILE_DIR --iteration ITERATION_COUNT --salt SALT
密钥存储密码必须以纯文本形式提供,而不是屏蔽的格式。
Example
vault.sh --keystore EAP_HOME/vault/vault.keystore --keystore-password vault22 --alias vault --vault-block vb --attribute password --sec-attr 0penS3sam3 --enc-dir EAP_HOME/vault/ --iteration 120 --salt 1234abcd
$ vault.sh --keystore EAP_HOME/vault/vault.keystore --keystore-password vault22 --alias vault --vault-block vb --attribute password --sec-attr 0penS3sam3 --enc-dir EAP_HOME/vault/ --iteration 120 --salt 1234abcd
输出
========================================================================= JBoss Vault JBOSS_HOME: EAP_HOME JAVA: java ========================================================================= Nov 09, 2015 9:24:36 PM org.picketbox.plugins.vault.PicketBoxSecurityVault init INFO: PBOX00361: Default Security Vault Implementation Initialized and Ready WFLYSEC0047: Secured attribute value has been stored in Vault. Please make note of the following: ******************************************** Vault Block:vb Attribute Name:password Configuration should be done as follows: VAULT::vb::password::1 ******************************************** WFLYSEC0048: Vault Configuration in WildFly configuration file: ******************************************** ... </extensions> <vault> <vault-option name="KEYSTORE_URL" value="../vault/vault.keystore"/> <vault-option name="KEYSTORE_PASSWORD" value="MASK-5dOaAVafCSd"/> <vault-option name="KEYSTORE_ALIAS" value="vault"/> <vault-option name="SALT" value="1234abcd"/> <vault-option name="ITERATION_COUNT" value="120"/> <vault-option name="ENC_FILE_DIR" value="../vault/"/> </vault><management> ... ********************************************
=========================================================================
JBoss Vault
JBOSS_HOME: EAP_HOME
JAVA: java
=========================================================================
Nov 09, 2015 9:24:36 PM org.picketbox.plugins.vault.PicketBoxSecurityVault init
INFO: PBOX00361: Default Security Vault Implementation Initialized and Ready
WFLYSEC0047: Secured attribute value has been stored in Vault.
Please make note of the following:
********************************************
Vault Block:vb
Attribute Name:password
Configuration should be done as follows:
VAULT::vb::password::1
********************************************
WFLYSEC0048: Vault Configuration in WildFly configuration file:
********************************************
...
</extensions>
<vault>
<vault-option name="KEYSTORE_URL" value="../vault/vault.keystore"/>
<vault-option name="KEYSTORE_PASSWORD" value="MASK-5dOaAVafCSd"/>
<vault-option name="KEYSTORE_ALIAS" value="vault"/>
<vault-option name="SALT" value="1234abcd"/>
<vault-option name="ITERATION_COUNT" value="120"/>
<vault-option name="ENC_FILE_DIR" value="../vault/"/>
</vault><management> ...
********************************************
调用 vault 脚本后,消息将打印到标准输出,显示 vault 块、属性名称、屏蔽的字符串以及有关在配置中使用字符串的建议。在安全的位置记录此信息。示例输出的提取如下:
Vault Block:vb Attribute Name:password Configuration should be done as follows: VAULT::vb::password::1
Vault Block:vb
Attribute Name:password
Configuration should be done as follows:
VAULT::vb::password::1
要以互动方式运行 password vault 命令,需要执行以下步骤:
以交互方式启动 Password Vault 命令。
启动操作系统的命令行界面,并运行
EAP_HOME/bin/vault.sh
(在 Red Hat Enterprise Linux 和类似的操作系统上)或EAP_HOME\bin\vault.bat
(在 Microsoft Windows Server 上)。键入 0 ( 零)启动新的交互式会话。完成提示的参数。
按照提示输入所需参数。这些值必须与创建密码 Vault 时提供的匹配。
注意密钥存储密码必须以纯文本形式提供,而不是屏蔽的格式。
完成有关敏感字符串的提示参数。
输入 0 (零)开始存储敏感字符串。按照提示输入所需参数。
记录有关已屏蔽字符串的信息。
消息会输出到标准输出,显示 vault 块、属性名称、屏蔽的字符串,以及有关在配置中使用字符串的建议。在安全的位置记录此信息。示例输出的提取如下:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Vault Block:ds_Example1 Attribute Name:password Configuration should be done as follows: VAULT::ds_Example1::password::1
Vault Block:ds_Example1 Attribute Name:password Configuration should be done as follows: VAULT::ds_Example1::password::1
退出交互式控制台。
键入 2 ( 两)退出交互式控制台。
输入和输出示例
========================================================================= JBoss Vault JBOSS_HOME: EAP_HOME JAVA: java ========================================================================= ********************************** **** JBoss Vault *************** ********************************** Please enter a Digit:: 0: Start Interactive Session 1: Remove Interactive Session 2: Exit 0 Starting an interactive session Enter directory to store encrypted files:EAP_HOME/vault/ Enter Keystore URL:EAP_HOME/vault/vault.keystore Enter Keystore password: Enter Keystore password again: Values match Enter 8 character salt:1234abcd Enter iteration count as a number (Eg: 44):120 Enter Keystore Alias:vault Initializing Vault Nov 09, 2015 9:24:36 PM org.picketbox.plugins.vault.PicketBoxSecurityVault init INFO: PBOX000361: Default Security Vault Implementation Initialized and Ready Vault Configuration in AS7 config file: ******************************************** ... </extensions> <vault> <vault-option name="KEYSTORE_URL" value="EAP_HOME/vault/vault.keystore"/> <vault-option name="KEYSTORE_PASSWORD" value="MASK-5dOaAVafCSd"/> <vault-option name="KEYSTORE_ALIAS" value="vault"/> <vault-option name="SALT" value="1234abcd"/> <vault-option name="ITERATION_COUNT" value="120"/> <vault-option name="ENC_FILE_DIR" value="EAP_HOME/vault/"/> </vault><management> ... ******************************************** Vault is initialized and ready for use Handshake with Vault complete Please enter a Digit:: 0: Store a secured attribute 1: Check whether a secured attribute exists 2: Remove secured attribute 3: Exit 0 Task: Store a secured attribute Please enter secured attribute value (such as password): Please enter secured attribute value (such as password) again: Values match Enter Vault Block:ds_Example1 Enter Attribute Name:password Secured attribute value has been stored in vault. Please make note of the following: ******************************************** Vault Block:ds_Example1 Attribute Name:password Configuration should be done as follows: VAULT::ds_Example1::password::1 ******************************************** Please enter a Digit:: 0: Store a secured attribute 1: Check whether a secured attribute exists 2: Remove secured attribute 3: Exit
=========================================================================
JBoss Vault
JBOSS_HOME: EAP_HOME
JAVA: java
=========================================================================
**********************************
**** JBoss Vault ***************
**********************************
Please enter a Digit:: 0: Start Interactive Session 1: Remove Interactive Session 2: Exit
0
Starting an interactive session
Enter directory to store encrypted files:EAP_HOME/vault/
Enter Keystore URL:EAP_HOME/vault/vault.keystore
Enter Keystore password:
Enter Keystore password again:
Values match
Enter 8 character salt:1234abcd
Enter iteration count as a number (Eg: 44):120
Enter Keystore Alias:vault
Initializing Vault
Nov 09, 2015 9:24:36 PM org.picketbox.plugins.vault.PicketBoxSecurityVault init
INFO: PBOX000361: Default Security Vault Implementation Initialized and Ready
Vault Configuration in AS7 config file:
********************************************
...
</extensions>
<vault>
<vault-option name="KEYSTORE_URL" value="EAP_HOME/vault/vault.keystore"/>
<vault-option name="KEYSTORE_PASSWORD" value="MASK-5dOaAVafCSd"/>
<vault-option name="KEYSTORE_ALIAS" value="vault"/>
<vault-option name="SALT" value="1234abcd"/>
<vault-option name="ITERATION_COUNT" value="120"/>
<vault-option name="ENC_FILE_DIR" value="EAP_HOME/vault/"/>
</vault><management> ...
********************************************
Vault is initialized and ready for use
Handshake with Vault complete
Please enter a Digit:: 0: Store a secured attribute 1: Check whether a secured attribute exists 2: Remove secured attribute 3: Exit
0
Task: Store a secured attribute
Please enter secured attribute value (such as password):
Please enter secured attribute value (such as password) again:
Values match
Enter Vault Block:ds_Example1
Enter Attribute Name:password
Secured attribute value has been stored in vault.
Please make note of the following:
********************************************
Vault Block:ds_Example1
Attribute Name:password
Configuration should be done as follows:
VAULT::ds_Example1::password::1
********************************************
Please enter a Digit:: 0: Store a secured attribute 1: Check whether a secured attribute exists 2: Remove secured attribute 3: Exit
4.2.2.1. 在配置中使用加密敏感字符串
任何已加密的敏感字符串都可在配置文件或管理 CLI 命令中使用,以屏蔽的形式提供表达式。
要确认特定子系统内是否允许表达式,请针对该子系统运行以下管理 CLI 命令:
/subsystem=SUBSYSTEM:read-resource-description(recursive=true)
/subsystem=SUBSYSTEM:read-resource-description(recursive=true)
在运行此命令的输出中,查找 expression -allowed 参数的值。如果这是 true,则可在此子系统配置中使用表达式。
使用以下语法将任何明文字符串替换为屏蔽的格式。
${VAULT::VAULT_BLOCK::ATTRIBUTE_NAME::MASKED_STRING}
${VAULT::VAULT_BLOCK::ATTRIBUTE_NAME::MASKED_STRING}
示例 - 使用 Masked Form 中的密码的数据源定义
... <subsystem xmlns="urn:jboss:domain:datasources:1.0"> <datasources> <datasource jndi-name="java:jboss/datasources/ExampleDS" enabled="true" use-java-context="true" pool-name="H2DS"> <connection-url>jdbc:h2:mem:test;DB_CLOSE_DELAY=-1</connection-url> <driver>h2</driver> <pool></pool> <security> <user-name>sa</user-name> <password>${VAULT::ds_ExampleDS::password::1}</password> </security> </datasource> <drivers> <driver name="h2" module="com.h2database.h2"> <xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class> </driver> </drivers> </datasources> </subsystem> ...
...
<subsystem xmlns="urn:jboss:domain:datasources:1.0">
<datasources>
<datasource jndi-name="java:jboss/datasources/ExampleDS" enabled="true" use-java-context="true" pool-name="H2DS">
<connection-url>jdbc:h2:mem:test;DB_CLOSE_DELAY=-1</connection-url>
<driver>h2</driver>
<pool></pool>
<security>
<user-name>sa</user-name>
<password>${VAULT::ds_ExampleDS::password::1}</password>
</security>
</datasource>
<drivers>
<driver name="h2" module="com.h2database.h2">
<xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
</driver>
</drivers>
</datasources>
</subsystem>
...
4.2.2.2. 在应用程序中使用加密敏感字符串
密码 Vault 中存储的加密字符串可用于应用程序的源代码。以下示例是 servlet 的源代码提取,说明在数据源定义中使用屏蔽的密码,而不是明文密码。纯文本版本已注释掉,您可以看到区别。
使用 Vault 密码的 servlet
@DataSourceDefinition( name = "java:jboss/datasources/LoginDS", user = "sa", password = "VAULT::DS::thePass::1", className = "org.h2.jdbcx.JdbcDataSource", url = "jdbc:h2:tcp://localhost/mem:test" ) /*old (plaintext) definition @DataSourceDefinition( name = "java:jboss/datasources/LoginDS", user = "sa", password = "sa", className = "org.h2.jdbcx.JdbcDataSource", url = "jdbc:h2:tcp://localhost/mem:test" )*/
@DataSourceDefinition(
name = "java:jboss/datasources/LoginDS",
user = "sa",
password = "VAULT::DS::thePass::1",
className = "org.h2.jdbcx.JdbcDataSource",
url = "jdbc:h2:tcp://localhost/mem:test"
)
/*old (plaintext) definition
@DataSourceDefinition(
name = "java:jboss/datasources/LoginDS",
user = "sa",
password = "sa",
className = "org.h2.jdbcx.JdbcDataSource",
url = "jdbc:h2:tcp://localhost/mem:test"
)*/
4.2.2.3. 检查敏感字符串是否在 Password Vault 中
在尝试存储或使用密码 Vault 中的敏感字符串之前,请先确认它是否已存储。
此检查可以交互方式完成,其中提示用户输入每个参数的值,或者非交互方式进行,其中所有参数的值都在命令行中都提供了。每种方法都给出相同的结果,因此可以使用其中任何一个。这两个方法都使用 vault 脚本调用。
使用非互动方法一次性提供所有参数的值。有关所有参数的描述,请参阅 Initialize the Password Vault。要以非交互方式运行 password vault 命令,可以使用相关信息的参数调用 vault 脚本(位于 EAP_HOME/bin/
中):
vault.sh --keystore KEYSTORE_URL --keystore-password KEYSTORE_PASSWORD --alias KEYSTORE_ALIAS --check-sec-attr --vault-block VAULT_BLOCK --attribute ATTRIBUTE --enc-dir ENC_FILE_DIR --iteration ITERATION_COUNT --salt SALT
$ vault.sh --keystore KEYSTORE_URL --keystore-password KEYSTORE_PASSWORD --alias KEYSTORE_ALIAS --check-sec-attr --vault-block VAULT_BLOCK --attribute ATTRIBUTE --enc-dir ENC_FILE_DIR --iteration ITERATION_COUNT --salt SALT
使用实际值替换占位符值。KEYSTORE_URL、KEYSTORE_PASSWORD 和 KEYSTORE_ALIAS 的值必须与创建 Password Vault 时提供的值匹配。
密钥存储密码必须以纯文本形式提供,而不是屏蔽的格式。
如果敏感字符串存储在指定的 vault 块中,则会显示以下信息:
Password already exists.
Password already exists.
如果该值没有存储在指定块中,则会显示以下信息:
Password doesn't exist.
Password doesn't exist.
要以互动方式运行 password vault 命令,需要执行以下步骤:
以交互方式启动 password vault 命令。
运行
EAP_HOME/bin/vault.sh
(在 Red Hat Enterprise Linux 和类似操作系统上)或EAP_HOME\bin\vault.bat
(在 Microsoft Windows Server 上)。键入 0 ( 零)启动新的交互式会话。完成提示的参数。按照提示输入所需的身份验证参数。这些值必须与创建密码 Vault 时提供的匹配。
注意提示输入身份验证时,密钥存储密码必须以纯文本形式提供,而不是屏蔽的形式。
- 输入 1 ( 一)选择"检查是否存在安全属性"。
- 输入存储敏感字符串的 vault 块的名称。
- 输入要检查的敏感字符串名称。
如果敏感字符串存储在指定的 vault 块中,则会输出类似如下的确认消息:
A value exists for (VAULT_BLOCK, ATTRIBUTE)
A value exists for (VAULT_BLOCK, ATTRIBUTE)
如果敏感字符串没有存储在指定块中,则会输出类似如下的消息:
No value has been store for (VAULT_BLOCK, ATTRIBUTE)
No value has been store for (VAULT_BLOCK, ATTRIBUTE)
示例 - 主动检查敏感字符串
========================================================================= JBoss Vault JBOSS_HOME: EAP_HOME JAVA: java ========================================================================= ********************************** **** JBoss Vault *************** ********************************** Please enter a Digit:: 0: Start Interactive Session 1: Remove Interactive Session 2: Exit 0 Starting an interactive session Enter directory to store encrypted files:EAP_HOME/vault Enter Keystore URL:EAP_HOME/vault/vault.keystore Enter Keystore password: Enter Keystore password again: Values match Enter 8 character salt:1234abcd Enter iteration count as a number (Eg: 44):120 Enter Keystore Alias:vault Initializing Vault Nov 09, 2015 9:24:36 PM org.picketbox.plugins.vault.PicketBoxSecurityVault init INFO: PBOX000361: Default Security Vault Implementation Initialized and Ready Vault Configuration in AS7 config file: ******************************************** ... </extensions> <vault> <vault-option name="KEYSTORE_URL" value="EAP_HOME/vault/vault.keystore"/> <vault-option name="KEYSTORE_PASSWORD" value="MASK-5dOaAVafCSd"/> <vault-option name="KEYSTORE_ALIAS" value="vault"/> <vault-option name="SALT" value="1234abcd"/> <vault-option name="ITERATION_COUNT" value="120"/> <vault-option name="ENC_FILE_DIR" value="EAP_HOME/vault/"/> </vault><management> ... ******************************************** Vault is initialized and ready for use Handshake with Vault complete Please enter a Digit:: 0: Store a secured attribute 1: Check whether a secured attribute exists 2: Remove secured attribute 3: Exit 1 Task: Verify whether a secured attribute exists Enter Vault Block:vb Enter Attribute Name:password A value exists for (vb, password) Please enter a Digit:: 0: Store a secured attribute 1: Check whether a secured attribute exists 2: Remove secured attribute 3: Exit
=========================================================================
JBoss Vault
JBOSS_HOME: EAP_HOME
JAVA: java
=========================================================================
**********************************
**** JBoss Vault ***************
**********************************
Please enter a Digit:: 0: Start Interactive Session 1: Remove Interactive Session 2: Exit
0
Starting an interactive session
Enter directory to store encrypted files:EAP_HOME/vault
Enter Keystore URL:EAP_HOME/vault/vault.keystore
Enter Keystore password:
Enter Keystore password again:
Values match
Enter 8 character salt:1234abcd
Enter iteration count as a number (Eg: 44):120
Enter Keystore Alias:vault
Initializing Vault
Nov 09, 2015 9:24:36 PM org.picketbox.plugins.vault.PicketBoxSecurityVault init
INFO: PBOX000361: Default Security Vault Implementation Initialized and Ready
Vault Configuration in AS7 config file:
********************************************
...
</extensions>
<vault>
<vault-option name="KEYSTORE_URL" value="EAP_HOME/vault/vault.keystore"/>
<vault-option name="KEYSTORE_PASSWORD" value="MASK-5dOaAVafCSd"/>
<vault-option name="KEYSTORE_ALIAS" value="vault"/>
<vault-option name="SALT" value="1234abcd"/>
<vault-option name="ITERATION_COUNT" value="120"/>
<vault-option name="ENC_FILE_DIR" value="EAP_HOME/vault/"/>
</vault><management> ...
********************************************
Vault is initialized and ready for use
Handshake with Vault complete
Please enter a Digit:: 0: Store a secured attribute 1: Check whether a secured attribute exists 2: Remove secured attribute 3: Exit
1
Task: Verify whether a secured attribute exists
Enter Vault Block:vb
Enter Attribute Name:password
A value exists for (vb, password)
Please enter a Digit:: 0: Store a secured attribute 1: Check whether a secured attribute exists 2: Remove secured attribute 3: Exit
4.2.2.4. 从 Password Vault 中删除敏感字符串
为安全起见,最好在不再需要密码 Vault 中删除敏感字符串。例如,如果应用程序被停用,数据源定义中使用的任何敏感字符串都应同时删除。
作为先决条件,在从 Password Vault 中删除敏感字符串之前,请确认它是否在 JBoss EAP 配置中使用。
此操作可以交互方式完成,其中提示用户输入每个参数的值,或者非交互方式进行,其中所有参数的值都会在命令行中提供。每种方法都给出相同的结果,因此可以使用其中任何一个。这两个方法都使用 vault 脚本调用。
使用非互动方法一次性提供所有参数的值。有关所有参数的描述,请参阅 Initialize the Password Vault。要以非交互方式运行 password vault 命令,可以使用相关信息的参数调用 vault 脚本(位于 EAP_HOME/bin/
中):
vault.sh --keystore KEYSTORE_URL --keystore-password KEYSTORE_PASSWORD --alias KEYSTORE_ALIAS --remove-sec-attr --vault-block VAULT_BLOCK --attribute ATTRIBUTE --enc-dir ENC_FILE_DIR --iteration ITERATION_COUNT --salt SALT
$ vault.sh --keystore KEYSTORE_URL --keystore-password KEYSTORE_PASSWORD --alias KEYSTORE_ALIAS --remove-sec-attr --vault-block VAULT_BLOCK --attribute ATTRIBUTE --enc-dir ENC_FILE_DIR --iteration ITERATION_COUNT --salt SALT
使用实际值替换占位符值。KEYSTORE_URL、KEYSTORE_PASSWORD 和 KEYSTORE_ALIAS 的值必须与创建 Password Vault 时提供的值匹配。
密钥存储密码必须以纯文本形式提供,而不是屏蔽的格式。
如果成功删除了敏感字符串,则会显示类似如下的确认信息:
Secured attribute [VAULT_BLOCK::ATTRIBUTE] has been successfully removed from vault
Secured attribute [VAULT_BLOCK::ATTRIBUTE] has been successfully removed from vault
如果没有删除敏感字符串,则会显示类似如下的消息:
Secured attribute [VAULT_BLOCK::ATTRIBUTE] was not removed from vault, check whether it exist
Secured attribute [VAULT_BLOCK::ATTRIBUTE] was not removed from vault, check whether it exist
输出示例
./vault.sh --keystore EAP_HOME/vault/vault.keystore --keystore-password vault22 --alias vault --remove-sec-attr --vault-block vb --attribute password --enc-dir EAP_HOME/vault/ --iteration 120 --salt 1234abcd
$ ./vault.sh --keystore EAP_HOME/vault/vault.keystore --keystore-password vault22 --alias vault --remove-sec-attr --vault-block vb --attribute password --enc-dir EAP_HOME/vault/ --iteration 120 --salt 1234abcd
=========================================================================
JBoss Vault
JBOSS_HOME: EAP_HOME
JAVA: java
=========================================================================
Dec 23, 2015 1:54:24 PM org.picketbox.plugins.vault.PicketBoxSecurityVault init
INFO: PBOX000361: Default Security Vault Implementation Initialized and Ready
Secured attribute [vb::password] has been successfully removed from vault
删除敏感字符串交互
要以互动方式运行 password vault 命令,需要执行以下步骤:
以交互方式启动 password vault 命令。
运行
EAP_HOME/bin/vault.sh
(在 Red Hat Enterprise Linux 和类似操作系统上)或EAP_HOME\bin\vault.bat
(在 Microsoft Windows Server 上)。键入 0 ( 零)启动新的交互式会话。完成提示的参数。
按照提示输入所需的身份验证参数。这些值必须与创建密码 Vault 时提供的匹配。
注意提示输入身份验证时,密钥存储密码必须以纯文本形式提供,而不是屏蔽的形式。
- 输入 2 ( 两)选择删除安全属性的选项。
- 输入存储敏感字符串的 vault 块的名称。
- 输入要删除的敏感字符串的名称。
如果成功删除了敏感字符串,则会显示类似如下的确认信息:
Secured attribute [VAULT_BLOCK::ATTRIBUTE] has been successfully removed from vault
Secured attribute [VAULT_BLOCK::ATTRIBUTE] has been successfully removed from vault
如果没有删除敏感字符串,则会显示类似如下的消息:
Secured attribute [VAULT_BLOCK::ATTRIBUTE] was not removed from vault, check whether it exist
Secured attribute [VAULT_BLOCK::ATTRIBUTE] was not removed from vault, check whether it exist
输出示例
********************************** **** JBoss Vault *************** ********************************** Please enter a Digit:: 0: Start Interactive Session 1: Remove Interactive Session 2: Exit 0 Starting an interactive session Enter directory to store encrypted files:EAP_HOME/vault/ Enter Keystore URL:EAP_HOME/vault/vault.keystore Enter Keystore password: Enter Keystore password again: Values match Enter 8 character salt:1234abcd Enter iteration count as a number (Eg: 44):120 Enter Keystore Alias:vault Initializing Vault Dec 23, 2014 1:40:56 PM org.picketbox.plugins.vault.PicketBoxSecurityVault init INFO: PBOX000361: Default Security Vault Implementation Initialized and Ready Vault Configuration in configuration file: ******************************************** ... </extensions> <vault> <vault-option name="KEYSTORE_URL" value="EAP_HOME/vault/vault.keystore"/> <vault-option name="KEYSTORE_PASSWORD" value="MASK-5dOaAVafCSd"/> <vault-option name="KEYSTORE_ALIAS" value="vault"/> <vault-option name="SALT" value="1234abcd"/> <vault-option name="ITERATION_COUNT" value="120"/> <vault-option name="ENC_FILE_DIR" value="EAP_HOME/vault/"/> </vault><management> ... ******************************************** Vault is initialized and ready for use Handshake with Vault complete Please enter a Digit:: 0: Store a secured attribute 1: Check whether a secured attribute exists 2: Remove secured attribute 3: Exit 2 Task: Remove secured attribute Enter Vault Block:vb Enter Attribute Name:password Secured attribute [vb::password] has been successfully removed from vault
**********************************
**** JBoss Vault ***************
**********************************
Please enter a Digit:: 0: Start Interactive Session 1: Remove Interactive Session 2: Exit
0
Starting an interactive session
Enter directory to store encrypted files:EAP_HOME/vault/
Enter Keystore URL:EAP_HOME/vault/vault.keystore
Enter Keystore password:
Enter Keystore password again:
Values match
Enter 8 character salt:1234abcd
Enter iteration count as a number (Eg: 44):120
Enter Keystore Alias:vault
Initializing Vault
Dec 23, 2014 1:40:56 PM org.picketbox.plugins.vault.PicketBoxSecurityVault init
INFO: PBOX000361: Default Security Vault Implementation Initialized and Ready
Vault Configuration in configuration file:
********************************************
...
</extensions>
<vault>
<vault-option name="KEYSTORE_URL" value="EAP_HOME/vault/vault.keystore"/>
<vault-option name="KEYSTORE_PASSWORD" value="MASK-5dOaAVafCSd"/>
<vault-option name="KEYSTORE_ALIAS" value="vault"/>
<vault-option name="SALT" value="1234abcd"/>
<vault-option name="ITERATION_COUNT" value="120"/>
<vault-option name="ENC_FILE_DIR" value="EAP_HOME/vault/"/>
</vault><management> ...
********************************************
Vault is initialized and ready for use
Handshake with Vault complete
Please enter a Digit:: 0: Store a secured attribute 1: Check whether a secured attribute exists 2: Remove secured attribute 3: Exit
2
Task: Remove secured attribute
Enter Vault Block:vb
Enter Attribute Name:password
Secured attribute [vb::password] has been successfully removed from vault
4.2.2.5. 配置 Red Hat JBoss Enterprise Application Platform 平台,以使用密码 Vault 的自定义实施
除了使用提供的 Password Vault 实现外,也可以使用 SecurityVault 的自定义实施。
作为前提条件,请确保已初始化密码 Vault。如需更多信息,请参阅 Initialize the Password Vault。
为 Password vault 使用自定义实现:
- 创建一个实施接口 SecurityVault 的类。
- 创建包含上一步中的类的模块,并指定接口为 SecurityVault 的 org.picketbox 的依赖项。
通过添加带有以下属性的 vault 元素,在 JBoss EAP 配置中启用自定义 Password Vault:
- Code - 实现 SecurityVault 的全限定类名称。
- module - 包含自定义类的模块名称。
(可选) vault-options 参数可用于初始化 Password Vault 的自定义类。
示例 - 使用 vault-options 参数初始化自定义类
/core-service=vault:add( code="custom.vault.implementation.CustomSecurityVault", module="custom.vault.module", vault-options=[("KEYSTORE_URL" => "PATH_TO_KEYSTORE"),("KEYSTORE_PASSWORD" => "MASKED_PASSWORD"), ("KEYSTORE_ALIAS" => "ALIAS"),("SALT" => "SALT"),("ITERATION_COUNT" => "ITERATION_COUNT"),("ENC_FILE_DIR" => "ENC_FILE_DIR")])
/core-service=vault:add( code="custom.vault.implementation.CustomSecurityVault", module="custom.vault.module", vault-options=[("KEYSTORE_URL" => "PATH_TO_KEYSTORE"),("KEYSTORE_PASSWORD" => "MASKED_PASSWORD"), ("KEYSTORE_ALIAS" => "ALIAS"),("SALT" => "SALT"),("ITERATION_COUNT" => "ITERATION_COUNT"),("ENC_FILE_DIR" => "ENC_FILE_DIR")])
4.2.2.6. 从外部源获取密钥存储密码
EXT, EXTC, CMD, CMDC 或 CLASS 方法可用于 Vault 配置来获取 Java 密钥存储密码。
<vault-option name="KEYSTORE_PASSWORD" value="[here]"/>
<vault-option name="KEYSTORE_PASSWORD" value="[here]"/>
方法的描述列为:
- {EXT}…
-
指的是确切的命令,其中 '…' 是确切的命令。例如: {EXT}/usr/bin/getmypassword --section 1 --query company,运行
/usr/bin/getmypassword
命令,该命令显示标准输出的密码,并将其用作 Security Vault 的密钥存储的密码。在本例中,命令使用了两个选项:-- section 1 和 --query company。 - {EXTC[:expiration_in_millis]}…
-
指的是确切的命令,其中 … 是传递给 Runtime.exec (String) 方法执行平台命令的确切命令行。命令输出的第一行被用作密码。EXTC 变体缓存 expiration_in_millis 毫秒的密码。默认缓存过期时间为 0 = infinity。例如: {EXTC:120000}/usr/bin/getmypassword --section 1 --query company 验证缓存是否包含
/usr/bin/getmypassword
输出,如果它包含输出,则使用它。如果它不包含输出,请运行 命令将其输出为缓存并使用它。在本例中,缓存在 2 分钟后过期(120000 毫秒)。 - {CMD}… or {CMDC[:expiration_in_millis]}…
- 常规命令是一个字符串,用 分隔 , (comma),第一部分是实际命令,其他部分代表参数。可以反斜线,将其保留为参数的一部分。例如,{CMD}/usr/bin/getmypassword,--section,1,--query,company.
- {CLASS[@jboss_module_spec]}classname[:ctorargs]
- 其中 [:ctorargs] 是一个由类名称分隔的可选字符串 : (colon)传递给 classname ctor。ctorargs 是一个以逗号分隔的字符串列表。例如,{CLASS@org.test.passwd}org.test.passwd.ExternamPassworProvider。在本例中,org.test.passwd.ExternamPassworProvider 类是从 org.test.passwd 模块加载的,并使用 toCharArray () 方法获取密码。如果 toCharArray () 没有使用 toString () 方法。org.test.passwd.ExternamPassworProvider 类必须具有默认的构造器。
4.3. 基于角色的访问控制
有关或基于角色的访问控制的基础知识,请参阅基于角色的访问控制,并将 RBAC 添加到 安全架构指南的管理接口部分。
4.3.1. 启用基于角色的访问控制
默认情况下禁用基于角色的访问控制(RBAC)系统。它通过将 provider 属性从 simple 改为 rbac 来启用。provider 是 management 元素的 access-control 元素的属性。这可以通过管理 CLI 或编辑服务器配置 XML 文件(如果服务器离线)来完成。当在正在运行的服务器上禁用或启用 RBAC 时,必须先重新加载服务器配置,然后才能生效。
启用后,只能由 Administrator 或 SuperUser 角色的用户禁用。默认情况下,如果管理 CLI 在与服务器相同的计算机上运行,则管理 CLI 作为 SuperUser 角色运行。
要使用管理 CLI 启用 RBAC,请使用访问授权资源的 write-attribute 操作,将 provider 属性设置为 rbac。
CLI 启用 RBAC
/core-service=management/access=authorization:write-attribute(name=provider, value=rbac)
/core-service=management/access=authorization:write-attribute(name=provider, value=rbac)
要通过管理 CLI 禁用 RBAC,请使用访问授权资源的 write-attribute 操作,将 provider 属性设置为 simple。
CLI 禁用 RBAC
/core-service=management/access=authorization:write-attribute(name=provider, value=simple)
/core-service=management/access=authorization:write-attribute(name=provider, value=simple)
如果服务器离线,可以编辑 XML 配置来启用或禁用 RBAC。为此,请编辑 management 元素的 access-control 元素的 provider 属性。将值设为 rbac 设为 enable,将 simple 设置为 disable。
XML 示例
<management> <access-control provider="rbac"> <role-mapping> <role name="SuperUser"> <include> <user name="$local"/> </include> </role> </role-mapping> </access-control> </management>
<management>
<access-control provider="rbac">
<role-mapping>
<role name="SuperUser">
<include>
<user name="$local"/>
</include>
</role>
</role-mapping>
</access-control>
</management>
4.3.2. 更改权限组合策略
权限组合策略决定如何确定用户是否分配多个角色。这可设置为 permissive 或 reject。默认值为 permissive。
当设置为 permissive 时,如果为允许操作的用户分配了任何角色,则允许该操作。
当设置为 reject 时,如果为用户分配多个角色,则不允许操作。这意味着,当将策略设置为拒绝每个用户时,应该只分配一个角色。当策略设置为 reject 时,具有多个角色的用户将无法使用管理控制台或管理 CLI。
权限组合策略通过将 permission-combination-policy 属性设置为 permissive 或 rejecting 来配置。这可以通过管理 CLI 或编辑服务器配置 XML 文件(如果服务器离线)来完成。permission-combination-policy 属性是 access-control 元素的一部分,可以在 management 元素中找到 access-control 元素。
设置权限组合策略
使用访问授权资源的 write-attribute 操作将 permission-combination-policy 属性设置为所需的策略名称。
/core-service=management/access=authorization:write-attribute(name=permission-combination-policy, value=POLICYNAME)
/core-service=management/access=authorization:write-attribute(name=permission-combination-policy, value=POLICYNAME)
有效的策略名称是 reject 和 permissive。
CLI 示例
/core-service=management/access=authorization:write-attribute(name=permission-combination-policy, value=rejecting)
/core-service=management/access=authorization:write-attribute(name=permission-combination-policy, value=rejecting)
如果服务器离线,可以编辑 XML 配置以更改权限组合策略值。为此,请编辑 access-control 元素的 permission-combination-policy 属性。
XML 示例
<access-control provider="rbac" permission-combination-policy="rejecting"> <role-mapping> <role name="SuperUser"> <include> <user name="$local"/> </include> </role> </role-mapping> </access-control>
<access-control provider="rbac" permission-combination-policy="rejecting">
<role-mapping>
<role name="SuperUser">
<include>
<user name="$local"/>
</include>
</role>
</role-mapping>
</access-control>
4.3.3. 管理角色
启用基于角色的访问控制(RBAC)时,允许什么管理用户由为用户分配的角色决定。JBoss EAP 7 使用 的 includes 和 excludes,基于用户和组成员资格来确定用户所属的角色。
如果用户是:
- 列出为要包含在角色中的用户,或者
- 列出要包含在角色中的组的成员。
如果用户不是,则用户也被视为被分配给角色:
- 列为从角色中排除的用户,或者
- 列出要从角色中排除的组的成员。
排除的优先级高于包含项。
可以使用管理控制台和管理 CLI 配置用户和组的角色包括和排除设置。
只有 SuperUser 或 Administrator 角色的用户才能执行此配置。
4.3.3.1. 使用管理 CLI 配置用户角色分配
将用户和组映射到角色的配置位于: /core-service=management/access=authorization 作为 role-mapping 元素。
只有 SuperUser 或 Administrator 角色的用户才能执行此配置。
查看角色分配配置
使用 :read-children-names 操作获取配置的角色的完整列表:
/core-service=management/access=authorization:read-children-names(child-type=role-mapping) { "outcome" => "success", "result" => [ "Administrator", "Deployer", "Maintainer", "Monitor", "Operator", "SuperUser" ] }
/core-service=management/access=authorization:read-children-names(child-type=role-mapping)
{
"outcome" => "success",
"result" => [
"Administrator",
"Deployer",
"Maintainer",
"Monitor",
"Operator",
"SuperUser"
]
}
使用指定 role-mapping 的 read-resource 操作来获取特定角色的完整详情:
/core-service=management/access=authorization/role-mapping=ROLENAME:read-resource(recursive=true) { "outcome" => "success", "result" => { "include-all" => false, "exclude" => undefined, "include" => { "user-theboss" => { "name" => "theboss", "realm" => undefined, "type" => "USER" }, "user-harold" => { "name" => "harold", "realm" => undefined, "type" => "USER" }, "group-SysOps" => { "name" => "SysOps", "realm" => undefined, "type" => "GROUP" } } } }
/core-service=management/access=authorization/role-mapping=ROLENAME:read-resource(recursive=true)
{
"outcome" => "success",
"result" => {
"include-all" => false,
"exclude" => undefined,
"include" => {
"user-theboss" => {
"name" => "theboss",
"realm" => undefined,
"type" => "USER"
},
"user-harold" => {
"name" => "harold",
"realm" => undefined,
"type" => "USER"
},
"group-SysOps" => {
"name" => "SysOps",
"realm" => undefined,
"type" => "GROUP"
}
}
}
}
添加新角色
此流程演示了如何为角色添加 role-mapping 条目。这必须在配置角色之前完成。
使用 add 操作来添加新角色配置。
/core-service=management/access=authorization/role-mapping=ROLENAME:add
/core-service=management/access=authorization/role-mapping=ROLENAME:add
- ROLENAME 是新映射所针对的角色的名称(如审核员)。
CLI 示例
/core-service=management/access=authorization/role-mapping=Auditor:add
/core-service=management/access=authorization/role-mapping=Auditor:add
根据角色中包含的用户添加用户
此流程演示了如何将用户添加到角色包含列表中。
如果没有为角色配置,则必须首先为它执行 role-mapping 条目。
使用 add 操作,将用户条目添加到角色的 includes 列表中。
/core-service=management/access=authorization/role-mapping=ROLENAME/include=ALIAS:add(name=USERNAME, type=USER)
/core-service=management/access=authorization/role-mapping=ROLENAME/include=ALIAS:add(name=USERNAME, type=USER)
- ROLENAME 是要配置的角色的名称。(如审核员)
- ALIAS 是此映射的唯一名称。红帽建议对别名使用命名约定,如 user-USERNAME。(如 user-max)
- USERNAME 是添加到 include 列表中的用户的名称。(例如 max)
CLI 示例
/core-service=management/access=authorization/role-mapping=Auditor/include=user-max:add(name=max, type=USER)
/core-service=management/access=authorization/role-mapping=Auditor/include=user-max:add(name=max, type=USER)
在角色中以排除的形式添加用户
此流程演示了如何将用户添加到角色的排除列表中。
如果没有为角色配置,则必须首先为它执行 role-mapping 条目。
使用 add 操作将用户条目添加到角色的 excludes 列表中。
/core-service=management/access=authorization/role-mapping=ROLENAME/exclude=ALIAS:add(name=USERNAME, type=USER)
/core-service=management/access=authorization/role-mapping=ROLENAME/exclude=ALIAS:add(name=USERNAME, type=USER)
- ROLENAME 是要配置的角色的名称。(如审核员)
- USERNAME 是添加到 exclude 列表中的用户的名称。(例如 max)
- ALIAS 是此映射的唯一名称。红帽建议对别名使用命名约定,如 user-USERNAME。(如 user-max)
CLI 示例
/core-service=management/access=authorization/role-mapping=Auditor/exclude=user-max:add(name=max, type=USER)
/core-service=management/access=authorization/role-mapping=Auditor/exclude=user-max:add(name=max, type=USER)
删除用户角色包括配置
此流程演示了如何从角色映射中删除用户包含条目。
使用 remove 操作来删除该条目。
/core-service=management/access=authorization/role-mapping=ROLENAME/include=ALIAS:remove
/core-service=management/access=authorization/role-mapping=ROLENAME/include=ALIAS:remove
- ROLENAME 是要配置的角色的名称(如审核员)
- ALIAS 是此映射的唯一名称。红帽建议对别名使用命名约定,如 user-USERNAME。(如 user-max)
CLI 示例
/core-service=management/access=authorization/role-mapping=Auditor/include=user-max:remove
/core-service=management/access=authorization/role-mapping=Auditor/include=user-max:remove
从 includes 列表中删除用户不会从系统中删除用户,也不保证该角色不会分配给该用户。该角色可能仍然根据组成员资格分配。
删除用户角色排除配置
此流程演示了如何从角色映射中删除用户排除的条目。
使用 remove 操作来删除该条目。
/core-service=management/access=authorization/role-mapping=ROLENAME/exclude=ALIAS:remove
/core-service=management/access=authorization/role-mapping=ROLENAME/exclude=ALIAS:remove
- ROLENAME 是要配置的角色的名称。(如审核员)
- ALIAS 是此映射的唯一名称。红帽建议对别名使用命名约定,如 user-USERNAME。(如 user-max)
/core-service=management/access=authorization/role-mapping=Auditor/exclude=user-max:remove
/core-service=management/access=authorization/role-mapping=Auditor/exclude=user-max:remove
从 excludes 列表中删除用户不会从系统中删除用户,也不保证该角色将被分配给该用户。角色可能仍然根据组成员资格排除。
4.3.4. 角色和用户组
使用 mgmt-users.properties
文件或 LDAP 服务器进行身份验证的用户可以是用户组的成员。用户组是一个任意标签,可以分配给一个或多个用户。
可将 RBAC 系统配置为根据用户所属的用户组自动为用户分配角色。它还可以根据组成员资格从角色中排除用户。
使用 mgmt-users.properties
文件时,组信息存储在 mgmt-groups.properties
文件中。在使用 LDAP 时,组信息存储在 LDAP 服务器,并由负责 LDAP 服务器的那些存储在 LDAP 服务器中。
4.3.5. 使用管理 CLI 配置组角色分配
要在管理控制台和管理 CLI 中配置角色中包含的或排除的组。本主题仅显示使用管理 CLI。
将用户和组映射到角色的配置位于管理 API 中,地址为: /core-service=management/access=authorization 作为 role-mapping 元素。
只有 SuperUser 或 Administrator 角色的用户才能执行此配置。
查看组角色分配配置
使用 read-children-names 操作获取配置角色的完整列表:
/core-service=management/access=authorization:read-children-names(child-type=role-mapping) { "outcome" => "success", "result" => [ "Administrator", "Deployer", "Maintainer", "Monitor", "Operator", "SuperUser" ] }
/core-service=management/access=authorization:read-children-names(child-type=role-mapping)
{
"outcome" => "success",
"result" => [
"Administrator",
"Deployer",
"Maintainer",
"Monitor",
"Operator",
"SuperUser"
]
}
使用指定 role-mapping 的 read-resource 操作来获取特定角色的完整详情:
/core-service=management/access=authorization/role-mapping=ROLENAME:read-resource(recursive=true) { "outcome" => "success", "result" => { "include-all" => false, "exclude" => undefined, "include" => { "user-theboss" => { "name" => "theboss", "realm" => undefined, "type" => "USER" }, "user-harold" => { "name" => "harold", "realm" => undefined, "type" => "USER" }, "group-SysOps" => { "name" => "SysOps", "realm" => undefined, "type" => "GROUP" } } } }
/core-service=management/access=authorization/role-mapping=ROLENAME:read-resource(recursive=true)
{
"outcome" => "success",
"result" => {
"include-all" => false,
"exclude" => undefined,
"include" => {
"user-theboss" => {
"name" => "theboss",
"realm" => undefined,
"type" => "USER"
},
"user-harold" => {
"name" => "harold",
"realm" => undefined,
"type" => "USER"
},
"group-SysOps" => {
"name" => "SysOps",
"realm" => undefined,
"type" => "GROUP"
}
}
}
}
添加新角色
此流程演示了如何为角色添加 role-mapping 条目。这必须在配置角色之前完成。
使用 add 操作来添加新角色配置。
/core-service=management/access=authorization/role-mapping=ROLENAME:add
/core-service=management/access=authorization/role-mapping=ROLENAME:add
根据角色中包含的组添加组
此流程演示了如何将组添加到角色包含列表中。
如果没有为角色配置,则必须首先为它执行 role-mapping 条目。
使用 add 操作,将 Group 条目添加到角色的 includes 列表中。
/core-service=management/access=authorization/role-mapping=ROLENAME/include=ALIAS:add(name=GROUPNAME, type=GROUP)
/core-service=management/access=authorization/role-mapping=ROLENAME/include=ALIAS:add(name=GROUPNAME, type=GROUP)
- ROLENAME 是要配置的角色的名称。(如审核员)
- GROUPNAME 是添加到 include 列表中的组名称。(例如,投资者)
- ALIAS 是此映射的唯一名称。红帽建议为您的别名使用命名约定,如 group-GROUPNAME。(例如 group-investigators)
CLI 示例
/core-service=management/access=authorization/role-mapping=Auditor/include=group-investigators:add(name=investigators, type=GROUP)
/core-service=management/access=authorization/role-mapping=Auditor/include=group-investigators:add(name=investigators, type=GROUP)
在角色中添加排除的组
此流程演示了如何将组添加到角色的排除列表中。
如果没有为角色配置,则必须首先为其创建 role-mapping 条目。
使用 add 操作,将组条目添加到角色的 excludes 列表中。
/core-service=management/access=authorization/role-mapping=ROLENAME/exclude=ALIAS:add(name=GROUPNAME, type=GROUP)
/core-service=management/access=authorization/role-mapping=ROLENAME/exclude=ALIAS:add(name=GROUPNAME, type=GROUP)
- ROLENAME 是要配置的角色的名称(如审核员)
- GROUPNAME 是添加到 include 列表中的组名称(例如 supervisors)
- ALIAS 是此映射的唯一名称。红帽建议为您的别名使用命名约定,如 group-GROUPNAME。(例如 group-supervisors)
CLI 示例
/core-service=management/access=authorization/role-mapping=Auditor/exclude=group-supervisors:add(name=supervisors, type=GROUP)
/core-service=management/access=authorization/role-mapping=Auditor/exclude=group-supervisors:add(name=supervisors, type=GROUP)
删除组角色包括配置
此流程演示了如何从角色映射中删除组包含条目。
使用 remove 操作来删除该条目。
/core-service=management/access=authorization/role-mapping=ROLENAME/include=ALIAS:remove
/core-service=management/access=authorization/role-mapping=ROLENAME/include=ALIAS:remove
- ROLENAME 是要配置的角色的名称(如审核员)
- ALIAS 是此映射的唯一名称。红帽建议为您的别名使用命名约定,如 group-GROUPNAME。(例如 group-investigators)
CLI 示例
/core-service=management/access=authorization/role-mapping=Auditor/include=group-investigators:remove
/core-service=management/access=authorization/role-mapping=Auditor/include=group-investigators:remove
从 includes 列表中删除组不会从系统中删除组,也不保证该角色不会分配给此组中的用户。该角色可能仍然被单独分配给组中的用户。
删除用户组排除条目
此流程演示了如何从角色映射中删除组排除条目。
使用 remove 操作来删除该条目。
/core-service=management/access=authorization/role-mapping=ROLENAME/exclude=ALIAS:remove
/core-service=management/access=authorization/role-mapping=ROLENAME/exclude=ALIAS:remove
- ROLENAME 是要配置的角色的名称。(如审核员)
- ALIAS 是此映射的唯一名称。红帽建议为您的别名使用命名约定,如 group-GROUPNAME。(例如 group-supervisors)
/core-service=management/access=authorization/role-mapping=Auditor/exclude=group-supervisors:remove
/core-service=management/access=authorization/role-mapping=Auditor/exclude=group-supervisors:remove
从 excludes 列表中删除组不会从系统中删除组。它还不能保证该角色将分配给组的成员。角色可能仍然根据组成员资格排除。
4.3.6. 使用 LDAP 的 RBAC
如何配置身份管理指南的 LDAP 和 RBAC 部分中介绍了通过 LDAP 使用 RBAC 的基础知识,以及如何将 JBoss EAP 7 配置为使用 LDAP。
4.3.7. 有范围的角色
有作用域角色是用户定义的角色,授予其中一个标准角色的权限,但仅对 JBoss EAP 受管域中的一个或多个服务器组或主机授予权限。有范围角色允许管理用户被授予权限,仅限于那些所需的服务器组或主机。
可为分配了 Administrator 或 SuperUser 角色的用户创建范围角色。
它们由五个特征定义:
- 唯一的名称。
- 它所基于的标准角色。
- 如果它适用于服务器组或主机
- 它限制的服务器组或主机列表。
- 如果所有用户被自动包含。默认值为 false。
创建范围角色后,可以像标准角色一样分配给用户和组。
创建有范围的角色不允许定义新权限。有范围的角色只能用于应用有限范围内现有角色的权限。例如,可以基于限制为单个服务器组的 Deployer 角色来创建有范围的角色。
角色只能限制为两个范围:
- 主机范围角色
- 主机作用域的角色将该角色的权限限制为一个或多个主机。这意味着,为相关的 /hostcategories/ 资源树提供访问权限,但特定于其他主机的资源会被隐藏。
- server-Group-scoped 角色
- 即 server-group 范围的角色将该角色的权限限制为一个或多个服务器组。此外,角色权限也将应用到与指定服务器组关联的配置集、套接字绑定组、服务器配置和服务器资源。与 server-group 无关的任何子资源都对用户不可见。
4.3.7.1. 通过管理 CLI 配置范围角色
只有 SuperUser 或 Administrator 角色的用户才能执行此配置。
添加新的范围角色
要添加新的 Scoped 角色,必须执行以下操作:
/core-service=management/access=authorization/role-mapping=NEW-SCOPED-ROLE:add
/core-service=management/access=authorization/role-mapping=NEW-SCOPED-ROLE:add
/core-service=management/access=authorization/server-group-scoped-role=NEW-SCOPED-ROLE:add(base-role=BASE-ROLE, server-groups=[SERVER-GROUP-NAME])
/core-service=management/access=authorization/server-group-scoped-role=NEW-SCOPED-ROLE:add(base-role=BASE-ROLE, server-groups=[SERVER-GROUP-NAME])
将 NEW-SCOPED-ROLE、BASE-ROLE 和 SERVER-GROUP-NAME 替换为正确的信息。
查看并编辑范围角色映射
可以通过发出以下命令来查看范围角色的详情(包括成员):
/core-service=management/access=authorization/role-mapping=NEW-SCOPED-ROLE:read-resource(recursive=true)
/core-service=management/access=authorization/role-mapping=NEW-SCOPED-ROLE:read-resource(recursive=true)
将 NEW-SCOPED-ROLE 替换为正确的信息。
要编辑范围角色的详细信息,可以使用 write-attribute 命令。例如:
/core-service=management/access=authorization/role-mapping=NEW-SCOPED-ROLE:write-attribute(name=include-all, value=true)
/core-service=management/access=authorization/role-mapping=NEW-SCOPED-ROLE:write-attribute(name=include-all, value=true)
将 NEW-SCOPED-ROLE 替换为正确的信息。
删除范围角色
/core-service=management/access=authorization/role-mapping=NEW-SCOPED-ROLE:remove
/core-service=management/access=authorization/role-mapping=NEW-SCOPED-ROLE:remove
/core-service=management/access=authorization/server-group-scoped-role=NEW-SCOPED-ROLE:remove
/core-service=management/access=authorization/server-group-scoped-role=NEW-SCOPED-ROLE:remove
将 NEW-SCOPED-ROLE 替换为正确的信息。
如果为它分配了用户或组,则无法删除 Scoped 角色。首先删除角色分配,然后将其删除。
添加和删除用户
向范围角色添加或删除用户遵循与 添加和删除标准角色 相同的流程。
4.3.7.2. 从管理控制台配置范围角色
只有 SuperUser 或 Administrator 角色的用户才能执行此配置。
管理控制台中的有范围角色配置可以通过以下步骤找到:
- 登录到管理控制台
- 点 Access Control 选项卡
- 单击左侧的 Roles 菜单,并显示所有角色(包括有范围角色)。
以下流程演示了如何为有范围角色执行配置任务。
添加新的范围角色
- 登录到管理控制台
- 点 Access Control 选项卡
- 点左侧的 Roles 菜单。
- 点击 Add。
指定以下详情:
- 名称,新范围角色的唯一名称。
- 基础 角色,此角色将在其上构建其权限的角色。
- 键入,无论此角色是否仅限于主机还是服务器组。
- 范围,角色仅限于的主机或服务器组列表。可以选择多个条目。
- 包括 All,此角色应自动包含所有用户。默认值为 no。
- 单击 Save,对话框将关闭,新创建的角色将显示在表中。
编辑范围角色
- 登录到管理控制台
- 点 Access Control 选项卡
- 点左侧的 Roles 菜单。
- 单击所需范围的角色来编辑,然后单击 Edit。
- 更新所需更改的详细信息,然后单击 保存按钮。
查看范围角色成员
- 登录到管理控制台
- 点 Access Control 选项卡
- 点左侧的 Roles 菜单。
- 点所需范围的角色,然后选择 Include 或 Exclude 来查看包含或排除的成员。
删除范围角色
- 登录到管理控制台
- 点 Access Control 选项卡
- 点左侧的 Roles 菜单。
- 单击所需范围角色,单击编辑按钮旁边的下拉菜单,再单击删除 。
- 单击 Confirm。对话框关闭,并删除角色。
如果为它分配了用户或组,则无法删除有范围的角色。首先删除角色分配,然后将其删除。
添加和删除用户
向范围角色添加和删除用户遵循与添加和删除标准角色相同的流程。更新用户的范围角色:
- 登录到管理控制台
- 点 Access Control 选项卡
- 点左侧的 Roles 菜单。
- 点所需范围的角色,然后选择 Include 或 Exclude 来查看包含或排除的成员。
- 要添加成员,请单击 Add,选择要包含或排除的成员,然后单击 Save。
- 要删除成员,请选择要删除的所需成员,然后单击 Remove。
4.3.8. 配置约束
4.3.8.1. 配置敏感约束
每个敏感度约束都定义了一组被视为 敏感的 资源。敏感 资源通常是机密(如密码)或对服务器有严重影响的 secret,如网络、JVM 配置或系统属性。访问控制系统本身也被视为敏感。资源敏感度限制哪些角色能够读取、写入或处理特定资源。
敏感度约束配置位于 at /core-service=management/access=authorization/constraint=sensitivity-classification 中。
在管理模型中,每个敏感性约束被识别为分类。然后分类被分成不同的类型。有 39 个分类,它们被安排为 13 个类型。
要配置敏感度约束,请使用 write-attribute 操作来设置 configured-requires-read、configured-requires-write 或 configured-requires-addressable 属性。要使该操作类型敏感,请将 属性的值设置为 true,否则将其非敏感性设置为 false。默认情况下,不会设置这些属性,并使用 default-requires-read、default-requires-write 和 default-requires-addressable 的值。设置配置的属性后,这是使用的值,而不是默认值。无法更改默认值。
示例 - 对敏感操作读取系统属性
/core-service=management/access=authorization/constraint=sensitivity-classification/type=core/classification=system-property:write-attribute(name=configured-requires-read,value=true)
/core-service=management/access=authorization/constraint=sensitivity-classification/type=core/classification=system-property:write-attribute(name=configured-requires-read,value=true)
结果
/core-service=management/access=authorization/constraint=sensitivity-classification/type=core/classification=system-property:read-resource
/core-service=management/access=authorization/constraint=sensitivity-classification/type=core/classification=system-property:read-resource
{ "outcome" => "success", "result" => { "configured-requires-addressable" => undefined, "configured-requires-read" => true, "configured-requires-write" => undefined, "default-requires-addressable" => false, "default-requires-read" => false, "default-requires-write" => true, "applies-to" => { "/core-service=platform-mbean/type=runtime" => undefined, "/system-property=*" => undefined, "/" => undefined } } }
{
"outcome" => "success",
"result" => {
"configured-requires-addressable" => undefined,
"configured-requires-read" => true,
"configured-requires-write" => undefined,
"default-requires-addressable" => false,
"default-requires-read" => false,
"default-requires-write" => true,
"applies-to" => {
"/core-service=platform-mbean/type=runtime" => undefined,
"/system-property=*" => undefined,
"/" => undefined
}
}
}
下表总结了根据这些属性的配置来执行哪些角色:
值 | requires-read | requires-write | requires-addressable |
---|---|---|---|
true | 读取是敏感的。只有 Auditor、Administrator、SuperUser 可以读取。 | 写是敏感的。只有 Administrator 和 SuperUser 可以写入。 | 寻址非常敏感。只有 Auditor、Administrator、SuperUser 可以地址。 |
false | 读取不敏感。任何管理用户都可以读取。 | 写不敏感。只有 Maintainer, Administrator 和 SuperUser 可以写入。Deployers 也可以编写资源是一个应用程序资源。 | 寻址不敏感。任何管理用户都可以解决。 |
4.3.8.2. 配置应用程序资源约束
每个应用程序资源约束都定义了一组资源、属性和操作,它们通常与应用程序和服务部署关联。当启用应用资源限制时,Deployer 角色的管理用户将被授予对其应用到的资源的访问权限。
应用程序约束配置位于 /core-service=management/access=authorization/constraint=application-classification/。
每个应用程序资源约束都标识为分类。然后分类被分成不同的类型。14 包含的分类被安排为 8 个类型。每个分类都有一个 apply-to 元素,它是应用到分类配置的资源路径模式列表。
默认情况下,唯一启用的应用程序资源分类是 core。Core 包括部署、部署覆盖和部署操作。
要启用应用程序资源,请使用 write-attribute 操作将分类的 configured-application 属性设置为 true。要禁用应用程序资源,请将此属性设置为 false。默认情况下,不会设置这些属性,并使用 default-application 属性的值。无法更改默认值。
启用 logger-profile 应用程序资源分类
/core-service=management/access=authorization/constraint=application-classification/type=logging/classification=logging-profile:write-attribute(name=configured-application,value=true)
/core-service=management/access=authorization/constraint=application-classification/type=logging/classification=logging-profile:write-attribute(name=configured-application,value=true)
结果
/core-service=management/access=authorization/constraint=application-classification/type=logging/classification=logging-profile:read-resource
/core-service=management/access=authorization/constraint=application-classification/type=logging/classification=logging-profile:read-resource
{ "outcome" => "success", "result" => { "configured-application" => true, "default-application" => false, "applies-to" => {"/subsystem=logging/logging-profile=*" => undefined} } }
{
"outcome" => "success",
"result" => {
"configured-application" => true,
"default-application" => false,
"applies-to" => {"/subsystem=logging/logging-profile=*" => undefined}
}
}
应用程序资源约束适用于匹配其配置的所有资源。例如,无法授予 Deployer 用户访问一个数据源资源,但不能访问另一个数据源资源。如果需要这种隔离级别,建议在不同的服务器组中配置资源,并为每个组创建不同的范围 Deployer 角色。
4.3.8.3. 配置 Vault 表达式约束
默认情况下,读取和写入 vault 表达式是敏感操作。配置 Vault Expression Constraint 允许将这些操作设置为非敏感。更改此约束允许更多角色读取和写入 vault 表达式。
vault 表达式约束可在 /core-service=management/access=authorization/constraint=vault-expression 中找到。
要配置 vault 表达式约束,请使用 write-attribute 操作将 configured-requires-write 和 configured-requires-read 设为 true 或 false 的属性。默认情况下,它们没有被设置,并使用 default-requires-read 和 default-requires-write 的值。无法更改默认值。
编写对 vault 表达式的非敏感操作
/core-service=management/access=authorization/constraint=vault-expression:write-attribute(name=configured-requires-write,value=false)
/core-service=management/access=authorization/constraint=vault-expression:write-attribute(name=configured-requires-write,value=false)
结果
/core-service=management/access=authorization/constraint=vault-expression:read-resource
/core-service=management/access=authorization/constraint=vault-expression:read-resource
{ "outcome" => "success", "result" => { "configured-requires-read" => undefined, "configured-requires-write" => false, "default-requires-read" => true, "default-requires-write" => true } }
{
"outcome" => "success",
"result" => {
"configured-requires-read" => undefined,
"configured-requires-write" => false,
"default-requires-read" => true,
"default-requires-write" => true
}
}
根据此配置,哪些角色可以读取和写入 vault 表达式:
值 | requires-read | requires-write |
---|---|---|
true | 读取操作非常敏感。只有 Auditor、Admin 和 SuperUser 才能读取。 | 写入操作非常敏感。只有 Administrator 和 SuperUser 可以写入。 |
false | 读操作不敏感。所有管理用户都可以读取。 | 写入操作不敏感。监控、管理员和 SuperUser 可以写入。如果 vault 表达式位于应用资源中,则部署器也可以编写。 |
4.3.8.4. 应用程序资源约束参考
type: core - Classification: deployment-overlay
- 默认: true
- PATH: /deployment-overlay=*
- PATH: /deployment=*
- PATH: /
- operation: upload-deployment-stream, full-replace-deployment, upload-deployment-url, upload-deployment-bytes
type: datasources - Classification: datasource
- 默认:false
- PATH: /deployment=*/subdeployment=*/subsystem=datasources/data-source=*
- PATH: /subsystem=datasources/data-source=*
- PATH: /subsystem=datasources/data-source=ExampleDS
- PATH: /deployment=*/subsystem=datasources/data-source=*
type: datasources - Classification: jdbc-driver
- 默认:false
- PATH: /subsystem=datasources/jdbc-driver=*
type: datasources - Classification: xa-data-source
- 默认:false
- PATH: /subsystem=datasources/xa-data-source=*
- PATH: /deployment=*/subsystem=datasources/xa-data-source=*
- PATH: /deployment=*/subdeployment=*/subsystem=datasources/xa-data-source=*
Type: logging - Classification: logger
- 默认:false
- PATH: /subsystem=logging/logger=*
- PATH: /subsystem=logging/logging-profile=*/logger=*
type: datasources - Classification: logging-profile
- 默认:false
- PATH: /subsystem=logging/logging-profilePROFILE
类型:mail - Classification: mail-session
- 默认:false
- PATH: /subsystem=mail/mail-sessionPROFILE
type: naming - Classification: binding
- 默认:false
- PATH: /subsystem=naming/binding hear
type: resource-adapters - Classification: resource-adapters
- 默认:false
- PATH: /subsystem=resource-adapters/resource-adapter=*
类型:security - Classification: security-domain
- 默认:false
- PATH: /subsystem=security/security-domain=*
4.3.8.5. 敏感度约束参考
type: core - Classification: access-control
- requires-addressable: true
- requires-read: true
- requires-write: true
- PATH: /core-service=management/access=authorization
- PATH: /subsystem=jmx ATTRIBUTE: non-core-mbean-sensitivity
type: core - Classification: credential
- requires-addressable: false
- requires-read: true
- requires-write: true
- PATH: /subsystem=mail/mail-sessionxxxx/server=pop3 ATTRIBUTE: username , password
- PATH: /subsystem=mail/mail-session require/server=imap ATTRIBUTE: username , password
- PATH: /subsystem=datasources/xa-data-source prerequisites ATTRIBUTE: user-name, recovery-username, password, recovery-password
- PATH: /subsystem=mail/mail-session require/custom.4-1. ATTRIBUTE: username, password
- PATH: /subsystem=datasources/data-sourcePROFILE" ATTRIBUTE: user-name, password
- PATH: /subsystem=remoting/remote-outbound-connectionPROFILE" ATTRIBUTE: username
- PATH: /subsystem=mail/mail-sessionPROFILE/server=smtp ATTRIBUTE: username, password
- PATH: /subsystem=resource-adapters/resource-adapteradapter/connection-definitions 9000" ATTRIBUTE: recovery-username, recovery-password
Type: core - Classification: domain-controller
- requires-addressable: false
- requires-read: false
- requires-write: true
type: core - Classification: domain-names
- requires-addressable: false
- requires-read: false
- requires-write: true
类型:core - Classification: extensions
- requires-addressable: false
- requires-read: false
- requires-write: true
- PATH: /extension=*
type: core - Classification: jvm
- requires-addressable: false
- requires-read: false
- requires-write: true
- PATH: /core-service=platform-mbean/type=runtime ATTRIBUTE: input-arguments, boot-class-path, class-path, boot-class-path-supported, library-path
type: core - Classification: management-interfaces
- requires-addressable: false
- requires-read: false
- requires-write: true
- /core-service=management/management-interface=http-interface
type: core - Classification: module-loading
- requires-addressable: false
- requires-read: false
- requires-write: true
- PATH: /core-service=module-loading
类型:core - Classification: patching
- requires-addressable: false
- requires-read: false
- requires-write: true
- PATH: /core-service=patching/addonPROFILE
- PATH: /core-service=patching/layerxxxx"
- PATH: /core-service=patching
type: core - Classification: read-whole-config
- requires-addressable: false
- requires-read: true
- requires-write: true
- PATH: / OPERATION: read-config-as-xml
type: core - Classification: security-domain
- requires-addressable: true
- requires-read: true
- requires-write: true
- PATH: /subsystem=security/security-domain=*
type: core - Classification: security-domain-ref
- requires-addressable: true
- requires-read: true
- requires-write: true
- PATH: /subsystem=datasources/xa-data-sourcePROFILE ATTRIBUTE: security-domain
- PATH: /subsystem=datasources/data-sourcePROFILE ATTRIBUTE: security-domain
- PATH: /subsystem=ejb3 ATTRIBUTE: default-security-domain
- PATH: /subsystem=resource-adapters/resource-adapter.4-1./connection-definitions.4-1. ATTRIBUTE: security-domain, recovery- security-domain, security-application, security-domain-and-application
type: core - Classification: security-realm
- requires-addressable: true
- requires-read: true
- requires-write: true
- PATH: /core-service=management/security-realm=*
type: core - Classification: security-realm-ref
- requires-addressable: true
- requires-read: true
- requires-write: true
- PATH: /subsystem=remoting/connectorxxxx ATTRIBUTE: security-realm
- PATH: /core-service=management/management-interface=native-interface ATTRIBUTE: security-realm
- PATH: /core-service=management/management-interface=http-interface ATTRIBUTE: security-realm
- PATH: /subsystem=remoting/remote-outbound-connectionPROFILE ATTRIBUTE: security-realm
Type: core - Classification: security-vault
- requires-addressable: false
- requires-read: false
- requires-write: true
- PATH: /core-service=vault
type: core - Classification: service-container
- requires-addressable: false
- requires-read: false
- requires-write: true
- PATH: /core-service=service-container
Type: core - Classification: snapshot
- requires-addressable: false
- requires-read: false
- requires-write: false
- PATH: / ATTRIBUTE: take-snapshot, list-snapshots, delete-snapshot
type: core - Classification: socket-binding-ref
- requires-addressable: false
- requires-read: false
- requires-write: false
- PATH: /subsystem=mail/mail-sessionxxxx/server=pop3 ATTRIBUTE: outbound-socket-binding-ref
- PATH: /subsystem=mail/mail-session.4-1./server=imap ATTRIBUTE: outbound-socket-binding-ref
- PATH: /subsystem=remoting/connectorxxxx ATTRIBUTE: socket-binding
- PATH: /subsystem=remoting/local-outbound-connectionPROFILE ATTRIBUTE: outbound-socket-binding-ref
- PATH: /socket-binding-groupPROFILE/local-destination-outbound-socket-binding 9000 ATTRIBUTE: socket-binding-ref
- PATH: /subsystem=remoting/remote-outbound-connectionPROFILE ATTRIBUTE: outbound-socket-binding-ref
- PATH: /subsystem=mail/mail-sessionPROFILE/server=smtp ATTRIBUTE: outbound-socket-binding-ref
- PATH: /subsystem=transactions ATTRIBUTE: process-id-socket-binding, status-socket-binding, socket-binding
type: core - Classification: socket-config
- requires-addressable: false
- requires-read: false
- requires-write: true
- PATH: /interfaceProductShortName OPERATION: resolve-internet-address
- PATH: /socket-binding-group=*
- PATH: /core-service=management/management-interface=http-interface ATTRIBUTE: port, secure-port, interface, secure-socket-binding, socket-binding
- PATH: / OPERATION: resolve-internet-address
- PATH: /subsystem=transactions ATTRIBUTE: process-id-socket-max-ports
type: core - Classification: system-property
- requires-addressable: false
- requires-read: false
- requires-write: true
- PATH: /core-service=platform-mbean/type=runtime ATTRIBUTE: system-properties
- PATH: /system-property=*
- PATH: / OPERATION: resolve-expression
type: datasources - Classification: data-source-security
- requires-addressable: false
- requires-read: true
- requires-write: true
- PATH: /subsystem=datasources/xa-data-source prerequisites ATTRIBUTE: user-name, security-domain, password
- PATH: /subsystem=datasources/data-sourcePROFILE ATTRIBUTE: user-name, security-domain, password
type: jdr - Classification: jdr
- requires-addressable: false
- requires-read: false
- requires-write: true
- PATH: /subsystem=jdr OPERATION: generate-jdr-report
类型:jmx - Classification: jmx
- requires-addressable: false
- requires-read: false
- requires-write: true
- PATH: /subsystem=jmx
类型:mail - Classification: mail-server-security
- requires-addressable: false
- requires-read: false
- requires-write: true
- PATH: /subsystem=mail/mail-session.4-1./server=pop3 ATTRIBUTE: username, tls, ssl, password
- PATH: /subsystem=mail/mail-session require/server=imap ATTRIBUTE: username, tls, ssl, password
- PATH: /subsystem=mail/mail-session=/custom= ATTRIBUTE: username, tls, ssl, password
- PATH: /subsystem=mail/mail-session.4-1./server=smtp ATTRIBUTE: username, tls, ssl, password
Type: naming - Classification: jndi-view
- requires-addressable: false
- requires-read: true
- requires-write: true
- PATH: /subsystem=naming OPERATION: jndi-view
type: naming - Classification: naming-binding
- requires-addressable: false
- requires-read: false
- requires-write: false
- PATH: /subsystem=naming/binding hear
类型:remoting - Classification: remoting-security
- requires-addressable: false
- requires-read: true
- requires-write: true
- PATH: /subsystem=remoting/connectorxxxx ATTRIBUTE: authentication-provider, security-realm
- PATH: /subsystem=remoting/remote-outbound-connectionPROFILE ATTRIBUTE: username, security-realm
- PATH: /subsystem=remoting/connectorxxxx/security=sasl
type: resource-adapters - Classification: resource-adapter-security
- requires-addressable: false
- requires-read: true
- requires-write: true
- PATH: /subsystem=resource-adapters/resource-adapter.4-1./connection-definitions.4-1. ATTRIBUTE: security-domain, recovery-username, recovery-security-domain, security-application, security-domain-and-application, recovery-password
类型:security - Classification: misc-security
- requires-addressable: false
- requires-read: true
- requires-write: true
- PATH: /subsystem=security ATTRIBUTE: deep-copy-subject-mode
第 5 章 Java 安全管理器
5.1. 关于 Java 安全管理器
Java 安全管理器是一个管理 Java 虚拟机(JVM)沙盒外部边界的类,用于控制 JVM 内执行的代码如何与 JVM 之外的资源交互。激活 Java Security Manager 后,Java API 会在执行各种可能不安全操作前检查安全管理器以进行批准。Java 安全管理器使用安全策略来确定是否允许或拒绝给定操作。
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=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="/-"}])
/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>
<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>
<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>
元素,则模块不会有限制。
5.3. 使用 Java 安全管理器运行 JBoss EAP
以前的 JBoss EAP 版本允许使用 -Djava.security.manager
Java 系统属性,以及自定义安全管理器。JBoss EAP 7 中不支持这两者。此外,Java 安全管理器策略现在在 security-manager
子系统中定义,这意味着 JBoss EAP 7 不支持外部策略文件和 -Djava.security.policy
Java 系统属性。
在启用 Java 安全管理器的情况下启动 JBoss EAP 之前,您需要确保 security-manager
子系统中定义了所有安全策略。
要使用 Java 安全管理器运行 JBoss EAP,您需要在启动期间使用 secmgr
选项。有两种方法可以做到这一点:
将 标志与启动脚本一起使用,以将
-secmgr
标志与启动脚本搭配使用,请在启动 JBoss EAP 实例时包括它:启动脚本示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ./standalone.sh -secmgr
./standalone.sh -secmgr
使用启动配置文件
重要在编辑任何配置文件之前,必须完全停止域或单机服务器。
注意如果您在受管域中使用 JBoss EAP,您必须在域中的每个物理主机或实例上执行以下步骤。
要使用启动配置文件启用 Java 安全管理器,您需要编辑
standalone.conf
或domain.conf
文件,具体取决于您正在运行独立实例或受管域。如果在 Windows 中运行,则改为使用standalone.conf.bat
或domain.conf.bat
文件。在配置文件中取消注释
SECMGR="true"
行:standalone.conf 或 domain.conf
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Uncomment this to run with a security manager enabled
# Uncomment this to run with a security manager enabled SECMGR="true"
standalone.conf.bat 或 domain.conf.bat
Copy to Clipboard Copied! Toggle word wrap Toggle overflow rem # Uncomment this to run with a security manager enabled set "SECMGR=true"
rem # Uncomment this to run with a security manager enabled set "SECMGR=true"
5.4. 从以前的版本移动的注意事项
将应用从 JBoss EAP 的早期版本移动到启用了 Java 安全管理器的情况下运行的 JBoss EAP 7 时,您需要了解策略如何定义以及 JBoss EAP 配置和部署所需的必要配置。
5.4.1. 定义策略
在之前的 JBoss EAP 版本中,策略在外部配置文件中定义。在 JBoss EAP 7 中,策略使用 security-manager
子系统定义,以及部署中包含的 permissions.xml
或 jboss-permissions.xml
。上一节中 介绍了如何使用这两个策略定义策略的更多详细信息。
5.4.2. JBoss EAP 配置更改
在以前的 JBoss EAP 版本中,您可以在 JBoss EAP 启动期间使用 -Djava.security.manager 和 -Djava.security.policy Java 系统属性。它们不再被支持,而应使用 secmgr 标志来启用 JBoss EAP 使用 Java 安全管理器运行。上一节中 将介绍 secmgr 标志的更多详细信息。
5.4.3. 自定义安全管理器
JBoss EAP 7 不支持自定义安全管理器。
更新于 2024-04-03