Data Grid 安全指南
Red Hat Data Grid 复制链接链接已复制到粘贴板!
Data Grid 是一个高性能分布式内存数据存储。
- 无架构数据结构
- 将不同对象存储为键值对的灵活性。
- 基于网格的数据存储
- 旨在在集群中分发和复制数据。
- 弹性扩展
- 动态调整节点数量,以便在不中断服务的情况下满足需求。
- 数据互操作性
- 从不同端点在网格中存储、检索和查询数据。
Data Grid 文档 复制链接链接已复制到粘贴板!
红帽客户门户网站中提供了 Data Grid 的文档。
Data Grid 下载 复制链接链接已复制到粘贴板!
访问红帽客户门户上的 Data Grid 软件下载。
您必须有一个红帽帐户才能访问和下载数据中心软件。
使开源包含更多 复制链接链接已复制到粘贴板!
红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。有关更多详情,请参阅我们的首席技术官 Chris Wright 提供的消息。
第 1 章 配置用户授权 复制链接链接已复制到粘贴板!
授权是一种安全功能,要求用户在访问缓存或与 Data Grid 资源交互之前具有某些权限。您可以将角色分配给提供不同级别权限的用户,从只读访问权限到完整的超级用户权限。
1.1. 在缓存配置中启用授权 复制链接链接已复制到粘贴板!
使用缓存配置中的授权来限制用户访问。在他们可以读取或写入缓存条目或创建和删除缓存之前,用户必须具有足够级别权限的角色。
流程
-
打开
infinispan.xml配置以进行编辑。 如果尚未声明,请在
cache-container的安全元素中添加 <authorization/> 标签。这为 Cache Manager 启用授权,并提供一组缓存可以继承的全局角色和权限。
-
将 &
lt;authorization/> 标签添加到 Data Grid 根据用户角色限制访问的每个缓存中。
以下配置示例演示了如何将隐式授权配置与默认角色和权限搭配使用:
1.2. 用户角色和权限 复制链接链接已复制到粘贴板!
Data Grid 包括一组默认的角色,为用户授予访问数据的权限并与 Data Grid 资源交互。
ClusterRoleMapper 是 Data Grid 用来将安全主体与授权角色关联的默认机制。
ClusterRoleMapper 将主体名称与角色名称匹配。名为 admin 的用户会自动获得 admin 权限,名为 deployer 的用户会收到 部署器 权限,以此类推。
| 角色 | 权限 | 描述 |
|---|---|---|
|
| ALL | 具有所有权限的超级用户,包括控制缓存管理器生命周期。 |
|
| ALL_READ、ALL_WRITE、LISTEN、EXEC、MONITOR、CREATE |
除了 |
|
| ALL_READ, ALL_WRITE, LISTEN, EXEC, MONITOR |
除 |
|
| ALL_READ, MONITOR |
除了监控权限外,还具有对 Data Grid |
|
| MONITOR |
可以通过 JMX 和 |
1.3. 安全授权如何工作 复制链接链接已复制到粘贴板!
Data Grid 授权通过限制用户访问来保护您的安装。
用户应用程序或客户端必须属于分配了足够权限的角色,然后才能对缓存管理器或缓存执行操作。
例如,您可以在特定的缓存实例上配置授权,以便调用 Cache.get () 需要分配具有 read 权限的角色,而 Cache.put () 需要具有写入权限的角色。
在这种情况下,如果具有 io 角色的用户应用程序或客户端尝试写入条目,则 Data Grid 会拒绝请求并抛出安全异常。如果具有 writer 角色的用户应用程序或客户端发送写入请求,则数据网格会验证授权,并为后续操作发布令牌。
身份
身份是类型为 java.security.Principal 的安全主体。使用 javax.security.auth.Subject 类实施的主题代表一组安全主体。换句话说,Subject 代表一个用户以及它所属的所有组。
角色的身份
Data Grid 使用角色映射器,以便安全主体对应于您分配一个或多个权限的角色。
下图演示了安全主体与角色对应:
1.3.1. 权限 复制链接链接已复制到粘贴板!
授权角色有不同的权限,它们具有不同的对数据网格的访问级别。权限可让您限制用户访问缓存管理器和缓存。
1.3.1.1. 缓存管理器权限 复制链接链接已复制到粘贴板!
| 权限 | 功能 | 描述 |
|---|---|---|
| 配置 |
| 定义新的缓存配置。 |
| LISTEN |
| 针对缓存管理器注册监听程序。 |
| 生命周期 |
| 停止缓存管理器。 |
| CREATE |
| 创建和删除容器资源,如缓存、计数器、模式和脚本。 |
| MONITOR |
|
允许访问 JMX 统计信息和 |
| ALL | - | 包括所有缓存管理器权限。 |
1.3.1.2. 缓存权限 复制链接链接已复制到粘贴板!
| 权限 | 功能 | 描述 |
|---|---|---|
| READ |
| 从缓存检索条目。 |
| 写 |
放置 , | 写入、替换、删除、驱除缓存中的数据。 |
| EXEC |
| 允许针对缓存执行代码。 |
| LISTEN |
| 针对缓存注册监听程序。 |
| BULK_READ |
| 执行批量检索操作。 |
| BULK_WRITE |
| 执行批量写入操作。 |
| 生命周期 |
| 启动和停止缓存。 |
| ADMIN |
| 允许访问底层组件和内部结构。 |
| MONITOR |
|
允许访问 JMX 统计信息和 |
| ALL | - | 包括所有缓存权限。 |
| ALL_READ | - | 组合了 READ 和 BULK_READ 权限。 |
| ALL_WRITE | - | 组合 WRITE 和 BULK_WRITE 权限。 |
1.3.2. 角色映射程序 复制链接链接已复制到粘贴板!
Data Grid 包含一个 PrincipalRoleMapper API,它将 Subject 中的安全主体映射到您可以分配给用户的授权角色。
1.3.2.1. 集群角色映射器 复制链接链接已复制到粘贴板!
ClusterRoleMapper 使用持久复制缓存来动态存储默认角色和权限的 principal-to-role 映射。
默认情况下,使用 Principal 名称作为角色名称,并实施 org.infinispan.security.MutableRoleMapper,它公开方法在运行时更改角色映射。
-
Java 类:
org.infinispan.security.mappers.ClusterRoleMapper -
声明性配置:<
;cluster-role-mapper />
1.3.2.2. 身份角色映射器 复制链接链接已复制到粘贴板!
IdentityRoleMapper 使用 Principal 名称作为角色名称。
-
Java 类:
org.infinispan.security.mappers.IdentityRoleMapper -
声明性配置:<
;identity-role-mapper />
1.3.2.3. commonName role mappers 复制链接链接已复制到粘贴板!
如果主体名称是可辨识名称(DN),则 CommonNameRoleMapper 使用 Common Name (CN)作为角色名称。
例如,此 DN、cn=managers、ou=people、dc=example、dc=com 映射到 managers 角色。
-
Java 类:
org.infinispan.security.mappers.CommonRoleMapper -
声明性配置: <
;common-name-role-mapper />
1.3.2.4. 自定义角色映射器 复制链接链接已复制到粘贴板!
自定义角色映射程序是 org.infinispan.security.PrincipalRoleMapper 的实现。
-
声明性配置: &
lt;custom-role-mapper class="my.custom.RoleMapper" />
1.4. 访问控制列表(ACL)缓存 复制链接链接已复制到粘贴板!
Data Grid 会缓存您在内部授予用户的角色,以获得最佳性能。每当您为用户授予或拒绝角色时,Data Grid 会清除 ACL 缓存,以确保正确应用用户权限。
如有必要,您可以禁用 ACL 缓存或使用 cache-size 和 cache-timeout 属性进行配置。
<security cache-size="1000" cache-timeout="300000"> <authorization /> </security>
<security cache-size="1000" cache-timeout="300000">
<authorization />
</security>
1.5. 自定义角色和权限 复制链接链接已复制到粘贴板!
您可以自定义 Data Grid 配置中的授权设置,以使用具有不同角色和权限组合的角色映射器。
流程
-
打开
infinispan.xml配置以进行编辑。 -
通过声明角色映射器和一组角色和权限,为
cache-container配置授权。 - 配置缓存授权,以根据用户角色限制访问权限。
以下配置示例演示了如何使用角色和权限配置安全授权:
1.6. 禁用安全授权 复制链接链接已复制到粘贴板!
在本地开发环境中,您可以禁用授权,以便用户不需要角色和权限。禁用安全授权意味着任何用户都可以访问数据并与 Data Grid 资源交互。
流程
-
打开
infinispan.xml配置以进行编辑。 -
从
cache-container的安全配置和每个缓存配置中删除任何授权元素。
1.7. 使用客户端证书配置授权 复制链接链接已复制到粘贴板!
启用客户端证书身份验证意味着您不需要在客户端配置中指定 Data Grid 用户凭证,这意味着您必须将角色与客户端证书中的 Common Name (CN)字段关联。
先决条件
- 为客户端提供 Java 密钥存储,其中包含其公共证书或证书链的一部分,通常是公共 CA 证书。
- 配置 Data Grid Server 来执行客户端证书身份验证。
流程
-
在安全授权配置中启用
common-name-role-mapper。 从客户端证书中为通用名称(
CN)分配具有适当权限的角色。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.8. 以编程方式配置授权 复制链接链接已复制到粘贴板!
将 Data Grid 用作嵌入式库时,您可以使用 GlobalSecurityConfigurationBuilder 和 ConfigurationBuilder 类配置授权。
流程
构建启用授权的
GlobalConfigurationBuilder,指定角色映射器,并定义一组角色和权限。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在
ConfigurationBuilder中启用用于缓存的授权,以根据用户角色限制访问权限。ConfigurationBuilder config = new ConfigurationBuilder(); config .security() .authorization() .enable();ConfigurationBuilder config = new ConfigurationBuilder(); config .security() .authorization() .enable();1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 隐式添加全局配置中的所有角色。
如果您不想将所有角色应用到缓存,请明确定义授权缓存的角色,如下所示:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 定义缓存的授权角色。在本例中,只有
writer角色的用户没有授权"secured"缓存。Data Grid 拒绝来自这些用户的任何访问请求。
1.9. 带有安全缓存的代码执行 复制链接链接已复制到粘贴板!
当您配置 Data Grid 授权,然后构建 DefaultCacheManager 时,它会返回 SecureCache,在调用底层缓存的任何操作前检查安全上下文。SecureCache 还确保应用程序无法检索较低级别的不安全对象,如 DataContainer。因此,您必须使用具有所需授权的身份执行代码。
在 Java 中,使用特定身份执行代码通常意味着将代码嵌套在 PrivilegedAction 中,如下所示:
使用 Java 8,您可以按如下所示简化前面的调用:
Security.doAs(mySubject, PrivilegedAction<String>() -> cache.put("key", "value"));
Security.doAs(mySubject, PrivilegedAction<String>() -> cache.put("key", "value"));
前面的调用使用 Security.doAs () 方法,而不是 Subject.doAs ()。您可以将任一方法与 Data Grid 搭配使用,但 Security.doAs () 提供了更好的性能。
如果您需要当前的 Subject,请使用以下调用从 Data Grid 上下文或从 AccessControlContext 中检索它:
Security.getSubject();
Security.getSubject();
第 2 章 加密集群传输 复制链接链接已复制到粘贴板!
保护集群传输,以便节点与加密消息通信。您还可以配置 Data Grid 集群来执行证书身份验证,以便只有具有有效身份的节点才能加入。
2.1. Data Grid 集群安全性 复制链接链接已复制到粘贴板!
为了保护集群流量,您需要配置 Data Grid 节点,以使用 secret 密钥加密 JGroups 消息有效负载。
Data Grid 节点可以从以下方法获取 secret 密钥:
- 协调器节点(symmetric 加密)。
- 共享密钥存储(symmetric encryption)。
从协调器节点检索 secret 密钥
您可以通过在 Data Grid 配置中的 JGroups 堆栈中添加 ASYM_ENCRYPT 协议来配置非对称加密。这允许 Data Grid 集群生成和分发 secret 密钥。
在使用非对称加密时,您还应提供密钥存储,以便节点能够执行证书身份验证并安全地交换机密密钥。这可保护集群不受中间人(MitM)攻击的影响。
非对称加密保护集群流量,如下所示:
- Data Grid 集群中的第一个节点(coordinator 节点)会生成一个 secret 密钥。
- 加入节点使用协调器执行证书身份验证,以互相验证身份。
- 加入的节点从 coordinator 节点请求 secret 密钥。该请求包含加入节点的公钥。
- 协调器节点使用公钥加密 secret 密钥,并将其返回到加入节点。
- 加入节点解密并安装 secret 密钥。
- 节点加入集群,使用 secret 密钥加密并解密信息。
从共享密钥存储检索 secret 密钥
您可以通过在 Data Grid 配置中的 JGroups 堆栈中添加 SYM_ENCRYPT 协议来配置对称加密。这允许 Data Grid 集群从您提供的密钥存储获取 secret 密钥。
- 节点在启动时从 Data Grid 类路径上的密钥存储安装 secret 密钥。
- 节点加入集群,使用 secret 密钥加密和解密消息。
非对称和对称加密的比较
带有证书身份验证的 ASYM_ENCRYPT 提供了额外的加密层,与 SYM_ENCRYPT 相比。您提供密钥存储来为 secret 密钥加密对协调节点的请求。Data Grid 会自动生成该 secret 密钥并处理集群流量,同时允许您指定何时生成 secret 密钥。例如,您可以配置集群以在节点离开时生成新的 secret 密钥。这样可确保节点无法绕过证书身份验证,并使用旧密钥加入。
另一方面,SYM_ENCRYPT 比 ASYM_ENCRYPT 快,因为节点不需要与集群协调器交换密钥。SYM_ENCRYPT 是没有配置在集群成员资格更改时自动生成新 secret 密钥的潜在缺陷。用户负责生成和分发节点用于加密集群流量的 secret 密钥。
2.2. 使用 Asymmetric Encryption 配置集群传输 复制链接链接已复制到粘贴板!
配置 Data Grid 集群,以生成和分发加密 JGroups 消息的 secret 密钥。
流程
- 使用证书链创建密钥存储,使 Data Grid 能够验证节点身份。
将密钥存储放在集群中每个节点的 classpath 上。
对于 Data Grid Server,您要将密钥存储放在 $RHDG_HOME 目录中。
将
SSL_KEY_EXCHANGE和ASYM_ENCRYPT协议添加到 Data Grid 配置中的 JGroups 堆栈,如下例所示:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
当您启动 Data Grid 集群时,以下日志消息表示集群使用 secure JGroups 堆栈:
[org.infinispan.CLUSTER] ISPN000078: Starting JGroups channel cluster with stack <encrypted_stack_name>
[org.infinispan.CLUSTER] ISPN000078: Starting JGroups channel cluster with stack <encrypted_stack_name>
只有在它们使用 ASYM_ENCRYPT 且可以从协调器节点获取 secret 密钥时,数据网格节点才能加入集群。否则,以下信息会写入 Data Grid 日志:
[org.jgroups.protocols.ASYM_ENCRYPT] <hostname>: received message without encrypt header from <hostname>; dropping it
[org.jgroups.protocols.ASYM_ENCRYPT] <hostname>: received message without encrypt header from <hostname>; dropping it
参考
此流程中的 ASYM_ENCRYPT 配置示例显示了常用的参数。如需完整的可用参数集合,请参阅 JGroups 文档。
2.3. 使用 Symmetric 加密配置集群传输 复制链接链接已复制到粘贴板!
配置 Data Grid 集群,以使用您提供的密钥存储中的 secret 密钥加密 JGroups 消息。
流程
- 创建包含 secret 密钥的密钥存储。
将密钥存储放在集群中每个节点的 classpath 上。
对于 Data Grid Server,您要将密钥存储放在 $RHDG_HOME 目录中。
-
将
SYM_ENCRYPT协议添加到 Data Grid 配置中的 JGroups 堆栈。
验证
当您启动 Data Grid 集群时,以下日志消息表示集群使用 secure JGroups 堆栈:
[org.infinispan.CLUSTER] ISPN000078: Starting JGroups channel cluster with stack <encrypted_stack_name>
[org.infinispan.CLUSTER] ISPN000078: Starting JGroups channel cluster with stack <encrypted_stack_name>
只有在使用 SYM_ENCRYPT 且可以从共享密钥存储获取 secret 密钥时,数据网格节点才能加入集群。否则,以下信息会写入 Data Grid 日志:
[org.jgroups.protocols.SYM_ENCRYPT] <hostname>: received message without encrypt header from <hostname>; dropping it
[org.jgroups.protocols.SYM_ENCRYPT] <hostname>: received message without encrypt header from <hostname>; dropping it
参考
此流程中的 SYM_ENCRYPT 配置示例显示了常用的参数。如需完整的可用参数集合,请参阅 JGroups 文档。
第 3 章 数据网格端口和协议 复制链接链接已复制到粘贴板!
随着数据在网络上分发,并可为外部客户端请求建立连接,您应该了解 Data Grid 用来处理网络流量的端口和协议。
如果将 Data Grid 作为远程服务器运行,您可能需要允许远程客户端通过防火墙。同样,您应该调整 Data Grid 节点用于集群通信的端口,以防止冲突或网络问题。
3.1. 数据网格服务器端口和协议 复制链接链接已复制到粘贴板!
Data Grid Server 在您的网络上公开端点以进行远程客户端访问。
| 端口 | 协议 | 描述 |
|---|---|---|
|
| TCP | hot Rod 和 REST 端点 |
|
| TCP | Memcached 端点,默认为禁用。 |
3.1.1. 为远程连接配置网络防火墙 复制链接链接已复制到粘贴板!
调整任何防火墙规则,以允许服务器和外部客户端之间的流量。
流程
例如,在 Red Hat Enterprise Linux (RHEL)工作站中,您可以使用 firewalld 允许到端口 11222 的流量,如下所示:
firewall-cmd --add-port=11222/tcp --permanent success firewall-cmd --list-ports | grep 11222 11222/tcp
# firewall-cmd --add-port=11222/tcp --permanent
success
# firewall-cmd --list-ports | grep 11222
11222/tcp
要配置在网络间应用的防火墙规则,您可以使用 nftables 工具。
3.2. 集群流量的 TCP 和 UDP 端口 复制链接链接已复制到粘贴板!
Data Grid 对集群传输信息使用以下端口:
| 默认端口 | 协议 | 描述 |
|---|---|---|
|
| TCP/UDP | JGroups 集群绑定端口 |
|
| UDP | JGroups 多播 |
跨站点复制
Data Grid 为 JGroups RELAY2 协议使用以下端口:
7900- 对于在 OpenShift 上运行的 Data Grid 集群。
7800- 如果将 UDP 用于节点间的流量,使用 TCP 作为集群之间的流量。
7801- 如果将 TCP 用于节点和 TCP 间的流量,用于集群之间的流量。