Kerberos是一种计算机网络认证协议,它允许某实体在非安全网络环境下通信,向另一个实体以一种安全的方式证明自己的身份。
本页内容包括Kerberos的基本描述,认证与授权,角色权限,身份条目配置以及常见问题FAQ。
Kerberos 服务是一种通过网络提供安全事务处理的客户机/服务器体系结构。该服务可提供功能强大的用户验证以及完整性和保密性。通过验证,可保证网络事务的发送者和接收者的身份真实。该服务还可以检验来回传递的数据的有效性(完整性),并在传输过程中对数据进行加密(保密性)。使用 Kerberos 服务,可以安全登录到其他计算机、执行命令、交换数据以及传输文件。此外,该服务还提供授权服务,这样,管理员便可限制对服务和计算机的访问。而且,作为 Kerberos 用户,用户还可以控制其他用户对其帐户的访问。
在 Transwarp Data Hub 集群中,Kerberos 认证通过以下方式被应用:
可信任服务 — Transwarp Data Hub daemon 在被授予 Kerberos 化服务前必须通过 Kerberos 认证。 Kerberos 化服务包括 HDFS、MapReduce、Hyperbase 和 Inceptor。
比如,如果有一个包含 10 个节点的集群,其中 Primary NameNode 服务运行在 node1 上, DataNode 服务运行在 node5 上,则该 DataNode 服务在被允许和 Primary NameNode 服务通信 前,必须通过 Kerberos 认证。
可信任客户端 — 用户 (包括人或系统)在集群上使用 Kerberos 化服务前必须通过 Kerberos 认证。不像其他简单认证,用户的 UID 不用来认证用户。而是将用户的 Kerberos 身份条目的基 本组件作为用户名来认证。
比如,如果 Unix 用户 jdoe 需要运行 MapReduce 程序,则在程序被允许运行前,该用户需要通 过 Kerberos 认证。而且,MapReduce 应用程序必须以认证用户的身份运行
| 用户命令 | 描述 |
| kadmin | 远程 Kerberos 数据库管理程序(运行时需要进行 Kerberos 验证),用于管理主体、策略和密钥表文件 |
| kadmin.local | 本地 Kerberos 数据库管理程序(运行时无需进行 Kerberos 验证,并且必须在主 KDC 上运行),用于管理主体、策略和密钥表文件 |
| ksu | Kerberos 版本的 su 程序 |
| kproplog | 列出更新日志中更新项的摘要 |
| kadmind | Kerberos 数据库管理的网络守护程序 |
| kdb_init | 初始化 Kerberos 密钥分发中心数据库 |
| kprop | Kerberos 数据库传播程序 |
| ktutil | Kerberos 密钥分发中心数据库实用程序 |
| kdb5_util | 管理 Kerberos 密钥表文件 |
| kdestroy | 销毁 Kerberos 票券 |
| kinit | 获取并缓存 Kerberos 票证授予票证 |
| klist | 显示当前的 Kerberos 票证 |
| kpasswd | 更改 Kerberos 口令 |
用户命令详细使用方法,请参阅 MIT Kerberos User commands。
一般而言,系统安全机制由认证(authentication)和授权(authorization)两大部分构成。认证就是简单地对一个实体的身份进行判断;而授权则是向实体授予对数据资源和信息访问权限的决策过程。
在安全模式下,根据用户的 Kerberos 身份条目进行验证。集群使用访问控制列表 (ACL)来执行服务级别的验证。访问控制列表是一个允许对 Transwarp Data Hub 服务执行特定操作的用户和组的列表。用户被验证后,Transwarp Data Hub 会检查用户是否被列在访问控制列表,或是否属于列在访问控制列表的某个组。如果二者之一符合,则用户将被授权执行访问控制列表控制的操作。
在 Transwarp Data Hub 中,Client 与 NameNode 以及 Client 与 ResourceManager 之间首次通信均采用了 Kerberos 进行身份认证,之后便换用 Delegation Token 以减小开销,而 DataNode 与 NameNode 以及 NodeManager 与 ResourceManager 之间的认证始终采用 Kerberos 认证机制。
Delegation Token 的定义在 org.apache.hadoop.security.token.Token 中,每个 Token 包含一个唯一的 TokenIdentifier 标识符,Token主要由下表列出的几个字段组成。
| identifier | byte[] | TokenIdentifier 标识信息的序列化形式 |
| password | byte[] | TokenIdentifier 密码的序列化形式 |
| kind | String | TokenIdentifier 的类型 |
| service | String | TokenIdentifier 所应用的服务 |
| TokenRenewer | renewer | 由这种类型的 TokenIdentifier 的 ServiceLoader 引入的插件 |
ResourceManager Delegation Token
ResourceManager Delegation Token 是 ResourceManager 授权令牌,持有该令牌的应用程序及其发起的任务可以安全地与 ResourceManager 交互。
YARN Application Token
Application Token 用于保证 ApplicationMaster 与 ResourceManager 之间的通信安全。
YARN NodeManager Token
ApplicationMaster 与 NodeManager 通信时,需出示 NodeManager Token 以表明 ApplicationMaster 自身的合法性。
YARN Container Token
ApplicationMaster 与 NodeManager 通信启动 Container 时,需出示 Container Token 以表明 Container 的合法性。
YARN Localizer Token
Localizer Token 用于保证 ContainerLocalizer 与 NodeManager 之间的通信安全。
MapReduce Client Token
MapReduce Client Token 用于保证 MapReduce JobClient 与 MapReduce Application Master 之间的通信安全。
MapReduce Job Token
MapReduce Job Token 用于保证 MapReduce 的各个 Task(包括 Map Task 和 Reduce Task)与 MapReduce Application Master 之间的通信安全。
MapReduce Shuffle Secret
MapReduce Shuffle Secret 用于保证运行在各个 NodeManager 上的 ShuffleHandler(内部封装了一个 Netty Server)与 Reduce Task 之间的通信安全。
Hadoop YARN的授权机制是通过访问控制列表(ACL)实现的,按照授权实体,可分为队列访问控制列表、应用程序访问控制列表和服务访问控制列表。
队列访问控制列表
为了方便管理集群中的用户,YARN 将用户/用户组分成若干队列,并可指定每个用户/用户组所属的队列。通常而言,每个队列包含两种权限:提交应用程序权限和管理应用程序权限。
应用程序访问控制列表
应用程序访问控制机制的设置方法是在客户端设置为每类 ApplicationAccessType 设置对应的用户列表,这些信息传递到 ResourceManager 端后,由它维护和使用。
服务访问控制列表
服务访问控制是Hadoop提供的最原始的授权机制,它用于确保只有那些经过授权的客户端才能访问对应的服务。
验证是确认客户端身份的一个过程,或者说,是用来确保客户端是本人的一个过程。验证是决定被验证的身份是否有权使用特定资源的一个过程。
Transwarp Data Hub 软件发行版使用基于角色的验证工具,此工具使用基于 LDAP 的组映射功能。
角色是创建、读取和编辑数据的一系列权限,以及对以下 Transwarp Data Hup 服务的管理权限:
角色可有一个或多个服务的权限。角色被分配给某个 LDAP 组后,此组中的任何用户可获得该角色拥 有的一系列权限。如果用户位于多个 LDAP 组,且每个 LDAP 组被分配了一个角色,则该用户可获得被赋予给这些组的所有角色的权限。而且可以在 LDAP 组中添加或删除用户,轻松实现该用户对 Transwarp Data Hub 服务的访问权限的增加或减少。
基于角色的验证的启用根据不同的服务而定。一旦启用,用户必须有一个拥有合适权限的角色,用于执行服务有关的所有读/写操作。角色可以有多个服务的权限。以下章节描述了每个服务的权限。
| 权限 | 描述 |
| HDFS 文件访问 | 能在 HDFS 文件系统读取、编辑和创建文件。这一权限不会取代已有的 HDFS 文件权限,因此如果用户或用户所在的组不能读取或写入该文件,则 HDFS 文件访问权限不能授予该文件的读/写访问权限。 如果 HDFS 已启用基于角色的验证,则用户必须具备拥有这一权限的角色,或具备访问一个或多个服务的权限,比如 MapReduce。 注释: 如果表中的任何其他权限被分配给某个角色,则表示该角色给了用户在 HDFS文件系统上创建、编辑文件的权限,即使 HDFS 文件访问权限并没有授予给该角色。 |
| 设置访问控制列表 | 授予写、读和执行权限给用户定义的文件或文件夹列表。访问这些指定的文件权限将取代已有的 HDFS 文件权限, 因此如果文件系统权限之间存在冲突,,则访问这些指定的文件权限将被优先应用。 比如,如果访问这些指定的文件权限授予用户对文件 /user/root/a.txt 的 jdoe 读权限,则 jdoe 能读取该文件,即使该文件所有者为其他用户且文件权限为 600。 访问这些指定的文件权限允许用户在 HDFS 文件系统上读取、编辑和创建那些未被列入用户定义的文件和文件夹列表上的文件。 |
| 管理 HDFS 系统, 成为 DFSAdmin | 能执行 dfsadmin 命令。这一权限不允许用户执行 dfsadmin 子命令,比如 report,这需要超级用户的权限。 |
| 权限 | 描述 |
| 提交作业到指定的队列 | 能提交作业到用户定义的 MapReduce 队列列表中。如果队列不在列表中,则角色不被授予提交作业到队列的权限。 如果 MapReduce 已启用基于角色的验证,则用户不能提交作业到队列中,除非用户具备某个带此权限的角色。 |
| 管理指定队列中的作业 | 某个用户和组能执行以下 MapReduce 队列中用户定义的列表上的作业有关操作。
无论基于角色的验证如何设置,作业的所有者可能需要经常执行以上操作。 |
| 管理 MapReduce,成为 MRadmin | 能执行 mradmin 命令。这一权限不允许用户执行 mradmin 子命令,这需要超级用户的权限。 |
| 权限 | 描述 |
| 读取表格 | 能读取用户定义列表中的一个或多个表中的所有列族。 这一权限仅允许用户或组查看列表中的列族。如果表不在列表中,则此权限不允许用户或组在该表中读取表的列族。 |
| 写入表格 | 能编辑或插入用户定义列表中的一个或多个表中的所有列族。此权限不允许用户或组在表中创建列族。 权限仅允许用户或组编辑列表中的列族。如果表不在列表中,则此权限不允许用户或组编辑表的列族。 |
| 读取列族 | 能读取用户定义列表中的一个或多个表中的所有列族。 这一权限仅允许用户或组查看列表中的列族。如果表或列族不在列表中,则这一权限不允许用户或组读取列族。 读取表格权限高于读取列族权限。如果用户和组被分配了具有读取表格权限的角色,则该用户或组可读取表中的所有列族,无论读取列族权限如何。 |
| 写入列族 | 能编辑或插入数据到用户定义列表中的一个或多个列族。此权限不允许用户或组在表中创建列族。 这一权限仅允许用户或组编辑或插入数据到列表中的列族。如果列族不在列表中,则这一权限不允许用户或组编辑或插入数据到列族。 写入表格权限高于写入列族权限。如果用户和组被分配了具有写入表格权限的角色,则该用户或组可插入或编辑表中的所有列族的数据,无论写入列族权限如何。 |
| 管理维护 | 用户或组能对用户定义列表中的表进行一下操作
用户定义列表中应仅包含表。列表中不能包含任何列族。 |
| 创建列族 | 允许用户或组在用户定义列表的表中创建列族。 此权限允许用户或组创建列表中的列族。如果表不在列表中,则此权限不允许用户或组在该表中创建列族。 如果 HBase 已启用基于角色的验证,则用户不能在表中创建列族,除非用户有带此权限的角色,或者用户属于某个带此权限的角色的组。 |
| 超级用户 | 允许用户或组创建表并将 balancer 打开或关闭。同时,允许读取/写入数据库中的所有表和列族。 |
权限描述
查看数据库
允许用户或组查看 Inceptor 中的所有数据库。
创建数据库
允许用户或组在 Inceptor 环境中创建数据库。此权限不允许用户或组创建或编辑数据库中的表。
如果 Inceptor 已启用基于角色的验证,则用户不能创建数据库,除非用户有带此权限的角色,或者用户属于某个带此权限的角色的组。
在数据库中创建表允许用户或组在用户定义列表中的数据库中创建表。
这些允许用户创建表的数据库是基于用户定义的列表的。如果数据库不在列表中,权限将不允许用户或组在数据库中创建表。
如果 Inceptor 已启用基于角色的验证,则用户不能创建数据库中的表,除非用户有带此权限的角色,或者用户属于某个带此权限的角色的组。
更新数据库中的数据允许用户或组在用户定义列表中的数据库中编辑表。
这些允许用户编辑的数据库的表是基于用户定义的列表的。如果数据库不在列表中,权限将不允许用户或组在数据库中编辑任何表。
修改数据库的结构允许用户或组在用户定义列表的数据库中修改结构。
这些允许用户修改的结构是基于用户定义的列表的。权限将允许用户或组在数据库中任何地方修改结构,包括数据库的表。
此权限允许用户或组在列表中的数据库中修改结构。如果数据库不在列表中,则此权限不允许用户或组在该数据库或表中修改结构。
删除数据库
允许用户或组删除用户定义列表中的数据库。
这些允许用户删除的数据库是基于用户定义的列表的。此权限允许用户或组在用户定义列表中的数据库中删除任何表。
此权限允许用户或组删除列表中的数据库。如果数据库不在列表中,则此权限不允许用户或组删除数据库。
选择数据库允许用户或组选择用户定义列表中的已删除数据库。
这些允许用户选择的数据库是基于用户定义的列表的。此权限允许用户或组在用户定义列表中的数据库中选择任何表。
此权限允许用户或组选择列表中的数据库。如果数据库不在列表中,则此权限不允许用户或组选择数据库。
创建表中的分区允许用户或组在用户定义列表的表中创建分区。
这些允许用户创建分区的表是基于用户定义的列表的。如果表不在列表中,权限将不允许用户或组在表中创建分区。
如果 Inceptor 已启用基于角色的验证,则用户不能在表中创建分区,除非用户有带此权限的角色,或者用户属于某个带此权限的角色的组。
更新表中的数据允许用户或组在用户定义列表的表中编辑数据。
这些允许用户编辑的表是基于用户定义的列表的。如果表不在列表中,权限将不允许用户或组在表中编辑数据。
更新数据库中的数据权限高于更新表中的数据权限。如果用户和组被分配了具有更新数据库中的数据权限的角色,则该用户或组可更新数据库表中的所有数据,无论更新表中的数据权限如何。
修改表的结构允许用户或组在用户定义列表的表中编辑结构。
这些允许用户编辑的表的结构是基于用户定义的列表的。如果表不在列表中,权限将不允许用户或组修改表的结构。
修改数据库的结构权限高于修改表的结构权限。如果用户或组被分配了具有修改数据库的结构权限的角色,则该用户或组可修改数据库表中的所有结构,无论修改表的结构权限如何。
删除表允许用户或组删除用户定义列表中的表。
这些允许用户删除的表是基于用户定义的列表的。此权限允许用户或组删除列表中的表。如果表不在列表中,则此权限不允许用户或组删除表。
删除数据库权限高于删除表权限。如果用户或组被分配了具有删除数据库权限的角色,则该用户或组可删除数据库中的表,无论删除表权限如何。
查看表允许用户或组查看用户定义列表中的已删除表。
这些允许用户查看的表是基于用户定义的列表的。此权限允许用户或组查看列表中的表。如果表不在列表中,则此权限不允许用户或组查看表。
查询数据库权限高于查看表权限。如果用户或组被分配了具有查询数据库权限的角色,则该用户或组可选择数据库中的表,无论查看表权限如何。
对于运行在安全模式下的 Transwarp Data Hub 服务,Kerberos Kerberos 身份条目是必须的,每个服务会读取保存在 keytab 的自己的权限认证和权限信息完成验证和授权。
以下列出了各个服务keytab的身份条目配置例子
HDFS
NameNode 的 keytab 文件,保持在 NameNode 节点上,应该有如下类似的条目:
$ klist -e -k -t /etc/security/keytab/nn.service.keytab
Keytab name: FILE:/etc/security/keytab/nn.service.keytab
KVNO Timestamp Principal
4 10/17/14 21:08:09 nn/[email protected] (AES-256 CTS mode with 96-bit SHA-1 HMAC)
4 10/17/14 21:08:09 nn/[email protected] (AES-128 CTS mode with 96-bit SHA-1 HMAC)
4 10/17/14 21:08:09 nn/[email protected] (ArcFour with HMAC/md5)
4 10/17/14 21:08:09 host/[email protected] (AES-256 CTS mode with 96-bit SHA-1 HMAC)
4 10/17/14 21:08:09 host/[email protected] (AES-128 CTS mode with 96-bit SHA-1 HMAC)
4 10/17/14 21:08:09 host/[email protected] (ArcFour with HMAC/md5)
Secondary NameNode 的 keytab 文件,保持在 Secondary NameNode 节点上,应该有如下类似的条目:
$ klist -e -k -t /etc/security/keytab/sn.service.keytab
Keytab name: FILE:/etc/security/keytab/sn.service.keytab
KVNO Timestamp Principal
4 10/17/14 21:08:09 sn/[email protected] (AES-256 CTS mode with 96-bit SHA-1 HMAC)
4 10/17/14 21:08:09 sn/[email protected] (AES-128 CTS mode with 96-bit SHA-1 HMAC)
4 10/17/14 21:08:09 sn/[email protected] (ArcFour with HMAC/md5)
4 10/17/14 21:08:09 host/[email protected] (AES-256 CTS mode with 96-bit SHA-1 HMAC)
4 10/17/14 21:08:09 host/[email protected] (AES-128 CTS mode with 96-bit SHA-1 HMAC)
4 10/17/14 21:08:09 host/[email protected] (ArcFour with HMAC/md5)
DataNode 的 keytab 文件,保持在每个 DataNode 节点上,应该有如下类似的条目:
$ klist -e -k -t /etc/security/keytab/dn.service.keytab
Keytab name: FILE:/etc/security/keytab/dn.service.keytab
KVNO Timestamp Principal
4 10/17/14 21:08:09 dn/[email protected] (AES-256 CTS mode with 96-bit SHA-1 HMAC)
4 10/17/14 21:08:09 dn/[email protected] (AES-128 CTS mode with 96-bit SHA-1 HMAC)
4 10/17/14 21:08:09 dn/[email protected] (ArcFour with HMAC/md5)
4 10/17/14 21:08:09 host/[email protected] (AES-256 CTS mode with 96-bit SHA-1 HMAC)
4 10/17/14 21:08:09 host/[email protected] (AES-128 CTS mode with 96-bit SHA-1 HMAC)
4 10/17/14 21:08:09 host/[email protected] (ArcFour with HMAC/md5)
YARN
ResourceManager 的 keytab 文件,保持在 ResourceManager 节点上,应该有如下类似的条目:
$ klist -e -k -t /etc/security/keytab/rm.service.keytab
Keytab name: FILE:/etc/security/keytab/rm.service.keytab
KVNO Timestamp Principal
4 10/17/14 21:08:09 rm/[email protected] (AES-256 CTS mode with 96-bit SHA-1 HMAC)
4 10/17/14 21:08:09 rm/[email protected] (AES-128 CTS mode with 96-bit SHA-1 HMAC)
4 10/17/14 21:08:09 rm/[email protected] (ArcFour with HMAC/md5)
4 10/17/14 21:08:09 host/[email protected] (AES-256 CTS mode with 96-bit SHA-1 HMAC)
4 10/17/14 21:08:09 host/[email protected] (AES-128 CTS mode with 96-bit SHA-1 HMAC)
4 10/17/14 21:08:09 host/[email protected] (ArcFour with HMAC/md5)
NodeManager 的 keytab 文件,保持在每个 NodeManager 节点上,应该有如下类似的条目:
$ klist -e -k -t /etc/security/keytab/nm.service.keytab
Keytab name: FILE:/etc/security/keytab/nm.service.keytab
KVNO Timestamp Principal
4 10/17/14 21:08:09 nm/[email protected] (AES-256 CTS mode with 96-bit SHA-1 HMAC)
4 10/17/14 21:08:09 nm/[email protected] (AES-128 CTS mode with 96-bit SHA-1 HMAC)
4 10/17/14 21:08:09 nm/[email protected] (ArcFour with HMAC/md5)
4 10/17/14 21:08:09 host/[email protected] (AES-256 CTS mode with 96-bit SHA-1 HMAC)
4 10/17/14 21:08:09 host/[email protected] (AES-128 CTS mode with 96-bit SHA-1 HMAC)
4 10/17/14 21:08:09 host/[email protected] (ArcFour with HMAC/md5)
MapReduce JobHistory Server
MapReduce JobHistory Server 的 keytab 文件,保持在 MapReduce JobHistory Server 节点上,应该有如下类似的条目:
$ klist -e -k -t /etc/security/keytab/jhs.service.keytab
Keytab name: FILE:/etc/security/keytab/jhs.service.keytab
KVNO Timestamp Principal
4 10/17/14 21:08:09 jhs/[email protected] (AES-256 CTS mode with 96-bit SHA-1 HMAC)
4 10/17/14 21:08:09 jhs/[email protected] (AES-128 CTS mode with 96-bit SHA-1 HMAC)
4 10/17/14 21:08:09 jhs/[email protected] (ArcFour with HMAC/md5)
4 10/17/14 21:08:09 host/[email protected] (AES-256 CTS mode with 96-bit SHA-1 HMAC)
4 10/17/14 21:08:09 host/[email protected] (AES-128 CTS mode with 96-bit SHA-1 HMAC)
4 10/17/14 21:08:09 host/[email protected] (ArcFour with HMAC/md5)
客户端访问失败并显示错误信息 SASL authentication failed
安全模式被启用后,当客户端尝试访问某个服务,比如 HDFS 或 MapReduce 时,以下错误信息可能显示:
ERROR: java.lang.RuntimeException:SASL authentication failed.The most likely cause is missing or invalid credentials.Consider 'kinit'.
要和 Hadoop 集群中的服务通信,用户必须具备有效的 Kerberos 票据。如果用户不具备有效的 Kerberos 票据,你将看到认证失败。 要解决这一问题,用户需要生成正确凭据和票据的密钥表文件。要做到这一点,用户需要执行以下 命令:
kinit -k -t <keytab_file> <principal_name>@<realm>
客户端访问失败并显示错误信息 GSS initiate Failed
在 Kerberos 版本 1.81 或更高版本中,当用户尝试和 Transwarp Data Hub 集群在安全模式下通信时,以下出错信息可能会在 Kerberos 认证时出现
java.io.IOException: javax.security.sasl.SaslException:GSS initiate failed
出错的原因在于版本 1.8.1 中 Kerberos 票据缓存的创建。Jave 6 Update 26 或更低版本读取票据缓存失败。
要解决这一问题,执行以下步骤。
1. 对用户生成具有正确的凭据和票据的密钥表文件。要做到这一点,用户需要执行以下命令:
kinit -k -t <keytab_file> <principal_name>@<realm>
2. 执行以下命令,生成 JRE 可读取的票据缓存格式。
kinit -R