ZooKeeper 摘要身份验证

2025 年 5 月 15 日 | 阅读 11 分钟

ZooKeeper 认证是保护 Apache ZooKeeper 的关键方面,ZooKeeper 在分布式系统中维护配置信息、命名、同步和提供组服务方面发挥着至关重要的作用。由于 ZooKeeper 通常用于涉及关键基础设施或敏感数据的场景,因此确保只有授权的客户端和服务器能够与其交互对于维护系统完整性和隐私至关重要。

1. ZooKeeper 认证简介

ZooKeeper 中的认证提供了验证与服务交互的客户端和服务器身份的机制。这可以防止对资源的未经授权访问,并确保只有受信任的客户端才能发出请求或执行操作。

ZooKeeper 认证通常涉及两个主要组件

  • 认证机制: 用于识别和认证与系统交互的实体的各种方法。
  • 授权: 确定已认证实体是否允许访问特定资源或执行某些操作的后续控制。

2. ZooKeeper 安全模型

ZooKeeper 使用基于认证、授权数据完整性 的安全模型。虽然认证确保验证客户端或服务器的身份,但授权确定在实体经过身份验证后允许执行哪些操作。

  • 认证: 通过验证凭据来验证客户端或服务器的身份。
  • 授权: 根据客户端或服务器的已认证身份及其权限授予或拒绝对资源的访问。
  • 数据完整性: 确保客户端和 ZooKeeper 服务器之间交换的数据在传输过程中未被篡改。

3. ZooKeeper 认证机制

ZooKeeper 支持多种认证方法,使其能够适应不同环境下的各种安全要求。最常见的机制包括 Digest、Kerberos、SSL/TLS 和自定义认证。

3.1 Digest 认证

Digest 认证使用简单的用户名-密码模型。客户端提供用户名和密码,这些用户名和密码将被哈希并与存储的凭据进行比较。Digest 认证是较简单的选项之一,适用于大多数通用用例。

机制

客户端发送格式为 digest:<username>:<password> 的认证请求。例如,如果客户端发送 digest:admin:password123,ZooKeeper 将通过将其哈希密码与记录进行匹配来验证它。

Digest 认证程序示例

输出

ZooKeeper Digest Authentication

3.2 Kerberos 认证

Kerberos 是一种企业级网络认证协议,可提供安全的、基于票证的客户端-服务器认证。ZooKeeper 可以配置为使用 Kerberos,这非常适合高安全性的企业环境。

机制

ZooKeeper 依赖于密钥分发中心 (KDC) 发行的 Kerberos 票证进行客户端认证。ZooKeeper 服务器检查这些票证的真实性以验证客户端身份。

Kerberos 认证程序示例

首先,在服务器和客户端两侧设置 Kerberos Keytab 文件和 JAAS 配置。以下是一个使用 Kerberos 认证连接到 ZooKeeper 的示例客户端代码

对于 Kerberos 认证,您需要设置 Kerberos 密钥分发中心 (KDC),这需要对 ZooKeeper 服务器和客户端进行额外的配置。

ZooKeeper 服务器配置

在 zoo.cfg 中,设置以下属性

通过创建一个 zookeeper_jaas.conf 文件来设置 ZooKeeper 的 Kerberos JAAS 配置

然后,使用此 JAAS 配置启动 ZooKeeper

客户端代码

使用 client_jaas.conf 文件配置客户端

使用 JAAS 配置运行以下客户端代码

输出

ZooKeeper Digest Authentication

3.3 SSL/TLS 认证

SSL/TLS 在客户端和 ZooKeeper 服务器之间提供加密通信,允许双方使用 SSL 证书进行认证。

机制

ZooKeeper 服务器和客户端使用相互 SSL/TLS 认证,在握手期间双方都会向对方出示证书。如果两个证书都有效,则连接继续。

SSL/TLS 认证程序示例

配置客户端的密钥库和信任库,并使用以下代码与 ZooKeeper 建立 SSL 连接

ZooKeeper 服务器配置

将以下属性添加到 zoo.cfg

客户

输出

ZooKeeper Digest Authentication

3.4 自定义认证

ZooKeeper 允许通过实现自定义 AuthProvider 类来进行自定义认证方案,这有助于与 OAuth 或 LDAP 等外部认证系统集成。

机制

开发人员实现自定义 AuthProvider 类并将其插入 ZooKeeper 服务器,从而允许 ZooKeeper 使用自定义方法来验证客户端身份。

自定义认证程序示例

实现自定义 AuthProvider 并将其注册到 ZooKeeper 配置中,然后使用自定义令牌进行认证

服务器端:实现自定义 AuthProvider

通过扩展 org.apache.zookeeper.server.auth.AuthProvider 来实现自定义 AuthProvider 类。

将以下内容添加到 zoo.cfg 以注册自定义认证提供程序

客户端代码

使用自定义认证方案连接到 ZooKeeper

输出

ZooKeeper Digest Authentication

4. ZooKeeper 中的认证过程

ZooKeeper 中的认证过程通常涉及以下步骤

  1. 客户端发起连接: 当客户端尝试连接到 ZooKeeper 服务器时,它可能会根据所使用的认证机制提供认证凭据(例如,用户名/密码、Kerberos 票证或 SSL 证书)。
  2. 认证请求: 包含凭据的请求到客户端,通常在初始握手之后(例如,对于 SSL/TLS,这发生在握手期间,对于 Digest,凭据是单独传递的)。
  3. 服务器验证凭据: ZooKeeper 服务器处理认证请求。它根据所选机制验证凭据(例如,为 digest 认证哈希密码或验证 Kerberos 票证)。
  4. 响应客户端: 如果凭据有效,服务器将响应成功消息。如果无效,则发送认证失败消息,连接将被终止。

5. ZooKeeper 中的授权

ZooKeeper 的授权系统在成功进行客户端认证后,可以对资源进行受控访问。通过使用访问控制列表 (ACL),ZooKeeper 指定哪些客户端可以在 ZooKeeper 树中的每个节点上执行某些操作。ACL 由分配给用户、组或客户端的权限组成,并提供了一个灵活的模型来定义访问限制。

5.1 ZooKeeper ACL(访问控制列表)

ZooKeeper 中的每个 ACL 条目都有三个组成部分

  • ID: 表示正在授予或拒绝访问的实体(用户、组或客户端)。
  • 权限: 指定实体可以执行的操作,例如 READ、WRITE、CREATE、DELETE 或 ADMIN。
  • Scheme: 定义使用的认证方案(例如,digest、ip、kerberos)。

ACL 结构示例

典型的 ACL 条目可能看起来像 digest:admin:password123:READ,其中

  • Scheme: digest(表示 digest 认证方案)。
  • ID: admin(用户名)。
  • Permissions: READ(表示用户只能读取指定节点)。

ACL 权限

ZooKeeper 支持以下权限

  1. READ: 允许读取节点数据和列出其子节点。
  2. WRITE: 允许为节点设置数据。
  3. CREATE: 允许创建子节点。
  4. DELETE: 允许删除节点。
  5. ADMIN: 允许修改节点的 ACL。

程序示例:设置 ACL

下面的示例演示了如何创建一个具有自定义 ACL 的 ZooKeeper 节点,该自定义 ACL 仅允许管理员用户(使用 digest 认证)读取和写入该节点。

输出

ZooKeeper Digest Authentication

5.2 默认 ACL

ZooKeeper 节点可以继承默认 ACL,这使得跨多个节点的权限管理更加简单。在父级设置的默认 ACL 可以在创建子节点时传播到子节点,从而在节点层次结构中实现一致的访问控制策略。

5.3 管理 ACL

ZooKeeper 提供了一个 API 来管理任何节点的 ACL。管理员可以根据需要添加、修改或删除 ACL 条目。

示例:修改现有节点上的 ACL

以下示例演示了如何更新现有 ZooKeeper 节点的 ACL。该程序首先对客户端进行认证,然后更改节点的 ACL 以授予另一个用户 READ 权限。

输出

ZooKeeper Digest Authentication

示例:删除 ACL

此示例通过先识别 ACL 条目,然后设置不包含它的 ACL 列表来从节点中删除特定的 ACL 条目。

输出

ZooKeeper Digest Authentication

6. ZooKeeper 与外部安全系统集成

在许多环境中,将 ZooKeeper 认证和授权与外部安全系统集成非常重要。常见的集成包括

6.1 LDAP 集成

LDAP(轻量级目录访问协议)广泛用于管理大型组织中的用户凭据。通过将 ZooKeeper 与 LDAP 服务器集成,组织可以集中控制和认证用户对 ZooKeeper 资源的访问。

LDAP 集成在 ZooKeeper 中如何工作

要将 LDAP 与 ZooKeeper 集成,您需要

  1. 实现自定义 AuthProvider: 这涉及编写与 LDAP 服务器交互的自定义认证提供程序。
  2. 在 ZooKeeper 中配置自定义提供程序: 然后,在 ZooKeeper 的配置文件中配置自定义提供程序以处理认证。

程序示例:LDAP 认证提供程序

下面是一个自定义 LDAPAuthProvider 类的示例,该类连接到 LDAP 服务器进行认证。

LDAPAuthProvider.java

输出 1

ZooKeeper Digest Authentication

输出 2

ZooKeeper Digest Authentication

启用 LDAP 认证提供程序的步骤

1. 编译上面的 Java 代码,并将生成的类文件放在 ZooKeeper 的类路径中。

2. 在 zoo.cfg 中注册自定义 Auth Provider

3. 使用 LDAP 凭据进行认证

在客户端应用程序中,按以下方式提供 LDAP 凭据

6.2 OAuth 集成

OAuth 是一种流行的基于令牌的协议,用于在不暴露用户凭据的情况下授予对资源的访问权限。尽管 ZooKeeper 不原生支持 OAuth,但可以通过实现类似于 LDAP 示例的自定义认证提供程序来集成 OAuth。

OAuth 集成在 ZooKeeper 中如何工作

要使用 OAuth 对 ZooKeeper 客户端进行认证

  1. 实现自定义 AuthProvider: 此类会验证 OAuth 提供程序中的令牌。
  2. 在 ZooKeeper 中配置自定义提供程序。

程序示例:OAuth 认证提供程序

这是一个简单的 OAuthAuthProvider 示例,它连接到 OAuth 授权服务器来验证令牌。

OAuthAuthProvider.java

输出 1

ZooKeeper Digest Authentication

输出 2

ZooKeeper Digest Authentication

启用 OAuth 认证提供程序的步骤

1. 编译上面的 Java 代码,并将编译后的类添加到 ZooKeeper 的类路径中。

2. 在 zoo.cfg 中注册 OAuth Auth Provider

3. 使用 OAuth 令牌进行认证

在客户端应用程序中,按以下方式传递 OAuth 令牌

7. ZooKeeper 安全配置

可以通过其配置文件 (zoo.cfg) 中的各种属性来设置 ZooKeeper 的安全配置。关键配置包括

  • authProvider: 指定要使用的认证提供程序(例如,org.apache.zookeeper.server.auth.DigestAuthenticationProvider 用于 Digest 认证)。
  • requireClientAuthScheme: 确定客户端所需的认证机制。
  • sslKeyStoreLocation: 如果启用了 SSL 认证,则指定 SSL 密钥库的位置。

8. ZooKeeper 认证和安全最佳实践

为了在使用 ZooKeeper 时确保最佳安全性,建议遵循以下最佳实践

  1. 使用 Digest 认证: 与 Kerberos 相比,Digest 认证更易于配置和部署,同时仍为大多数用例提供强大的安全性。
  2. 限制对 ZooKeeper 集群的访问: 将 ZooKeeper 服务器的访问限制在受信任的主机或 IP 地址范围内。这可以防止未经授权的客户端访问服务。
  3. 使用强密码: 确保为 Digest 认证使用强密码。弱密码会增加未经授权访问的风险。
  4. 启用 ACL: 始终使用 ACL 来限制对敏感节点的访问,并限制哪些客户端可以对 ZooKeeper 节点执行某些操作。

下一主题Kafka 数据捕获