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命令从终端生成密钥存储$ 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:
/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:
/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 配置示例
/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命令创建空文件的示例$ touch EAP_HOME/standalone/configuration/https-mgmt-users.properties接下来,输入以下 CLI 命令创建名为 ManagementRealmHTTPS 的新安全域:
/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文件中的用户名和密码信息。$ 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重要在配置使用属性文件存储用户名和密码的安全域时,建议每个域使用不同的属性文件,它们不与另一个域共享。
配置管理接口以使用新的安全域。
/core-service=management/management-interface=http-interface:write-attribute(name=security-realm,value=ManagementRealmHTTPS)配置管理接口以使用密钥存储。
使用以下 CLI 命令,将管理接口配置为使用密钥存储。对于参数文件,必须从 第一步 中复制其值的密码和别名。
将密钥存储添加到安全域的 CLI 命令
/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 命令:
/core-service=management/security-realm=ManagementRealmHTTPS/server-identity=ssl:write-attribute(name=keystore-password,value=newpassword)此时,您需要重新载入服务器配置:
reload重新载入服务器配置后,日志应包含以下内容,只需在文本之前显示启动的服务数:
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 示例
<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安全域进行身份验证:接受服务器证书和授权示例
$ ./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)
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。
生成密钥存储。
$ 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 -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 -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,并将接口指向该服务器。这可以通过以下命令完成:/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。/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 示例
<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 示例
<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: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。
重新加载服务器以使更改生效。
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)
任何连接到启用了双向 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")
这个示例只列出了两个可能的密码,但实际示例可能会使用更多。
您可以将 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"
要将 Undertow 配置为对 SSL/TLS 使用 FIPS 140-2 兼容加密,您必须执行以下操作:
- 配置 NSS 数据库
- 配置 Undertow
2.2.8.1. 配置 NSS 数据库 复制链接链接已复制到粘贴板!
创建由相应用户拥有的目录,以存放 NSS 数据库。
创建 NSS 数据库目录的命令示例
$ 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示例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示例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中的以下链接:security.provider.5=com.sun.net.ssl.internal.ssl.Provider至
security.provider.5=com.sun.net.ssl.internal.ssl.Provider SunPKCS11-nss-fips重要此文件中的任何其他
security.provider.X行(如security.provider.2)都必须增加其 X 的值,以确保此 provider 具有优先权。在您在上一步中创建的 NSS 数据库目录上运行
modutil命令以启用 FIPS 模式。modutil -fips true -dbdir /usr/share/jboss-as/nssdb注意此时您可能会收到一个安全库错误,要求您为某些 NSS 共享对象重新生成库签名。
在 FIPS 令牌上设置密码。
令牌的名称必须是 NSS FIPS 140-2 Certificate DB。
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 工具创建证书。
命令示例
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 服务器身份后重新加载服务器。下例中使用了批处理模式。
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 侦听器和安全域配置为启用了特定的密码套件:
所需的加密套件
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 的命令示例
/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 的命令示例
/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 密钥存储中读取私钥:
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
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
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 示例
<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 示例
<security-realm name="HTTPSRealm"> <authentication> <truststore provider="PKCS11" keystore-password="strongP@ssword1"/> </authentication> </security-realm>注意您需要在每个主机上重复此过程。
保护 master 域控制器上的原生接口。
您需要确保 master 域控制器上的原生接口使用您刚才创建的安全域进行保护。
原生接口示例
<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,而服务器没有运行。主机控制器配置文件示例
<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>更新每个服务器如何连接其主机控制器。
您还需要更新每个服务器如何连接其主机控制器。
服务器配置示例
<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 命令:
/host=master/core-service=management/security-realm=HTTPSRealm/authentication=truststore:add(keystore-provider="PKCS11",keystore-password="strongP@ssword1") reload --host=master您还需要更新每个主机控制器的安全域使其包含 SSL 服务器身份,请执行以下管理 CLI 命令:
/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
有关 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 登录模块创建一个安全域,但也可以使用其他登录模块:
/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 身份验证的安全域。
/core-service=management/security-realm=SecurityDomainAuthnRealm:add /core-service=management/security-realm=SecurityDomainAuthnRealm/authentication=jaas:add(name=UsersLMDomain)更新
http-interface管理界面,以使用新的安全域。/core-service=management/management-interface=http-interface/:write-attribute(name=security-realm,value=SecurityDomainAuthnRealm)可选: 分配组成员资格。
属性
assign-groups决定在安全域中加载的用户成员资格信息是否用于安全域中的组分配。当设置为true时,这个组分配用于基于角色的访问控制(RBAC)。/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
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