系统环境
扩展链接
强大的身份验证和建立用户身份是 Hadoop 安全访问的基础。用户需要能够可靠地 “识别” 自己,然后在整个 Hadoop 集群中传播该身份。完成此操作后,这些用户可以访问资源(例如文件或目录)或与集群交互(如运行 MapReduce 作业)。除了用户之外,Hadoop 集群资源本身(例如主机和服务)需要相互进行身份验证,以避免潜在的恶意系统或守护程序 “冒充” 受信任的集群组件来获取数据访问权限。
Hadoop 使用 Kerberos 作为用户和服务的强身份验证和身份传播的基础。Kerberos 是一种计算机网络认证协议,它允许某实体在非安全网络环境下通信,向另一个实体以一种安全的方式证明自己的身份。 Kerberos 是第三方认证机制,其中用户和服务依赖于第三方(Kerberos 服务器)来对彼此进行身份验证。Kerberos服务器本身称为密钥分发中心或 KDC。在较高的层面上,它有三个部分:
以平时坐火车举例:
(图片来源于网络)
一个用户主要来自AS请求认证。AS 返回 使用用户主体 的 Kerberos密码加密 的 TGT ,该密码仅为用户主体和 AS 所知。用户主体使用其 Kerberos 密码在本地解密TGT,从那时起,直到 ticket 到期,用户主体可以使用 TGT 从 TGS 获取服务票据。服务票证允许委托人访问服务。
Kerberos 简单来说就是一个用于安全认证第三方协议,它采用了传统的共享密钥的方式,实现了在网络环境不一定保证安全的环境下,client 和 server 之间的通信,适用于 client/server 模型,由 MIT 开发和实现。
Kerberos 服务是单点登录系统,这意味着您对于每个会话只需向服务进行一次自我验证,即可自动保护该会话过程中所有后续事务的安全。
由于每次解密 TGT 时群集资源(主机或服务)都无法提供密码,因此它们使用称为 keytab 的特殊文件,该文件包含资源主体的身份验证凭据。
Kerberos 服务器控制的主机,用户和服务集称为领域。
Kerberos 验证分为两个阶段:允许进行后续验证的初始验证以及所有后续验证自身。
下图显示了如何进行初始验证:
客户机收到初始验证后,每个后续验证都按下图所示的模式进行。
joe
要访问已通过要求的 krb5
验证共享的 NFS 文件系统。由于该用户已经通过了验证(即,该用户已经拥有票证授予票证),因此当其尝试访问文件时,NFS 客户机系统将自动透明地从 KDC 获取 NFS 服务的票证。
例如,假定用户 joe
在服务器 boston
上使用 rlogin。由于该用户已经通过了验证(即,该用户已经拥有票证授予票证),所以在运行 rlogin 命令时,该用户将自动透明地获取票证。该用户使用此票证可随时远程登录到 boston
,直到票证到期为止。如果 joe
要远程登录到计算机 denver
,则需要按照步骤 1 获取另一个票证。从这些步骤来看,服务器似乎并未与 KDC 通信。但服务器实际上与 KDC 进行了通信,并向 KDC 注册了其自身,正如第一台客户机所执行的操作。为简单起见,该部分已省略。
关于 Kerberos 更多的原理讲解可参考以下链接,对理解 Kerberos 原理也很有帮助:
在启用Kerberos的环境中进行身份验证的受信任源。
作为密钥分发中心(KDC)的计算机或服务器。
集群中针对KDC进行身份验证的任何计算机。
Ambari用于在KDC中创建主体并生成密钥表的管理帐户。
Kerberos principal(又称为主体)用于在kerberos加密系统中标记一个唯一的身份。主体可以是用户(如joe
)或服务(如namenode
或hive
)。
根据约定,主体名称分为三个部分:主名称、实例和领域。例如,典型的Kerberos主体可以是joe/admin@EXAMPLE.COM
。在本实例中:
joe
是主名称。主名称可以是此处所示的用户名或namenode等服务。admin
是实例。对于用户主体,实例是可选的;但对于服务主体,实例则是必需的。例如,如果用户 joe
有时充当系统管理员,则他可以使用 joe/admin
将其自身与平时的用户身份区分开来。同样,如果 joe
在两台不同的主机上拥有帐户,则他可以使用两个具有不同实例的主体名称,例如 joe/node1.example.com
和 joe/node2.example.com
。请注意,Kerberos 服务会将 joe
和 joe/admin
视为两个完全不同的主体。
对于服务主体,实例是全限定主机名。例如,node1.example.com
就是这种实例。EXAMPLE.COM
是Kerberos领域。领域将在下一小节中介绍。Hadoop中的每个服务和子服务都必须有自己的主体。给定领域中的主体名称由主名称和实例名称组成,在这种情况下,实例名称是运行该服务的主机的FQDN。由于服务未使用密码登录以获取其票证,因此其主体的身份验证凭据存储在keytab
密钥表文件中,该文件从Kerberos数据库中提取并本地存储在服务组件主机上具有服务主体的安全目录中。比如NameNode
组件在node1.example.com
主机上,启用kerberos
之后,会自动生成nn.service.keytab
文件,并存储在/etc/security/keytabs
目录下,用户所有者是hdfs:hadoop
,权限为400
,如图所示:
ambari 和 hadoop service 的 principals 都存储 Kerberos KDC 中,如下图所示:
Principal和Keytab命名约定
惯例 | 示例 | |
---|---|---|
Principals | $service_component_nam/$FQDN@EXAMPLE.COM | nn/node1.example.com@EXAMPLE.COM |
Keytabs | $service_component_abbreviation.service.keytab | /etc/security/keytabs/nn.service.keytab |
一个 DataNode 的受损 Kerberos 凭据不会自动导致所有 DataNode 的 Kerberos 凭据受损。请注意前面的示例中每个服务主体的主名称。这些主要名称(例如 nn 或 hive )分别代表 NameNode 或 Hive 服务。每个主要名称都附加了实例名称,即运行它的主机的 FQDN。此约定为在多个主机(如DataNodes和NodeManager)上运行的服务提供唯一的主体名称。添加主机名用于区分,例如,来自 DataNode A 的请求与来自 DataNode B 的请求。这一点很重要,原因如下:
Ambari Principals
除了 Hadoop 服务主体之外,Ambari 本身还需要一组 Ambari Principal 来执行服务“冒烟”检查,执行警报运行状况检查以及从集群组件检索指标。Ambari Principals 的 Keytab 文件驻留在每个群集主机上,就像服务主体的 keytab 文件一样。
Ambari Principals | 描述 |
---|---|
Smoke and “Headless” Service users | Ambari 用于执行服务“冒烟”检查并运行警报健康检查。 |
Ambari Server user | 为 Kerberos 启用集群时,组件 REST 端点(例如 YARN ATS 组件)需要 SPNEGO 身份验证。Ambari Server 需要访问这些 API 并需要Kerberos主体才能通过 SPNEGO 针对这些 API 进行身份验证。 |
包含 KDC 和许多客户端的 Kerberos 网络,类似于域,俗称为领域。
keytab 是包含 principals 和加密 principal key 的文件。
keytab 文件对于每个 host 是唯一的,因为 key 中包含 hostname 。keytab 文件用于不需要人工交互和保存纯文本密码,实现到 kerberos 上验证一个主机上的 principal 。
因为服务器上可以访问 keytab 文件即可以以 principal 的身份通过 kerberos 的认证,所以,keytab 文件应该被妥善保存,应该只有少数的用户可以访问。
ticket 是一种信息包,用于将用户身份安全地传递到服务器或服务。一个票证仅对一台客户机以及某台特定服务器上的一项特殊服务有效。票证包含以下内容:
所有此类数据都使用服务器的服务密钥进行加密。颁发票证之后,可重用票证直到期为止。
是一种信息包,其中包含票证和匹配的会话密钥。凭证使用发出请求的主体的密钥进行加密。通常,KDC 会生成凭证以响应客户机的票证请求。
是服务器用于验证客户机用户主体的信息。验证者包含用户的主体名称、时间标记和其他数据。与票证不同,验证者只能使用一次,通常在请求访问服务时使用。验证者使用客户机和服务器共享的会话密钥进行加密。通常,客户机会创建验证者,并将其与服务器或服务的票证一同发送,以便向服务器或服务进行验证。
每当主体获取包括票证授予票证 (Ticket–Granting Ticket, TGT) 在内的票证时,可以通过 kinit 的 -l 选项指定的生命周期值,前提是使用 kinit 获取票证。缺省情况下,kinit 使用最长生命周期值。kdc.conf 文件中指定的最长生命周期值 (max_life)。
可通过 kinit 的 -r 选项指定的可更新生命周期值,前提是使用 kinit 获取或更新票证。kdc.conf 文件中指定的最长可更新生命周期值 (max_renewable_life)。
每个票证都使用主体名称进行标识。主体名称可以标识用户或服务。以下是一些主体名称的示例:
主体名称 | 说明 |
---|---|
username@EXAMPLE.COM | 用户的主体 |
username/admin@EXAMPLE.COM | admin 主体,可用于管理 KDC 数据库。 |
K/M@EXAMPLE.COM | 主密钥名称主体。一个主密钥名称主体可与每个主 KDC 关联。 |
krbtgt/EXAMPLE.COM@EXAMPLE.COM | 生成票证授予票证时使用的主体。 |
kadmin/host1.example.com@EXAMPLE.COM | 允许使用 kadmind 访问 KDC 的主 KDC 服务器的主体。 |
ambari-qa-xxx@EXAMPLE.COM | Ambari 用于执行服务“冒烟”检查并运行警报健康检查。 |
HTTP/host1.example.com@EXAMPLE.COM | 用于访问 Hadoop Web UI 时用到的 principal |
所有参与 Kerberos 验证系统的主机都必须在指定的最长时间(称为时钟相位差)内同步其内部时钟。针对这一要求,需要进行另一种 Kerberos 安全检查。如果任意两台参与主机之间的时间偏差超过了时钟相位差,则客户机请求会被拒绝。
时钟相位差的最大缺省值为 300 秒(5 分钟)。出于安全原因,不要将时钟相位差增大到超过 300 秒。
时钟同步设置方法:《Linux时钟同步(修订版)》
较高的Performance
虽然我们一再地说Kerberos是一个涉及到3方的认证过程:Client、Server、KDC。但是一旦Client获得用过访问某个Server的Ticket,该Server就能根据这个Ticket实现对Client的验证,而无须KDC的再次参与。和传统的基于Windows NT 4.0的每个完全依赖Trusted Third Party的NTLM比较,具有较大的性能提升。
实现了双向验证(Mutual Authentication)
传统的NTLM认证基于这样一个前提:Client访问的远程的Service是可信的、无需对于进行验证,所以NTLM不曾提供双向验证的功能。这显然有点理想主义,为此Kerberos弥补了这个不足:Client在访问Server的资源之前,可以要求对Server的身份执行认证。
互操作性(Interoperability)
Kerberos最初由MIT首创,现在已经成为一种被广泛接受的标准。所以对于不同的平台可以进行广泛的互操作。
本篇文章主要从 Kerberos 概述、验证过程的描述、基本概念的解释、Kerberos 注意事项及优缺点的方面来介绍 Kerberos 的。更多的 Kerberos 相关资料,可参考以下链接,建议都点开看看!
扩展链接
参考资料