2.8. 安全子系统

security 子系统为应用提供安全基础架构,它基于 Jakarta 身份验证 API。该子系统使用与当前请求关联的安全上下文,以公开身份验证管理器、授权管理器、审计管理器和将管理器映射到相关容器的功能。

身份验证和授权管理器处理身份验证和授权。在将信息传递给应用之前,映射管理器处理从主体、角色或属性添加、修改或删除信息。审计管理器允许用户配置供应商模块,以控制报告安全事件的方式。

在大多数情况下,管理员应仅关注设置和配置安全域,以更新 security 子系统的配置。在安全域外,唯一可能需要更改的安全元素是 深度复制-subject-mode有关深度复制主题模式的更多信息,请参阅安全管理部分

2.8.1. 安全域

安全域是一组 Jakarta Authentication 声明性安全配置,供一个或多个应用用于控制身份验证、授权、审核和映射。默认包含以下四个安全域: jboss-ejb-policyjboss-web-policyotherja Alstjboss-ejb-policyjboss-web-policy 安全域是 JBoss EAP 实例的默认授权机制。如果应用配置的安全域不定义任何身份验证机制,将使用它们。这些安全域 以及其他,也在 JBoss EAP 内部用于授权,是正确运行所必需的。ja demandingst 安全域是一个简单的 Jakarta 身份验证安全域,用于开发目的。

安全域包含身份验证、授权、安全映射和审计的配置。安全域是 JBoss EAP 安全 子系统的一部分,并由域控制器或单机服务器集中管理。用户可以根据需要创建任意数量的安全域来满足应用的要求。

您也可以使用 cache-type 属性配置安全域要使用的身份验证缓存类型。如果删除了此属性,将不会使用任何缓存。此属性允许的值为 default 或 infinispan

Elytron 和 PicketBox 安全域之间的比较

个部署应当与单个 Elytron 安全域或一个或多个传统的 PicketBox 安全域关联。部署不应与这两者关联。这是无效的配置。

如果部署与多个 Elytron 安全域关联,而一个部署可以与多个传统安全域关联,则会出现例外。

注意

使用 PicketBox 时,安全域封装了对底层身份存储的访问和用于授权决策的映射。因此,需要具有不同存储的 PicketBox 用户才能将不同的安全域用于不同的源。

在 Elytron 中,这两个功能是分隔的。对存储的访问由安全域处理,授权的映射由安全域处理。

因此,需要独立 PicketBox 安全域的部署不一定需要独立的 Elytron 安全域。

2.8.2. 使用安全域和安全域

安全域和安全域可用于保护部署到 JBoss EAP 的 Web 应用。在确定是否应使用这两者时,务必要了解这两者之间的区别。

Web 应用和 Jakarta Enterprise Beans 部署只能直接使用安全域。它们利用从身份存储传递的身份信息,利用登录模块来执行实际身份验证和授权。安全域可以配置为将安全域用于身份信息;例如,其他 允许应用指定用于身份验证和获取授权信息的安全域。它们也可以配置为使用外部身份存储。Web 应用和 Jakarta 企业 Beans 部署无法配置为直接使用安全域进行身份验证。安全域也是 security 子系统的一部分,在核心服务之后加载。

只有核心管理(如管理接口和 Jakarta 企业 Bean 远程端点)才能直接使用安全域。它们是提供身份验证和授权信息的身份存储。它们也是核心服务,在启动任何子系统之前加载。开箱即用的安全域( ManagementRealmApplicationRealm )使用基于文件的简单身份验证机制,但它们可以配置为使用其他机制。

2.8.3. 安全审核

安全审计指的是触发事件,如写入日志,以响应 security 子系统内发生的事件。审计机制配置为安全域的一部分,以及身份验证、授权和安全映射详细信息。审计使用提供程序模块来控制安全性事件的报告方式。JBoss EAP 随附多个安全审计提供商,但可以使用自定义提供商。JBoss EAP 的核心管理也具有自己的安全审计和日志记录功能,这些功能单独配置,不属于 security 子系统的一部分。

2.8.4. 安全映射

安全映射增加了在身份验证或授权发生后(但在将信息传递给您的应用之前)结合身份验证和授权信息的功能。授权的角色、身份验证的主体或凭据(这些属性不是主体或角色)可以全部映射。角色映射用于在身份验证后添加、替换或删除角色到主题。主体映射用于在身份验证后修改主体。您可以使用凭证映射从外部系统转换属性,供应用使用。您还可以使用凭证映射来转换应用的属性,供外部系统使用。

2.8.5. 密码 Vault 系统

JBoss EAP 拥有一个密码库,用于加密敏感字符串,将它们存储在加密的密钥存储中,然后为应用和验证系统解密它们。在纯文本配置文件中,如 XML 部署描述符,有时需要指定密码和其他敏感信息。JBoss EAP 密码库可用于安全地存储敏感字符串,以在纯文本文件中使用。

2.8.6. 安全域配置

安全域在域控制器或单机服务器上集中配置。使用安全域时,可以将应用配置为使用安全域,而不是单独配置安全性。这允许用户和管理员利用 Declarative Security

示例

这种配置结构的一个常见场景是在测试和生产环境之间移动应用程序的过程。如果应用单独配置了安全性,则可能需要在每次将其提升到新环境中(例如从测试环境到生产环境)时对其进行更新。如果该应用改为使用安全域,则各个环境中的 JBoss EAP 实例可以针对当前环境正确配置其安全域,允许应用利用安全域提供正确的安全配置。

2.8.6.1. 登录模块

JBoss EAP 包括多个捆绑登录模块,适合大多数在安全域中配置的用户管理角色。security 子系统提供一些核心登录模块,它们可以从关系数据库、LDAP 服务器或平面文件读取用户信息。除了这些核心登录模块外,JBoss EAP 还提供其他登录模块,提供满足自定义需求的用户信息和功能。

常用登录模块摘要

LDAP 登录模块
Ldap 登录模块是一种登录模块实施,可根据 LDAP 服务器进行身份验证。security 子系统使用连接信息(即 bindDN)连接到 LDAP 服务器,即 bindDN,其具有权限为 baseCtxDNrolesCtxDN 树搜索用户和角色,这通过 Java 命名和目录接口初始上下文提供。当用户尝试进行身份验证时,LDAP 登录模块将连接到 LDAP 服务器并将用户的凭据传递给 LDAP 服务器。身份验证成功后,会在 JBoss EAP 中为该用户创建 InitialLDAPContext,填充有该用户的角色。
LdapExtended Login Module
LdapExtended 登录模块搜索用户以及绑定身份验证的相关角色。角色以递归方式查询,并遵循 DN 来浏览分层角色结构。登录模块选项包括所选 LDAP Java 命名和目录接口提供商支持的任何选项。
UsersRoles 登录模块
UsersRoles login 模块是一个简单的登录模块,支持从 Java 属性文件加载的多个用户和用户角色。此登录模块的主要用途是利用应用部署的属性文件,轻松测试多个用户和角色的安全设置。
数据库登录模块
Database 登录模块是 JDBC 登录模块,支持身份验证和角色映射。如果用户名、密码和角色信息存储在关系数据库中,则使用此登录模块。这可以通过以预期格式提供对逻辑表的引用,包含主体和角色。
证书登录模块
证书登录模块基于 X509 证书对用户进行身份验证。此登录模块的典型用例是 Web 层中的 CLIENT-CERT 身份验证。此登录模块仅执行身份验证,并且必须与能够获取授权角色的另一登录模块相结合,以完全定义对安全 Web 或 Jakarta Enterprise Beans 组件的访问。此登录模块的两个子类是 CertRolesLoginModuleDatabaseCertLoginModule,扩展行为以从属性文件或数据库获取授权角色。
Identity Login 模块
Identity login 模块是一种简单的登录模块,可将硬编码的用户名关联到针对该模块进行身份验证的任何主题。它使用由 principal 选项指定的名称创建一个 SimplePrincipal 实例。如果需要为服务提供固定的身份,此登录模块非常有用。这也可以用于开发环境,以测试与给定主体和相关角色关联的安全性。
Runas loginin 模块
RunAs login 模块是一种帮助模块,可在身份验证登录阶段将 run-as 角色推送到堆栈;然后,它在提交或中止阶段从堆栈填充 run-as 角色。此登录模块的目的是为必须访问受保护资源才能执行其身份验证的其他登录模块提供角色,例如,访问安全 Jakarta Enterprise Beans 的登录模块。RunAs 登录模块必须在需要按角色建立的登录模块之前配置。
客户端登录模块
Client login 模块是登录模块的一种实施,供 JBoss 客户端在建立调用者身份和凭据时使用。这会创建一个新的 SecurityContext,为其分配一个主体和凭证,并将 SecurityContext 设置为 ThreadLocal 安全上下文。Client login 模块是客户端唯一支持建立当前线程调用者的机制。独立的客户端应用和服务器环境(充当 JBoss Jakarta Enterprise Beans 客户端)均未配置为以透明方式使用 JBoss EAP 安全 子系统,必须使用 Client 登录模块。
警告

此登录模块不执行任何身份验证。它只是将提供的登录信息复制到服务器 Jakarta Enterprise Beans 调用层,以便在服务器上随后进行身份验证。在 JBoss EAP 中,这仅支持将用户身份切换为 JVM 调用。远程客户端不支持它建立身份

SPNEGO 登录模块
SPNEGO 登录模块是一种登录模块,通过 KDC 建立呼叫人身份和凭证。该模块实施 SPNEGO,是 JBoss Negotiation 项目的一部分。此身份验证可以在与 AdvancedLdap 登录模块的链配置中使用,以允许与 LDAP 服务器协作。Web 应用还必须启用应用中的 NegotiationAuthenticator 以使用此登录模块。
RoleMapping Login Module
RoleMapping 登录模块支持将身份验证过程最终生成的角色映射到一个或多个声明角色。例如,如果身份验证过程确定用户 John 具有角色 ldapAdmin 和 testAdmin ,并且 web.xml 或 ejb-jar.xml 文件中定义的声明角色是 admin,则此登录模块会将 ldapAdmintestAdmin 角色映射到 John。RoleMapping 登录模块必须定义为登录模块配置的可选模块,因为它会改变之前映射角色的映射。
远程登录模块
远程登录模块检查当前正在通过远程连接进行身份验证的请求。如果使用远程接口收到请求,则该请求与身份验证过程中创建的身份关联。
RealmDirect 登录模块
RealmDirect 登录模块允许使用现有的安全域来制定身份验证和授权决策。配置后,此模块将使用引用的域来查找身份信息,以做出身份验证决策和映射用户角色。例如,JBoss EAP 随附的预配置 其他 安全域具有 RealmDirect 登录模块。如果此模块中没有引用任何域,则默认使用 ApplicationRealm 安全域。
自定义模块
如果与 JBoss EAP 安全框架捆绑的登录模块无法满足安全环境的需求,可以编写自定义登录模块实施。AuthenticationManager 需要主题主体集的特定使用模式。要编写与身份验证管理器搭配使用的登录模块,需要全面了解 Jakarta Authentication Subject 类的信息存储功能以及这些功能的预期用途。

经常使用 UnauthenticatedIdentity login 模块选项。在某些情况下,请求未以身份验证的格式收到。Unauthenticated Identity 是一个登录模块配置选项,它将特定身份(如 guest )分配给在没有相关身份验证信息发出的请求。这可用于允许未受保护的 servlet 在 Jakarta Enterprise Beans 上调用不需要特定角色的方法。此类主体没有关联的角色,只能访问与未选中的权限约束关联的不安全的 Jakarta Enterprise Beans 方法。

2.8.6.2. 密码堆栈

堆栈中的多个登录模块可以串联在一起,每一登录模块在身份验证期间提供凭据验证和角色分配。这适用于许多用例,但有时凭据验证和角色分配分散到多个用户管理存储中。

请考虑在中央 LDAP 服务器中管理用户的情况,以及特定于应用的角色存储在应用的关系数据库中。password-stacking 模块选项捕获了这一关系。

要使用密码堆栈,每个登录模块都应将 password-stacking 属性设置为 useFirstPass,它位于 <module-option> 部分中。如果上一配置用于密码堆栈的模块对用户进行了身份验证,所有其他堆栈模块将考虑用户通过身份验证,并且仅尝试为授权步骤提供一组角色。

password-stacking 选项设置为 useFirstPass 时,此模块首先在属性名称 javax.security.auth.login.namejavax.security.auth.login.password 下分别在登录模块共享状态映射下查找共享用户名和密码。

如果找到,这些属性将用作主要名称和密码。如果没有找到,则主体名称和密码由此登录模块设置,并分别存储在属性名称 javax.security.auth.login.namejavax.security.auth.login.password 下。

2.8.6.3. 密码哈希

大多数登录模块必须将客户端提供的密码与用户管理系统中存储的密码进行比较。这些模块通常使用纯文本密码,但可以将其配置为支持散列密码,以防止纯文本密码存储在服务器端。JBoss EAP 支持配置哈希算法、编码和字符集。它还定义何时对用户密码和存储密码进行哈希处理。

重要

红帽 JBoss 企业应用平台通用标准认证配置不支持比 SHA-256 更弱的哈希算法。

2.8.7. 安全管理

security 子系统的安全 管理部分用于覆盖 security 子系统的高级行为。每个设置都是可选的。除了深度复制主题模式外,这些设置通常都是更改的。

2.8.7.1. 深度复制模式

如果已禁用深度复制主题模式(默认为该模式),复制安全数据结构会引用原始数据结构,而不是复制整个数据结构。此行为效率更高,但是如果多个具有相同身份的线程通过清空或注销操作清除该对象,则容易出现数据损坏。

如果启用了深度复制主题模式,则生成数据结构的完整副本及其所有相关数据,只要它们标记为可克隆。这比线程更安全,但效率较低。

2.8.8. 其他组件

2.8.8.1. jakarta 身份验证

Jakarta Authentication 是 Java 应用程序的可插拔接口,在 Jakarta Authentication 规范中定义。除了 Jakarta 身份验证身份验证外,JBoss EAP 还允许使用 Jakarta 身份验证。Jakarta 身份验证身份验证使用安全域中的登录模块进行配置,这些模块可以堆栈。jaclaimst 安全域是一个简单的 Jakarta Authentication 安全域,默认包含在内用于开发目的。

基于 Web 的管理控制台提供以下操作来配置 Jakarta Authentication 模块:

  • add
  • edit
  • remove
  • reset

部署到 JBoss EAP 的应用要求在其部署描述符中配置一个特殊的身份验证器,以使用 Jakarta 身份验证安全域。

2.8.8.2. Jakarta 授权

Jakarta 授权标准定义容器与授权服务提供商之间的合同,从而实施供容器使用的供应商。有关规格的详情,请参阅 Jakarta Authorization 1.1 规范

JBoss EAP 在 security 子系统的安全功能内实施对 Jakarta 授权的支持。

2.8.8.3. Jakarta 安全

Jakarta Security 定义了用于身份验证和身份存储的可移植插件接口,以及提供编程安全性的可注入型 SecurityContext 接口。您可以使用这些 API 的内置实施,或者定义自定义实施。有关规格的详情,请参阅 Jakarta 安全规范

Jakarta Security API 在 elytron 子系统中提供,可通过管理 CLI 启用。如需更多信息,请参阅《开发指南》中的关于 Jakarta 安全 API

2.8.8.4. 关于 Fine-Grained Authorization 和 XACML

细粒度授权使管理员能够适应在授予模块访问权限的决策制定过程中不断变化的要求和多个变量。因此,精细的授权可能会变得复杂。

注意

JBoss EAP 不支持用于 Web 或 Jakarta 企业 Bean 的 XACML 绑定。

JBoss EAP 将 XACML 用作介质来实现细粒度授权。XACML 提供基于标准的解决方案,以实现细粒度授权的复杂性质。XACML 为决策制定定义了策略语言和架构。XACML 架构包含一个策略强制点(PEP),它可截获正常程序流中的任何请求,并请求 Policy Decision 点(PDP)根据与 PDP 关联的策略做出访问权限决策。PDP 评估 PEP 创建的 XACML 请求,并通过策略运行以做出以下访问决策之一:

ALLOW
访问权限获得批准。
拒绝
访问被拒绝。
INDETERMINATE
PDP 中出现错误。
NOTAPPLICABLE
请求中缺少一些属性,或者策略不匹配。

XACML 还具有以下特性:

  • oasis XACML v2.0 库
  • 基于 JAXB v2.0 的对象模型
  • 用于存储和检索 XACML 策略和属性的现有DB 集成

2.8.8.5. SSO

JBoss EAP 为使用 undertowinfinispan 子系统的集群和非集群 SSO 提供开箱即用的支持。这需要:

  • 配置的安全域处理身份验证和授权。
  • SSO in finispan 复制缓存。它存在于受管域的 ha 和 full-ha 配置文件中,或者通过将 standalone-ha.xmlstandalone-full-ha.xml 配置文件用于单机服务器。
  • 其中包含的 Web cache-container 和 SSO 复制缓存必须存在。
  • undertow 子系统需要配置为使用 SSO。
  • 共享 SSO 信息的每个应用必须配置为使用相同的安全域。