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 的步骤时,除非明确指示,否则请不要重新加载配置。这样做可能会导致您被锁定在管理界面之外。

  1. 创建密钥存储来保护管理接口。

    注意

    此密钥存储必须采用 JKS 格式,因为管理接口与 JCEKS 格式的密钥存储不兼容。

    使用以下内容来生成密钥存储,将参数的示例值(如 别名,keypass,keystore,storepassdname )替换为环境的正确值。

    注意

    参数 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

  2. 确保管理接口绑定到 HTTPS。

    1. 运行单机服务器.

      要确保管理接口绑定到 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)
    2. 运行受管域

      通过添加 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)
  3. 可选: 使用自定义 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}"
        }
    }

  4. 创建新的安全域。在本例中,使用 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
    重要

    在配置使用属性文件存储用户名和密码的安全域时,建议每个域使用不同的属性文件,它们不与另一个域共享。

  5. 配置管理接口以使用新的安全域。

    /core-service=management/management-interface=http-interface:write-attribute(name=security-realm,value=ManagementRealmHTTPS)
  6. 配置管理接口以使用密钥存储。

    使用以下 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 重新连接。

  7. 更新 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。

  1. 生成密钥存储。

    $ 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
  2. 导出证书。

    $ 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
  3. 将证书导入到而不是信任存储中。

    $ 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
  4. 定义 CertificateRealm。

    在服务器(host.xmlstandalone.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)
  5. http-interfacesecurity-realm 更改为新的 CertificateRealm。

    /core-service=management/management-interface=http-interface:write-attribute(name=security-realm,value=CertificateRealm)
  6. 为 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 指南

  1. 首先添加和配置 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。

  2. 重新加载服务器以使更改生效。

    reload

2.2.6. 为应用程序设置两个 SSL/TLS

为应用程序设置双向 SSL/TLS 遵循为 管理接口设置双向 SSL/TLS 中描述的 许多相同的步骤。要为应用程序设置两个 SSL/TLS,您需要执行以下操作:

  1. 为客户端和服务器生成存储
  2. 导出客户端和服务器的证书
  3. 将证书导入而不是信任存储中
  4. 在使用服务器的密钥存储和信任存储的服务器上定义安全域,如 CertificateRealm
  5. 更新 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.keyStorejavax.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 数据库

  1. 创建由相应用户拥有的目录,以存放 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 的操作系统上的用户替换它。

  2. 创建 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

  3. 编辑 $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 具有优先权。

  4. 在您在上一步中创建的 NSS 数据库目录上运行 modutil 命令以启用 FIPS 模式。

    modutil -fips true -dbdir /usr/share/jboss-as/nssdb
    注意

    此时您可能会收到一个安全库错误,要求您为某些 NSS 共享对象重新生成库签名。

  5. 在 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"。

  6. 使用 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 兼容加密的设置:

  1. 配置 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 的基本信息。

  2. 配置 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")

  3. 在安全域中启用密码套件。

    在 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])

  4. 运行以下命令,验证 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 JCEFIPSNIST 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.confdomain.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
重要

假设配置了受管域、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。

  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>

  2. 在每个主机控制器上创建 SSL/TLS 安全域。

    您需要创建带有 SSL/TLS 信任存储进行身份验证的安全域。

    Security Realm 示例

    <security-realm name="HTTPSRealm">
      <authentication>
        <truststore provider="PKCS11" keystore-password="strongP@ssword1"/>
      </authentication>
    </security-realm>

    注意

    您需要在每个主机上重复此过程。

  3. 保护 master 域控制器上的原生接口。

    您需要确保 master 域控制器上的原生接口使用您刚才创建的安全域进行保护。

    原生接口示例

    <management-interfaces>
      ...
      <native-interface security-realm="HTTPSRealm">
        <socket interface="management" port="${jboss.management.native.port:9999}"/>
       </native-interface>
    </management-interfaces>

  4. 使用每个主机控制器上的 SSL/TLS 域连接到主域控制器。

    您需要更新用于连接主域控制器的安全域。此更改必须在主机控制器的配置文件中直接完成,如 host.xmlhost-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>

  5. 更新每个服务器如何连接其主机控制器。

    您还需要更新每个服务器如何连接其主机控制器。

    服务器配置示例

    <server name="my-server" group="my-server-group">
      <ssl ssl-protocol="TLS" trust-manager-algorithm="SunX509" truststore-type="PKCS11" truststore-password="strongP@ssword1"/>
    </server>

  6. 在受管域中配置双向 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 向管理界面进行身份验证,必须执行以下步骤:

  1. 创建安全域。

    在本例中,使用 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")])
  2. 创建具有 JAAS 身份验证的安全域。

    /core-service=management/security-realm=SecurityDomainAuthnRealm:add
    
    /core-service=management/security-realm=SecurityDomainAuthnRealm/authentication=jaas:add(name=UsersLMDomain)
  3. 更新 http-interface 管理界面,以使用新的安全域。

    /core-service=management/management-interface=http-interface/:write-attribute(name=security-realm,value=SecurityDomainAuthnRealm)
  4. 可选: 分配组成员资格。

    属性 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
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

关于红帽文档

Legal Notice

Theme

© 2026 Red Hat
返回顶部