Data Grid 安全指南
Red Hat Data Grid 复制链接链接已复制到粘贴板!
Data Grid 是一个高性能分布式内存数据存储。
- 无架构数据结构
- 将不同对象存储为键值对的灵活性。
- 基于网格的数据存储
- 旨在在集群中分发和复制数据。
- 弹性扩展
- 动态调整节点数量,以便在不中断服务的情况下满足需求。
- 数据互操作性
- 从不同端点在网格中存储、检索和查询数据。
Data Grid 文档 复制链接链接已复制到粘贴板!
红帽客户门户网站中提供了 Data Grid 的文档。
Data Grid 下载 复制链接链接已复制到粘贴板!
访问红帽客户门户上的 Data Grid 软件下载。
您必须有一个红帽帐户才能访问和下载数据中心软件。
使开源包含更多 复制链接链接已复制到粘贴板!
红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。有关更多详情,请参阅我们的首席技术官 Chris Wright 提供的消息。
第 1 章 配置数据网格授权 复制链接链接已复制到粘贴板!
授权限制了使用 Data Grid 和 access 数据执行操作的功能。您可以使用具有不同权限级别的角色分配用户。
1.1. Data Grid Authorization 复制链接链接已复制到粘贴板!
借助 Data Grid,您可以配置授权来保护缓存管理器和缓存实例。当用户应用程序或客户端试图对安全缓存管理器和缓存执行操作时,它们必须提供一个有足够权限的角色来执行该操作。
例如,您可以在特定的缓存实例上配置授权,以便调用 Cache.get () 需要分配具有 read 权限的角色,而 Cache.put () 需要具有写入权限的角色。
在这种情况下,如果具有 reader 角色的用户应用程序或客户端尝试编写条目,则 Data Grid 会拒绝请求并抛出安全异常。如果具有 writer 角色的用户应用程序或客户端发送写入请求,则数据网格会验证授权,并为后续操作发布令牌。
身份到角色映射
身份是类型为 java.security.Principal 的安全主体。使用 javax.security.auth.Subject 类实施的主题代表一组安全主体。换句话说,Subject 代表一个用户以及它所属的所有组。
Data Grid 使用角色映射器,以便安全主体与代表一个或多个权限的角色对应。
下图演示了安全主体如何映射到角色:
1.1.1. 权限 复制链接链接已复制到粘贴板!
通过限制您可以执行的操作来控制对缓存管理器和缓存的访问权限。权限也可以应用到指定缓存等特定实体。
| 权限 | 功能 | 描述 |
|---|---|---|
| 配置 |
| 定义新的缓存配置。 |
| LISTEN |
| 针对缓存管理器注册监听程序。 |
| 生命周期 |
| 停止缓存管理器。 |
| ALL | - | 包括所有缓存管理器权限。 |
| 权限 | 功能 | 描述 |
|---|---|---|
|
|
| 从缓存检索条目。 |
| 写 |
放置 , | 写入、替换、删除、驱除缓存中的数据。 |
| EXEC |
| 允许针对缓存执行代码。 |
| LISTEN |
| 针对缓存注册监听程序。 |
| BULK_READ |
| 执行批量检索操作。 |
| BULK_WRITE |
| 执行批量写入操作。 |
| 生命周期 |
| 启动和停止缓存。 |
| ADMIN |
| 允许访问底层组件和内部结构。 |
| ALL | - | 包括所有缓存权限。 |
| ALL_READ | - | 组合了 READ 和 BULK_READ 权限。 |
| ALL_WRITE | - | 组合 WRITE 和 BULK_WRITE 权限。 |
合并权限
您可能需要组合权限,以便它们很有用。例如,要允许"supervisors"运行流操作,但限制"标准"用户仅放置并获得,您可以定义以下映射:
<role name="standard" permission="READ WRITE" /> <role name="supervisors" permission="READ WRITE EXEC BULK"/>
<role name="standard" permission="READ WRITE" />
<role name="supervisors" permission="READ WRITE EXEC BULK"/>
1.1.2. 角色映射程序 复制链接链接已复制到粘贴板!
Data Grid 包括了一个 PrincipalRoleMapper API,它将 Subject 中的安全主体映射到授权角色。默认有两个角色映射器:
- IdentityRoleMapper
使用 Principal 名称作为角色名称。
-
Java 类:
org.infinispan.security.mappers.IdentityRoleMapper -
声明性配置:<
;identity-role-mapper />
-
Java 类:
- CommonNameRoleMapper
如果主体名称是可辨识名称(DN),则使用 Common Name (CN)作为角色名称。例如,
cn=managers,ou=people,dc=example,dc=comDN 映射到managers角色。-
Java 类:
org.infinispan.security.mappers.CommonRoleMapper -
声明性配置: <
;common-name-role-mapper />
-
Java 类:
您还可以使用实现 org.infinispan.security.PrincipalRoleMapper 接口的自定义角色映射程序。要以声明性方式配置自定义角色映射程序,请使用: < ;custom-role-mapper class="my.custom.RoleMapper" />
1.2. 以编程方式配置授权 复制链接链接已复制到粘贴板!
将 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.3. 声明性配置授权 复制链接链接已复制到粘贴板!
在 infinispan.xml 文件中配置授权。
流程
-
在
cache-container中配置全局授权设置,用于指定角色映射器,并定义一组角色和权限。 配置缓存授权,以根据用户角色限制访问权限。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您不想将所有角色应用到缓存,请明确定义授权缓存的角色,如下所示:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 定义缓存的授权角色。在本例中,只有
writer角色的用户没有授权"secured"缓存。Data Grid 拒绝来自这些用户的任何访问请求。
1.4. 带有安全缓存的代码执行 复制链接链接已复制到粘贴板!
当您配置 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 - 1
- 创建名为"encrypt-tcp"的安全 JGroups 堆栈,用于扩展 Data Grid 的默认 TCP 堆栈。
- 2
- 将节点用来执行证书身份验证的密钥存储命名。
- 3
- 指定密钥存储密码。
- 4
- 使用
stack.combine和stack.position属性在VERIFY_SUSPECT协议后将SSL_KEY_EXCHANGE插入到默认的 TCP 堆栈中。 - 5
- 指定协调器节点生成的 secret 密钥长度。默认值为
2048。 - 6
- 指定 coordinator 节点用来生成 secret 密钥的密码引擎。默认值为
RSA。 - 7
- 配置 Data Grid,以在协调器节点更改时生成并分发新的 secret 密钥。
- 8
- 配置 Data Grid,以在节点离开时生成和分发新的 secret 密钥。
- 9
- 配置 Data Grid 节点,以使用
SSL_KEY_EXCHANGE协议进行证书身份验证。 - 10
- 使用
stack.combine和stack.position属性在SSL_KEY_EXCHANGE协议后将ASYM_ENCRYPT插入默认的 TCP 堆栈。 - 11
- 配置 Data Grid 集群,以使用 secure 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>
只有在它们使用 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 堆栈中,如下例所示: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>
只有在使用 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 间的流量,用于集群之间的流量。