第 1 章 保护服务器及其接口

1.1. 构建块

1.1.1. 接口和套接字绑定

JBoss EAP 使用其主机的接口,如 inet-addressnic,以及用于 Web 应用程序及其管理界面的通信端口。这些接口和端口通过 JBoss EAP 中的 interfacessocket-binding-groups 设置进行定义和配置。

有关如何定义和配置 interfacessocket-binding-groups 的更多信息,请参阅 JBoss EAP 配置指南中的套接字绑定章节。

示例:接口

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

1.1.2. Elytron 子系统

1.1.2.1. 启用跨服务器的 Elytron 安全

可以通过简单的方法在服务器间启用 Elytron。JBoss EAP 7.1 引入了一个示例配置脚本,它允许 Elytron 作为安全供应商。此脚本驻留在服务器安装中的 EAP_HOME/docs/examples 目录中。

执行以下命令,以启用服务器中的 Elytron 安全性。

$ EAP_HOME/bin/jboss-cli.sh --file=EAP_HOME/docs/examples/enable-elytron.cli

1.1.2.2. 创建 Elytron 安全域

elytron 子系统中的安全域与安全域结合使用,以及用于与应用进行核心管理身份验证。

重要

部署仅限于在每个部署中使用一个 Elytron 安全域。现在,可能需要多个旧安全域的情况可以使用单个 Elytron 安全域来完成。

使用管理 CLI 添加安全域
/subsystem=elytron/security-domain=domainName:add(realms=[{realm=realmName,role-decoder=roleDecoderName}],default-realm=realmName,permission-mapper=permissionMapperName,role-mapper=roleMapperName,...)
使用管理控制台添加安全域
  1. 访问管理控制台。有关更多信息,请参阅 JBoss EAP 配置指南中的管理控制台部分。
  2. 导航到 ConfigurationSubsystemsSecurity(Elytron)Other Settings,再点击 View
  3. 选择 SSLSecurity Domain 并使用 Add 按钮配置新的安全域。

1.1.2.3. 创建 Elytron Security Realm

elytron 子系统中的安全性域与安全域结合使用时,可用于核心管理身份验证以及与应用进行身份验证。安全域也根据其身份存储进行特别键入,例如 jdbc-realmfilesystem-realmproperties-realm 等等。

使用管理 CLI 添加安全域
/subsystem=elytron/type-of-realm=realmName:add(....)

可以在上一节中找到添加特定域的示例,如 jdbc-realmfilesystem-realmproperties-realm

使用管理控制台添加安全域
  1. 访问管理控制台。有关更多信息,请参阅 JBoss EAP 配置指南中的管理控制台部分。
  2. 导航到 ConfigurationSubsystemsSecurity(Elytron)Security Realms,再点击 View
  3. Security Realm 选项卡中选择适当的安全域类型,然后单击 Add 以配置新的安全域。

1.1.2.4. 创建 Elytron Role Decoder

角色解码器将安全域提供的身份属性转换为角色。角色解码器也专门根据其功能进行键入,如 empty-role-decodersimple-role-decodercustom-role-decoder

使用管理 CLI 添加角色依赖项
/subsystem=elytron/ROLE-DECODER-TYPE=roleDeoderName:add(....)
使用管理控制台添加角色依赖项
  1. 访问管理控制台。有关更多信息,请参阅 JBoss EAP 配置指南中的管理控制台部分。
  2. 导航到 ConfigurationSubsystemsSecurity(Elytron)Mappers / Decoders,再点击 View
  3. Role Decoder,选择适当的角色解码器类型,然后点 Add 配置新角色解码器。

1.1.2.5. 将 source-address-role-decoder 添加到 elytron 子系统

您可以使用管理 CLI 或管理控制台将 source-address-role-decoder 角色解码器添加到 elytron 子系统中。通过在 mappers 元素中配置此角色解码器,您可以在做出授权决策时利用客户端的 IP 地址。

source-address-role-decoder 会提取客户端的 IP 地址,并检查是否与 pattern 属性或 source-address 属性中指定的 IP 地址匹配。如果客户端的 IP 地址与任一属性中指定的 IP 地址匹配,那么 elytron 使用 roles 属性将角色分配给用户。

注意

该流程使用管理 CLI 将 source-address-role-decoder 添加到 elytron 子系统中的 mappers 元素中。如果要使用管理控制台完成此任务,请参阅附加资源 部分提供的链接。

先决条件

  • 记下服务器客户端的 IP 地址。

流程

  1. elytron 子系统中,使用管理 CLI 添加 source-address-role-decoder。对于 source-address-role-decoder,您必须为用户指定一个 IP 地址和至少一个角色。

    source-address-role-decoder 添加到 mappers 元素:

    /subsystem=elytron/source-address-role-decoder=decoder1:add(source-address="10.10.10.10", roles=["Administrator"])

    示例中显示了一个配置的 source-address-role-decoder,名为 decoder1。当客户端尝试连接到服务器时,elytron 子系统使用 source-address-role-decoder 检查客户端的 IP 地址是否与 pattern 属性或 source-address 属性中指定的 IP 地址匹配。在上例中,source-address-role-decoder 会检查客户端的 IP 地址是否为 10.10.10.10。如果客户端的 IP 地址为 10.10.10.10,则 elytron 使用 roles 属性将 Administrator 角色分配给用户。

    注意

    您可以配置 source-address-role-decoder,将特定的角色分配给需要从不同网络建立连接的用户。

  2. security-domain 中,引用 role-decoder 属性中的已配置 source- address- role-decoder。这可确保 Elytron 安全域在做出授权决策时使用 source-address-role-decoder

    role-decoder 属性中引用配置的 source-address-role-decoder、解码r1 的示例:

    /subsystem=elytron/security-domain=domainName:add(role-decoder=decoder1,default-realm=realmName,realms=[{realm=realmName}])

其他资源

  • 有关使用管理控制台添加角色解码器的详情,请参考 Elytron subsystem
  • 有关 elytron 子系统的详情,请参考安全架构指南中的 Elytron 子系统

1.1.3. 配置 elytron 子系统的 aggregate-role-decoder

aggregate-role-decoder 由两个或多个角色解码器组成。您可以使用 aggregate-role-decoder 来汇总从每个角色解码器返回的角色。

先决条件

  • elytron 子系统中配置至少两个角色解码器。

流程

  • 将至少两个角色解码器添加到 aggregate-role-decoder 角色解码器中。

    decoder1decoder2 添加到 aggregate-role-decoder 角色解码器中的示例:

    /subsystem=elytron/aggregate-role-decoder=aggregateDecoder:add(role-decoders=[decoder1, decoder2])

其他资源

1.1.3.1. 创建 Elytron Rolemapper

角色映射程序在被解码到其他角色后映射角色。例如,在被解码后,角色名称或从主体中添加或删除特定角色。角色映射程序也根据功能进行输入,例如 add-prefix-role-mapperadd-suffix-role-mapper 以及 constant-role-mapper

添加角色映射程序获取常规表单
/subsystem=elytron/ROLE-MAPPER-TYPE=roleMapperName:add(...)
使用管理控制台添加角色映射程序
  1. 访问管理控制台。有关更多信息,请参阅 JBoss EAP 配置指南中的管理控制台部分。
  2. 导航到 ConfigurationSubsystemsSecurity(Elytron)Mappers / Decoders,再点击 View
  3. 单击 Role Mapper,选择适当的角色映射程序类型,然后单击 Add 以配置新角色映射程序。

1.1.3.2. 创建 Elytron 权限集

权限集可用于为身份分配权限。

使用管理 CLI 添加权限集
/subsystem=elytron/permission-set=PermissionSetName:add(permissions=[{class-name="...", module="...", target-name="...", action="..."}...])

permissions 参数由一组权限组成,每个权限都具有以下属性:

  • class-name 是权限的完全限定域名。这是唯一需要的权限属性。
  • module 是一个可选模块,用于加载权限。
  • target-name 是一个在被创建时传递给权限的一个可选目标名称。
  • action 是传递到权限(组成)的可选操作。

1.1.3.3. 创建 Elytron 权限映射程序

除了分配给身份的角色外,也可以分配权限。权限映射程序将权限分配给身份。权限映射程序也根据其功能进行特别键入,如 logical-permission-mapper简单-permission-mapper 以及 custom-permission-mapper

使用管理 CLI 添加权限映射
/subsystem=elytron/simple-permission-mapper=PermissionMapperName:add(...)
使用管理控制台添加权限映射程序
  1. 访问管理控制台。有关更多信息,请参阅 JBoss EAP 配置指南中的管理控制台部分。
  2. 导航到 ConfigurationSubsystemsSecurity(Elytron)Mappers / Decoders,再点击 View
  3. Principal Decoder,选择适当的主体解码器类型,然后点 Add 来配置新的主体解码器。

1.1.3.4. 创建身份验证配置

身份验证配置包含连接时要使用的凭证。如需有关身份验证配置的更多信息,请参阅 JBoss EAP 的 How to Configure Identity Management 中的 Configure Client Authentication with Elytron Client

注意

您可以将 Elytron 安全域配置为使用访问用户的凭据,而不是凭据存储。例如,安全域可与 Kerberos 结合使用,以验证传入的用户。按照 配置 Elytron subsystem 中的说明: 如何使用 Kerberos 为 JBoss EAP 设置 SSO,并在 Kerberos 安全工厂中设置 get-kerberos-ticket=true

使用管理 CLI 添加身份验证配置
/subsystem=elytron/authentication-configuration=AUTHENTICATION_CONFIGURATION_NAME:add(authentication-name=AUTHENTICATION_NAME, credential-reference={clear-text=PASSWORD})
使用管理控制台添加身份验证配置
  1. 访问管理控制台。有关更多信息,请参阅 JBoss EAP 配置指南中的管理控制台部分。
  2. 导航到 ConfigurationSubsystemsSecurity(Elytron)Other Settings,再点击 View
  3. AuthenticationAuthentication Configuration,再点 Add 来配置新的身份验证配置。

有关 authentication-configuration 属性的完整列表,请参阅 Elytron 子系统组件参考

1.1.3.5. 创建身份验证上下文

验证上下文包含一组规则以及用来建立连接的验证配置SSL 上下文。有关验证上下文的更多信息,请参阅 JBoss EAP 的 How to Configure Identity Management 中的 Configure Client Authentication with Elytron Client

使用管理 CLI 添加身份验证上下文

可以使用以下管理 CLI 命令创建身份验证上下文:

/subsystem=elytron/authentication-context=AUTHENTICATION_CONTEXT_NAME:add()

通常,验证上下文将包含一组规则以及验证配置或 SSL 上下文。以下 CLI 命令演示了如何定义仅在主机名为 localhost 时的功能的身份验证上下文。

/subsystem=elytron/authentication-context=AUTHENTICATION_CONTEXT_NAME:add(match-rules=[{authentication-configuration=AUTHENTICATION_CONFIGURATION_NAME, match-host=localhost}])
使用管理控制台添加身份验证上下文
  1. 访问管理控制台。有关更多信息,请参阅 JBoss EAP 配置指南中的管理控制台部分。
  2. 导航到 ConfigurationSubsystemsSecurity(Elytron)Other Settings,再点击 View
  3. AuthenticationAuthentication Context,然后点击 Add 来配置新的身份验证上下文。

有关 authentication-context 属性的完整列表,请参阅 Elytron 子系统组件参考

1.1.3.6. 创建 Elytron 身份验证工厂

身份验证工厂是用于特定验证机制的验证策略。身份验证工厂专门基于身份验证机制,如 http-authentication-factorysasl-authentication-factorykerberos-security-factory

使用管理 CLI 添加身份验证工厂
/subsystem=elytron/AUTH-FACTORY-TYPE=authFactoryName:add(....)
使用管理控制台添加身份验证工厂
  1. 访问管理控制台。有关更多信息,请参阅 JBoss EAP 配置指南中的管理控制台部分。
  2. 导航到 ConfigurationSubsystemsSecurity(Elytron)Factories / Transformers,再单击 View
  3. 单击 HTTP FactoriesSASLOther factorsies,选择相应的工厂类型,然后单击 Add 来配置新的工厂。

1.1.3.7. 创建 Elytron Keystore

key-store 是密钥存储或信任存储的定义,包括密钥存储类型、其位置以及用于访问它的凭据。

要生成用于 elytron 子系统的示例密钥存储,请使用以下命令:

$ keytool -genkeypair -alias localhost -keyalg RSA -keysize 1024 -validity 365 -keystore keystore.jks -dname "CN=localhost" -keypass secret -storepass secret
使用管理 CLI 添加密钥存储

要在 Elytron 中定义引用新密钥存储的 key-store,可执行以下管理 CLI 命令:此命令指定与提供的文件系统路径相关的密钥存储路径、用于访问密钥存储的凭据引用以及密钥存储类型。

/subsystem=elytron/key-store=newKeyStore:add(path=keystore.jks,relative-to=jboss.server.config.dir,credential-reference={clear-text=secret},type=JKS)
注意

以上命令使用 relative-to 来引用密钥存储文件的位置。或者,您也可以指定 路径中的 密钥存储的完整路径,省略 relative-to

使用管理控制台添加密钥存储
  1. 访问管理控制台。有关更多信息,请参阅 JBoss EAP 配置指南中的管理控制台部分。
  2. 导航到 ConfigurationSubsystemsSecurity(Elytron)Other Settings,再点击 View
  3. StoresKey Store,再点 Add 来配置一个新的密钥存储。

1.1.3.8. 创建 Elytron Key Manager

key-manager 引用 key-store,与 SSL 上下文结合使用。

使用管理 CLI 添加密钥管理器

以下命令指定要引用的底层密钥存储、初始化密钥管理器时使用的算法以及用于访问底层密钥存储中的条目的凭据引用。

/subsystem=elytron/key-manager=newKeyManager:add(key-store=KEY_STORE,credential-reference={clear-text=secret})
重要

红帽没有指定上一命令中的 algorithm 属性,因为 Elytron 子系统使用 KeyManagerFactory.getDefaultAlgorithm() 来确定算法。但是,您可以指定 algorithm 属性。要指定 algorithm 属性,您需要知道您使用的 JDK 提供了哪些关键管理器算法。例如,使用 SunJSSE 的 JDK 提供了 PKIXSunX509 算法。

在上一命令中,您可以指定 SunX509 作为密钥管理器算法属性。

使用管理控制台添加密钥管理器
  1. 访问管理控制台。有关更多信息,请参阅 JBoss EAP 配置指南中的管理控制台部分。
  2. 导航到 ConfigurationSubsystemsSecurity(Elytron)Other Settings,再点击 View
  3. SSLKey Manager 并点 Add 来配置新的密钥管理器。

1.1.3.9. 创建 Elytron Truststore

要在 Elytron 中创建信任存储,请执行以下 CLI 命令:

/subsystem=elytron/key-store=default-trust-store:add(type=JKS, relative-to=jboss.server.config.dir, path=application.truststore, credential-reference={clear-text=password})

要成功执行上述命令,必须在 EAP_HOME/standalone/configuration 目录中有一个 application.truststore 文件。如果端点的证书由 CA 签名,则信任存储必须包含与端点或证书链关联的证书。

红帽建议避免使用自签名证书。理想情况下,证书应由 CA 签名,您的信任存储应包含代表您的 ROOT 和中间 CA 的证书链。

1.1.3.10. 创建 Elytron Trust Manager

要在 Elytron 中定义信任管理器,请执行以下 CLI 命令:

/subsystem=elytron/trust-manager=default-trust-manager:add(key-store=TRUST-STORE-NAME)

这会将定义的信任存储设置为应用服务器信任的证书源。

1.1.3.11. 使用开箱即用的 Elytron 组件

JBoss EAP 提供一组在 elytron 子系统中配置的默认 Elytron 组件。您可以在安全架构指南的 Out of Box 部分中找到有关这些预先配置的组件的详细信息。

1.1.3.11.1. 保护管理接口

您可以通过启用 JBoss EAP 来使用开箱即用的 Elytron 组件来保护 通过 Elytron 部分中的管理接口保护管理界面的详细信息。

1.1.3.11.2. 保护应用程序

elytron 子系统为 http-authentication-factory 提供 application-http-authentication,默认可用于保护应用。有关如何配置 application-http-authentication 的更多信息,请参阅安全架构指南中的开箱即用部分。

要将应用程序配置为使用 application-http-authentication,请参阅《 如何配置身份管理指南》 中的" 配置 Web 应用程序"使用 Elytron 或 Legacy 安全 进行身份验证。您还可以使用 JBoss EAP 如何配置身份管理指南中的 覆盖应用的身份验证配置 部分中的步骤来覆盖所有应用的默认行为。

1.1.3.11.3. 使用 SSL/TLS

JBoss EAP 使用传统的核心管理身份验证提供默认的单向 SSL/TLS 配置,但不在 elytron 子系统中提供。您可以在以下部分中找到有关使用 elytron 子系统配置 SSL/TLS 的更多详细信息,以及以下部分中的应用程序:

1.1.3.11.4. 将 Elytron 与其他子系统搭配使用

除了保护应用程序和管理界面外,Elytron 还与 JBoss EAP 中的其他子系统集成。

batch-jberet
您可以使用 Elytron 安全域配置 batch-jberet 子系统来运行批处理作业。如需更多信息,请参阅配置指南中的为批处理作业配置安全性
datasources
您可以使用凭证存储或 Elytron 安全域在数据源定义中提供身份验证信息。如需更多信息,请参阅配置指南中的数据源安全性
ejb3
您可以在 ejb3 子系统中为 Elytron 安全域创建映射,供部署引用。如需更多信息,请参阅 开发 Jakarta Enterprise Beans 应用中的使用 EJB 子系统集成
iiop-openjdk
您可以使用 elytron 子系统使用 iiop-openjdk 子系统在客户端和服务器间配置 SSL/TLS。如需更多信息,请参阅 配置指南中的将 IIOP 配置为在 Elytron 子系统中使用 SSL/TLS
jca
您可以使用 elytron-enabled 属性为工作管理器启用 Elytron 安全性。有关更多信息,请参阅配置 指南中的配置 JCA 子系统
jgroups
您可以配置 SYM_ENCRYPTASYM_ENCRYPT 协议来引用 elytron 子系统中定义的密钥存储或凭证引用。如需更多信息,请参阅配置指南中的保护集群
mail
您可以使用凭据存储在 邮件 子系统的服务器定义中提供身份验证信息。如需更多信息,请参阅配置指南中的使用凭据存储密码
messaging-activemq
您可以保护与 messaging-activemq 子系统使用的远程连接的安全。如需更多信息,请参阅 配置消息中的使用 Elytron 子系统部分。
modcluster
您可以使用 Elytron 客户端 ssl-context 与使用 SSL/TLS 的负载均衡器通信。如需更多信息,请参阅 Elytron 与 ModCluster subsystem 集成
remoting
您可以在 remoting 子系统中配置入站和出站连接,以引用 elytron 子系统中定义的验证上下文、SAS 身份验证工厂和 SSL 上下文。有关配置每种连接类型的完整详情,请参阅 Elytron 与 Remoting subsystem 集成
resource-adapters
您可以使用 Elytron 保护到资源适配器的连接。在提交工作由工作管理器执行时,您可以启用安全性 inflow 建立安全凭证。如需更多信息,请参阅配置指南中的配置资源适配器以使用 Elytron 子系统
undertow
您可以使用 elytron 子系统配置 SSL/TLS 和应用身份验证。有关配置应用程序身份验证的更多信息,请参阅 如何配置身份管理中的使用 SSL/TLS配置 Web 应用程序以使用 Elytron 或为应用程序使用传统的 Security 子系统

1.1.3.12. 启用和禁用 Elytron 子系统

elytron 子系统使用默认 JBoss EAP 配置文件以及传统的 Security 子系统预先配置。

如果您使用尚未配置 elytron 子系统的配置集,您可以通过添加 elytron 扩展并启用 elytron 子系统来添加它。

添加 elytron 子系统所需的 elytron 扩展:

/extension=org.wildfly.extension.elytron:add()

在 JBoss EAP 中启用 elytron 子系统:

/subsystem=elytron:add

reload

在 JBoss EAP 中禁用 elytron 子系统:

/subsystem=elytron:remove

reload
重要

JBoss EAP 中的其他子系统可能对 elytron 子系统具有依赖性。如果在禁用这些依赖项前没有解决,则启动 JBoss EAP 时会看到错误。

1.1.4. 旧安全子系统

1.1.4.1. 禁用安全子系统

您可以通过执行删除子系统的操作来禁用 JBoss EAP 中的 security 子系统。

流程

  • 在 JBoss EAP 中禁用 Security 子系统:

    /subsystem=security:remove
重要

JBoss EAP 中的其他子系统可能对 security 子系统具有依赖性。如果在禁用这些依赖项前没有解决,则启动 JBoss EAP 时会看到错误。

1.1.4.2. 启用安全子系统

您可以通过执行子系统的 add 操作,在 JBoss EAP 中启用 安全 子系统。

流程

  • 在 JBoss EAP 中启用 Security 子系统:

    /subsystem=security:add

1.1.5. 旧安全域

JBoss EAP 使用安全域来定义身份验证和授权机制,如本地的 LDAP 属性,然后供管理接口使用。

示例:安全性域

<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()

如果创建新的安全域,并希望使用属性文件进行身份验证或授权,则必须创建一个新的属性文件,专门用于新的安全域。JBoss EAP 不重复使用其他安全域使用的现有文件,也不在配置中指定的新文件(如果它们不存在)。

其他资源

1.1.6. 使用身份验证和套接字绑定来保护管理界面

您可以使用 socket-bindinghttp-authentication-factoryhttp-upgrade 的组合来保护使用 elytron 子系统的管理接口。另外,您还可以将 socket-bindingsecurity-realm 搭配使用来保护使用旧核心管理身份验证的管理接口。您还可以禁用管理接口,并将接口的用户配置为拥有不同的角色和访问权限。

默认情况下,JBoss EAP 定义了一个 http-interface 来连接管理界面。

流程

  • 显示服务器管理接口设置:

    [standalone@localhost:9990 /] /core-service=management:read-resource(recursive=true)
    {
        "outcome" => "success",
        "result" => {
            "access" => {...},
            "ldap-connection" => undefined,
            "management-interface" => {"http-interface" => {
                "allowed-origins" => undefined,
                "console-enabled" => true,
                "http-authentication-factory" => "management-http-authentication",
                "http-upgrade" => {
                    "enabled" => true,
                    "sasl-authentication-factory" => "management-sasl-authentication"
                },
                "http-upgrade-enabled" => true,
                "sasl-protocol" => "remote",
                "secure-socket-binding" => undefined,
                "security-realm" => undefined,
                "server-name" => undefined,
                "socket-binding" => "management-http",
                "ssl-context" => undefined
            }},
            "security-realm" => {...},
            "service" => undefined
        }
    }