Data Grid 安全指南


Red Hat Data Grid 8.1

启用并配置 Data Grid 安全性

Red Hat Customer Content Services

摘要

保护您的数据网格部署免受网络入侵者。限制授权用户的数据访问。

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. 权限

通过限制您可以执行的操作来控制对缓存管理器和缓存的访问权限。权限也可以应用到指定缓存等特定实体。

Expand
表 1.1. 缓存管理器权限
权限功能描述

配置

defineConfiguration

定义新的缓存配置。

LISTEN

addListener

针对缓存管理器注册监听程序。

生命周期

stop

停止缓存管理器。

ALL

-

包括所有缓存管理器权限。

Expand
表 1.2. 缓存权限
权限功能描述

READ

Get包含

从缓存检索条目。

放置 , put IfAbsent,replace,remove,eviction

写入、替换、删除、驱除缓存中的数据。

EXEC

distexec,stream

允许针对缓存执行代码。

LISTEN

addListener

针对缓存注册监听程序。

BULK_READ

keySet,values,entrySet,query

执行批量检索操作。

BULK_WRITE

清除,putAll

执行批量写入操作。

生命周期

启动,stop

启动和停止缓存。

ADMIN

getVersion,addInterceptor*, removeInterceptor,getInterceptorChain,getEvictionManager,getComponentRegistry,getDistributionManager,getAuthorizationManager,evict,getRpcManager,getCacheConfiguration,getCacheManager, getInvocationContextContainer,setAvailability,getDataContainer,getStats,getXAResource

允许访问底层组件和内部结构。

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"/>
Copy to Clipboard Toggle word wrap

1.1.2. 角色映射程序

Data Grid 包括了一个 PrincipalRoleMapper API,它将 Subject 中的安全主体映射到授权角色。默认有两个角色映射器:

IdentityRoleMapper

使用 Principal 名称作为角色名称。

  • Java 类: org.infinispan.security.mappers.IdentityRoleMapper
  • 声明性配置:&lt ;identity-role-mapper />
CommonNameRoleMapper

如果主体名称是可辨识名称(DN),则使用 Common Name (CN)作为角色名称。例如,cn=managers,ou=people,dc=example,dc=com DN 映射到 managers 角色。

  • Java 类: org.infinispan.security.mappers.CommonRoleMapper
  • 声明性配置: &lt ;common-name-role-mapper />

您还可以使用实现 org.infinispan.security.PrincipalRoleMapper 接口的自定义角色映射程序。要以声明性方式配置自定义角色映射程序,请使用: &lt ;custom-role-mapper class="my.custom.RoleMapper" />

1.2. 以编程方式配置授权

将 Data Grid 用作嵌入式库时,您可以使用 GlobalSecurityConfigurationBuilderConfigurationBuilder 类配置授权。

流程

  1. 构建启用授权的 GlobalConfigurationBuilder,指定角色映射器,并定义一组角色和权限。

    GlobalConfigurationBuilder global = new GlobalConfigurationBuilder();
    global
       .security()
          .authorization().enable() 
    1
    
             .principalRoleMapper(new IdentityRoleMapper()) 
    2
    
             .role("admin") 
    3
    
                .permission(AuthorizationPermission.ALL)
             .role("reader")
                .permission(AuthorizationPermission.READ)
             .role("writer")
                .permission(AuthorizationPermission.WRITE)
             .role("supervisor")
                .permission(AuthorizationPermission.READ)
                .permission(AuthorizationPermission.WRITE)
                .permission(AuthorizationPermission.EXEC);
    Copy to Clipboard Toggle word wrap
    1
    为 Cache Manager 启用 Data Grid 授权。
    2
    指定 PrincipalRoleMapper 的实现,它将 Principals 映射到角色。
    3
    定义角色及其关联的权限。
  2. ConfigurationBuilder 中启用用于缓存的授权,以根据用户角色限制访问权限。

    ConfigurationBuilder config = new ConfigurationBuilder();
    config
       .security()
          .authorization()
             .enable(); 
    1
    Copy to Clipboard Toggle word wrap
    1
    隐式添加全局配置中的所有角色。

    如果您不想将所有角色应用到缓存,请明确定义授权缓存的角色,如下所示:

    ConfigurationBuilder config = new ConfigurationBuilder();
    config
       .security()
          .authorization()
             .enable()
             .role("admin") 
    1
    
             .role("supervisor")
             .role("reader");
    Copy to Clipboard Toggle word wrap
    1
    定义缓存的授权角色。在本例中,只有 writer 角色的用户没有授权"secured"缓存。Data Grid 拒绝来自这些用户的任何访问请求。

1.3. 声明性配置授权

infinispan.xml 文件中配置授权。

流程

  1. cache-container 中配置全局授权设置,用于指定角色映射器,并定义一组角色和权限。
  2. 配置缓存授权,以根据用户角色限制访问权限。

    <infinispan>
       <cache-container default-cache="secured" name="secured">
          <security>
             <authorization> 
    1
    
                <identity-role-mapper /> 
    2
    
                <role name="admin" permissions="ALL" /> 
    3
    
                <role name="reader" permissions="READ" />
                <role name="writer" permissions="WRITE" />
                <role name="supervisor" permissions="READ WRITE EXEC"/>
             </authorization>
          </security>
          <local-cache name="secured">
             <security>
                <authorization/> 
    4
    
             </security>
          </local-cache>
       </cache-container>
    </infinispan>
    Copy to Clipboard Toggle word wrap
    1
    为 Cache Manager 启用 Data Grid 授权。
    2
    指定 PrincipalRoleMapper 的实现,它将 Principals 映射到角色。
    3
    定义角色及其关联的权限。
    4
    隐式添加全局配置中的所有角色。

    如果您不想将所有角色应用到缓存,请明确定义授权缓存的角色,如下所示:

    <infinispan>
       <cache-container default-cache="secured" name="secured">
          <security>
             <authorization>
                <identity-role-mapper />
                <role name="admin" permissions="ALL" />
                <role name="reader" permissions="READ" />
                <role name="writer" permissions="WRITE" />
                <role name="supervisor" permissions="READ WRITE EXEC"/>
             </authorization>
          </security>
          <local-cache name="secured">
             <security>
                <authorization roles="admin supervisor reader"/> 
    1
    
             </security>
          </local-cache>
       </cache-container>
    
    </infinispan>
    Copy to Clipboard Toggle word wrap
    1
    定义缓存的授权角色。在本例中,只有 writer 角色的用户没有授权"secured"缓存。Data Grid 拒绝来自这些用户的任何访问请求。

1.4. 带有安全缓存的代码执行

当您配置 Data Grid 授权,然后构建 DefaultCacheManager 时,它会返回 SecureCache,在调用底层缓存的任何操作前检查安全上下文。SecureCache 还确保应用程序无法检索较低级别的不安全对象,如 DataContainer。因此,您必须使用具有所需授权的身份执行代码。

在 Java 中,使用特定身份执行代码通常意味着将代码嵌套在 PrivilegedAction 中,如下所示:

import org.infinispan.security.Security;

Security.doAs(subject, new PrivilegedExceptionAction<Void>() {
public Void run() throws Exception {
    cache.put("key", "value");
}
});
Copy to Clipboard Toggle word wrap

使用 Java 8,您可以按如下所示简化前面的调用:

Security.doAs(mySubject, PrivilegedAction<String>() -> cache.put("key", "value"));
Copy to Clipboard Toggle word wrap

前面的调用使用 Security.doAs () 方法,而不是 Subject.doAs ()。您可以将任一方法与 Data Grid 搭配使用,但 Security.doAs () 提供了更好的性能。

如果您需要当前的 Subject,请使用以下调用从 Data Grid 上下文或从 AccessControlContext 中检索它:

Security.getSubject();
Copy to Clipboard Toggle word wrap

第 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)攻击的影响。

非对称加密保护集群流量,如下所示:

  1. Data Grid 集群中的第一个节点(coordinator 节点)会生成一个 secret 密钥。
  2. 加入节点使用协调器执行证书身份验证,以互相验证身份。
  3. 加入的节点从 coordinator 节点请求 secret 密钥。该请求包含加入节点的公钥。
  4. 协调器节点使用公钥加密 secret 密钥,并将其返回到加入节点。
  5. 加入节点解密并安装 secret 密钥。
  6. 节点加入集群,使用 secret 密钥加密并解密信息。

从共享密钥存储检索 secret 密钥

您可以通过在 Data Grid 配置中的 JGroups 堆栈中添加 SYM_ENCRYPT 协议来配置对称加密。这允许 Data Grid 集群从您提供的密钥存储获取 secret 密钥。

  1. 节点在启动时从 Data Grid 类路径上的密钥存储安装 secret 密钥。
  2. 节点加入集群,使用 secret 密钥加密和解密消息。

非对称和对称加密的比较

带有证书身份验证的 ASYM_ENCRYPT 提供了额外的加密层,与 SYM_ENCRYPT 相比。您提供密钥存储来为 secret 密钥加密对协调节点的请求。Data Grid 会自动生成该 secret 密钥并处理集群流量,同时允许您指定何时生成 secret 密钥。例如,您可以配置集群以在节点离开时生成新的 secret 密钥。这样可确保节点无法绕过证书身份验证,并使用旧密钥加入。

另一方面,SYM_ENCRYPTASYM_ENCRYPT 快,因为节点不需要与集群协调器交换密钥。SYM_ENCRYPT 是没有配置在集群成员资格更改时自动生成新 secret 密钥的潜在缺陷。用户负责生成和分发节点用于加密集群流量的 secret 密钥。

2.2. 使用 Asymmetric Encryption 配置集群传输

配置 Data Grid 集群,以生成和分发加密 JGroups 消息的 secret 密钥。

流程

  1. 使用证书链创建密钥存储,使 Data Grid 能够验证节点身份。
  2. 将密钥存储放在集群中每个节点的 classpath 上。

    对于 Data Grid Server,您要将密钥存储放在 $RHDG_HOME 目录中。

  3. SSL_KEY_EXCHANGEASYM_ENCRYPT 协议添加到 Data Grid 配置中的 JGroups 堆栈,如下例所示:

    <infinispan>
        <jgroups>
             <stack name="encrypt-tcp" extends="tcp"> 
    1
    
               <SSL_KEY_EXCHANGE keystore_name="mykeystore.jks" 
    2
    
                                 keystore_password="changeit" 
    3
    
                                 stack.combine="INSERT_AFTER"
                                 stack.position="VERIFY_SUSPECT"/> 
    4
    
               <ASYM_ENCRYPT asym_keylength="2048" 
    5
    
                        asym_algorithm="RSA" 
    6
    
                        change_key_on_coord_leave = "false" 
    7
    
                        change_key_on_leave = "false" 
    8
    
                        use_external_key_exchange = "true" 
    9
    
                        stack.combine="INSERT_AFTER"
                        stack.position="SSL_KEY_EXCHANGE"/> 
    10
    
             </stack>
        </jgroups>
        <cache-container name="default" statistics="true">
          <transport cluster="${infinispan.cluster.name}"
                     stack="encrypt-tcp" 
    11
    
                     node-name="${infinispan.node.name:}"/>
       </cache-container>
    </infinispan>
    Copy to Clipboard Toggle word wrap
    1
    创建名为"encrypt-tcp"的安全 JGroups 堆栈,用于扩展 Data Grid 的默认 TCP 堆栈。
    2
    将节点用来执行证书身份验证的密钥存储命名。
    3
    指定密钥存储密码。
    4
    使用 stack.combinestack.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.combinestack.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>
Copy to Clipboard Toggle word wrap

只有在它们使用 ASYM_ENCRYPT 且可以从协调器节点获取 secret 密钥时,数据网格节点才能加入集群。否则,以下信息会写入 Data Grid 日志:

[org.jgroups.protocols.ASYM_ENCRYPT] <hostname>: received message without encrypt header from <hostname>; dropping it
Copy to Clipboard Toggle word wrap

参考

此流程中的 ASYM_ENCRYPT 配置示例显示了常用的参数。如需完整的可用参数集合,请参阅 JGroups 文档。

2.3. 使用 Symmetric 加密配置集群传输

配置 Data Grid 集群,以使用您提供的密钥存储中的 secret 密钥加密 JGroups 消息。

流程

  1. 创建包含 secret 密钥的密钥存储。
  2. 将密钥存储放在集群中每个节点的 classpath 上。

    对于 Data Grid Server,您要将密钥存储放在 $RHDG_HOME 目录中。

  3. SYM_ENCRYPT 协议添加到 Data Grid 配置中的 JGroups 堆栈中,如下例所示:

    <infinispan>
        <jgroups>
             <stack name="encrypt-tcp" extends="tcp"> 
    1
    
               <SYM_ENCRYPT keystore_name="myKeystore.p12" 
    2
    
                            keystore_type="PKCS12" 
    3
    
                            store_password="changeit" 
    4
    
                            key_password="changeit" 
    5
    
                            alias="myKey" 
    6
    
                            stack.combine="INSERT_AFTER"
                            stack.position="VERIFY_SUSPECT"/> 
    7
    
             </stack>
        </jgroups>
        <cache-container name="default" statistics="true">
          <transport cluster="${infinispan.cluster.name}"
                     stack="encrypt-tcp" 
    8
    
                     node-name="${infinispan.node.name:}"/>
       </cache-container>
    </infinispan>
    Copy to Clipboard Toggle word wrap
    1
    创建名为"encrypt-tcp"的安全 JGroups 堆栈,用于扩展 Data Grid 的默认 TCP 堆栈。
    2
    将密钥存储命名为从哪些节点获取 secret 密钥。
    3
    指定密钥存储类型。JGroups 默认使用 JCEKS。
    4
    指定密钥存储密码。
    5
    指定 secret 密钥密码。
    6
    指定 secret 密钥别名。
    7
    使用 stack.combinestack.position 属性在 VERIFY_SUSPECT 协议后将 SYM_ENCRYPT 插入到默认的 TCP 堆栈中。
    8
    配置 Data Grid 集群,以使用 secure JGroups 堆栈。

验证

当您启动 Data Grid 集群时,以下日志消息表示集群使用 secure JGroups 堆栈:

[org.infinispan.CLUSTER] ISPN000078: Starting JGroups channel cluster with stack <encrypted_stack_name>
Copy to Clipboard Toggle word wrap

只有在使用 SYM_ENCRYPT 且可以从共享密钥存储获取 secret 密钥时,数据网格节点才能加入集群。否则,以下信息会写入 Data Grid 日志:

[org.jgroups.protocols.SYM_ENCRYPT] <hostname>: received message without encrypt header from <hostname>; dropping it
Copy to Clipboard Toggle word wrap

参考

此流程中的 SYM_ENCRYPT 配置示例显示了常用的参数。如需完整的可用参数集合,请参阅 JGroups 文档。

第 3 章 数据网格端口和协议

随着数据在网络上分发,并可为外部客户端请求建立连接,您应该了解 Data Grid 用来处理网络流量的端口和协议。

如果将 Data Grid 作为远程服务器运行,您可能需要允许远程客户端通过防火墙。同样,您应该调整 Data Grid 节点用于集群通信的端口,以防止冲突或网络问题。

3.1. 数据网格服务器端口和协议

Data Grid Server 在您的网络上公开端点以进行远程客户端访问。

Expand
端口协议描述

11222

TCP

hot Rod 和 REST 端点

11221

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
Copy to Clipboard Toggle word wrap

要配置在网络间应用的防火墙规则,您可以使用 nftables 工具。

3.2. 集群流量的 TCP 和 UDP 端口

Data Grid 对集群传输信息使用以下端口:

Expand
默认端口协议描述

7800

TCP/UDP

JGroups 集群绑定端口

46655

UDP

JGroups 多播

跨站点复制

Data Grid 为 JGroups RELAY2 协议使用以下端口:

7900
对于在 OpenShift 上运行的 Data Grid 集群。
7800
如果将 UDP 用于节点间的流量,使用 TCP 作为集群之间的流量。
7801
如果将 TCP 用于节点和 TCP 间的流量,用于集群之间的流量。

法律通告

Copyright © 2023 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat