注册表安全性

本文档介绍了如何在服务注册表中实现安全性

在未启用 Kerberos 的 Hadoop 集群中,注册表根本不提供任何安全性:注册表对所有人可写。

因此,本文档仅与安全集群相关。

安全性模型

注册表的安全性模型旨在满足安全注册表的以下目标:1. 在安全的 ZK 安装上提供功能性安全性。1. 允许 RM 为注册空间创建按用户划分的区域 1. 允许属于用户的应用程序将注册表条目写入到其空间部分。这些可能是短期的或长期的 YARN 应用程序,或者可能是静态应用程序。1. 阻止其他用户写入其他用户的注册表部分。1. 允许系统服务注册到注册表的 /services 部分。1. 为注册表的客户端提供读取访问权限。1. 允许将来支持 DNS 1. 允许将来支持注册对用户私有的数据。这允许服务发布绑定凭据(密钥等),以便客户端使用。1. 不需要在 YARN 集群中每个用户的 home 目录上使用 ZK 密钥表。这意味着 YARN 应用程序无法使用 kerberos 凭据。

ZK 安全性使用 ACL 模型,在 Zookeeper 和 SASL 中记录。其中,可以使用不同的身份验证方案来限制对不同 znode 的访问。这允许注册表使用混合 Kerberos + 私有密码模型。

  • 基于 YARN 的注册表(RMRegistryOperationsService)使用 Kerberos 作为 YARN 本身的认证机制。
  • 注册表将注册表基准配置为仅允许自身和其他拥有相关 Kerberos 凭据的 Hadoop 系统帐户进行写入。
  • 树的用户特定部分也配置为允许相同的系统帐户写入和操作该部分树。
  • 用户帐户使用授予其树部分写入权限的 (username,password) 密钥对创建。
  • 密钥对的秘密部分存储在 HDFS 上用户的 home 目录中,使用 Hadoop 凭据 API。
  • 最初,整个注册表树将是全世界可读的。

这种方案有什么限制?

  1. 关键是要对用户特定的注册表密钥对保密。这依赖于文件系统安全性,以确保只有(经过身份验证的)用户才能读取该文件。
  2. 正如 ZK 文档所述,*"身份验证通过以明文发送用户名:密码来完成"
  3. 虽然可以更改帐户的密码,但这涉及递归遍历注册表树,并且将阻止所有正在运行的服务在重新加载密钥之前进行身份验证以进行写入访问。
  4. 一个全世界可读的注册表树正在公开有关集群的信息。这里有一些缓解措施,因为可以通过 IP 地址限制访问。
  5. 还需要将信息从注册表传播到客户端以设置 ACL。

ACL 配置传播

注册表管理器不能依赖于客户端始终设置 ZK 权限。至少,他们不能依赖于客户端应用程序为系统服务的帐户错误地传递无意的值

解决方案:最初,这里使用注册表权限。

自动域扩展

在 Kerberos 域中,Kerberos 客户端可以从本地用户的 Kerberos 凭据(用于与 YARN 或 HDFS 通信)中确定集群的领域。

这可用于为系统帐户自动生成具有正确领域的帐户名称,从而有助于获得有效常量。

这允许注册表支持 hadoop.registry.system.accounts 的默认配置值

  "sasl:yarn@, sasl:mapred@, sasl:hdfs@, sasl:hadoop@";

在注册表中发布核心绑定数据

另一种策略是在注册表的根目录中有一个 ServiceRecord,该记录实际上定义了注册表,包括在 data 字段中列出那些默认绑定值。

审计

某些内容(可能是 RM)可以扫描用户部分的注册表并检测到一些 ACL 问题:IP/world 访问过于宽松,管理员帐户设置错误。它无法查看或修复 ACL 权限,除非它具有 ADMIN 权限,但至少可以检测到这种情况。鉴于 RM 必须在堆栈中进一步向上具有 DELETE 权限,因此它将能够删除树的错误部分,尽管这可能是一种破坏性的过度反应。

进一步阅读