第 1 章 保护服务器及其接口
1.1. 构建块
1.1.1. 接口和套接字绑定
JBoss EAP 使用其主机的接口,如 inet-address
和 nic
,以及用于 Web 应用程序及其管理界面的通信端口。这些接口和端口通过 JBoss EAP 中的 interfaces
和 socket-binding-groups
设置进行定义和配置。
有关如何定义和配置 interfaces
和 socket-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,...)
使用管理控制台添加安全域
- 访问管理控制台。有关更多信息,请参阅 JBoss EAP 配置指南中的管理控制台部分。
-
导航到 Configuration
Subsystems Security(Elytron) Other Settings,再点击 View。 -
选择 SSL
Security Domain 并使用 Add 按钮配置新的安全域。
1.1.2.3. 创建 Elytron Security Realm
elytron
子系统中的安全性域与安全域结合使用时,可用于核心管理身份验证以及与应用进行身份验证。安全域也根据其身份存储进行特别键入,例如 jdbc-realm
、filesystem-realm
和properties-realm
等等。
使用管理 CLI 添加安全域
/subsystem=elytron/type-of-realm=realmName:add(....)
可以在上一节中找到添加特定域的示例,如 jdbc-realm
、filesystem-realm
和 properties-realm
。
使用管理控制台添加安全域
- 访问管理控制台。有关更多信息,请参阅 JBoss EAP 配置指南中的管理控制台部分。
-
导航到 Configuration
Subsystems Security(Elytron) Security Realms,再点击 View。 - 从 Security Realm 选项卡中选择适当的安全域类型,然后单击 Add 以配置新的安全域。
1.1.2.4. 创建 Elytron Role Decoder
角色解码器将安全域提供的身份属性转换为角色。角色解码器也专门根据其功能进行键入,如 empty-role-decoder
、simple-role-decoder
和 custom-role-decoder
。
使用管理 CLI 添加角色依赖项
/subsystem=elytron/ROLE-DECODER-TYPE=roleDeoderName:add(....)
使用管理控制台添加角色依赖项
- 访问管理控制台。有关更多信息,请参阅 JBoss EAP 配置指南中的管理控制台部分。
-
导航到 Configuration
Subsystems Security(Elytron) Mappers / Decoders,再点击 View。 - 点 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 地址。
流程
在
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
,将特定的角色分配给需要从不同网络建立连接的用户。在
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
角色解码器中。将
decoder1
和decoder2
添加到aggregate-role-decoder
角色解码器中的示例:/subsystem=elytron/aggregate-role-decoder=aggregateDecoder:add(role-decoders=[decoder1, decoder2])
其他资源
-
有关
elytron
子系统中可用角色解码器的信息 ,请参阅安全架构指南中的 Elytron 子系统资源。 - 有关创建角色解码器的详情,请参考 Elytron subsystem。
1.1.3.1. 创建 Elytron Rolemapper
角色映射程序在被解码到其他角色后映射角色。例如,在被解码后,角色名称或从主体中添加或删除特定角色。角色映射程序也根据功能进行输入,例如 add-prefix-role-mapper
、add-suffix-role-mapper
以及 constant-role-mapper
。
添加角色映射程序获取常规表单
/subsystem=elytron/ROLE-MAPPER-TYPE=roleMapperName:add(...)
使用管理控制台添加角色映射程序
- 访问管理控制台。有关更多信息,请参阅 JBoss EAP 配置指南中的管理控制台部分。
-
导航到 Configuration
Subsystems Security(Elytron) Mappers / Decoders,再点击 View。 - 单击 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(...)
使用管理控制台添加权限映射程序
- 访问管理控制台。有关更多信息,请参阅 JBoss EAP 配置指南中的管理控制台部分。
-
导航到 Configuration
Subsystems Security(Elytron) Mappers / Decoders,再点击 View。 - 点 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})
使用管理控制台添加身份验证配置
- 访问管理控制台。有关更多信息,请参阅 JBoss EAP 配置指南中的管理控制台部分。
-
导航到 Configuration
Subsystems Security(Elytron) Other Settings,再点击 View。 -
点 Authentication
Authentication 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}])
使用管理控制台添加身份验证上下文
- 访问管理控制台。有关更多信息,请参阅 JBoss EAP 配置指南中的管理控制台部分。
-
导航到 Configuration
Subsystems Security(Elytron) Other Settings,再点击 View。 -
点 Authentication
Authentication Context,然后点击 Add 来配置新的身份验证上下文。
有关 authentication-context
属性的完整列表,请参阅 Elytron 子系统组件参考。
1.1.3.6. 创建 Elytron 身份验证工厂
身份验证工厂是用于特定验证机制的验证策略。身份验证工厂专门基于身份验证机制,如 http-authentication-factory
、sasl-authentication-factory
和 kerberos-security-factory
。
使用管理 CLI 添加身份验证工厂
/subsystem=elytron/AUTH-FACTORY-TYPE=authFactoryName:add(....)
使用管理控制台添加身份验证工厂
- 访问管理控制台。有关更多信息,请参阅 JBoss EAP 配置指南中的管理控制台部分。
-
导航到 Configuration
Subsystems Security(Elytron) Factories / Transformers,再单击 View。 - 单击 HTTP Factories、SASL 或 Other 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
。
使用管理控制台添加密钥存储
- 访问管理控制台。有关更多信息,请参阅 JBoss EAP 配置指南中的管理控制台部分。
-
导航到 Configuration
Subsystems Security(Elytron) Other Settings,再点击 View。 -
点 Stores
Key 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 提供了 PKIX
和 SunX509
算法。
在上一命令中,您可以指定 SunX509
作为密钥管理器算法属性。
使用管理控制台添加密钥管理器
- 访问管理控制台。有关更多信息,请参阅 JBoss EAP 配置指南中的管理控制台部分。
-
导航到 Configuration
Subsystems Security(Elytron) Other Settings,再点击 View。 -
点 SSL
Key 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_ENCRYPT
和ASYM_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 不重复使用其他安全域使用的现有文件,也不在配置中指定的新文件(如果它们不存在)。
其他资源
- 有关安全域的更多信息,请参阅 Security Realms。
1.1.6. 使用身份验证和套接字绑定来保护管理界面
您可以使用 socket-binding
、http-authentication-factory
和 http-upgrade
的组合来保护使用 elytron
子系统的管理接口。另外,您还可以将 socket-binding
与 security-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 } }