testbook

Kerberos

Kerberos是一种计算机网络认证协议,它允许某实体在非安全网络环境下通信,向另一个实体以一种安全的方式证明自己的身份。

本页内容包括Kerberos的基本描述认证与授权角色权限身份条目配置以及常见问题FAQ。

Kerberos 基本描述


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 应用程序必须以认证用户的身份运行

  • Kerberos 用户命令列表
    用户命令 描述
    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 引入的插件
    Yarn 中各类型 Token 及其作用
    • 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提供的最原始的授权机制,它用于确保只有那些经过授权的客户端才能访问对应的服务。

    Kerberos 角色权限


    验证是确认客户端身份的一个过程,或者说,是用来确保客户端是本人的一个过程。验证是决定被验证的身份是否有权使用特定资源的一个过程。

    Transwarp Data Hub 软件发行版使用基于角色的验证工具,此工具使用基于 LDAP 的组映射功能。

    角色是创建、读取和编辑数据的一系列权限,以及对以下 Transwarp Data Hup 服务的管理权限:

    • HDFS
    • MapReduce
    • Hyperbase
    • Inceptor

    角色可有一个或多个服务的权限。角色被分配给某个 LDAP 组后,此组中的任何用户可获得该角色拥 有的一系列权限。如果用户位于多个 LDAP 组,且每个 LDAP 组被分配了一个角色,则该用户可获得被赋予给这些组的所有角色的权限。而且可以在 LDAP 组中添加或删除用户,轻松实现该用户对 Transwarp Data Hub 服务的访问权限的增加或减少。

    基于角色的验证的启用根据不同的服务而定。一旦启用,用户必须有一个拥有合适权限的角色,用于执行服务有关的所有读/写操作。角色可以有多个服务的权限。以下章节描述了每个服务的权限。

  • Kerberos 角色的HDFS权限
    权限描述
    HDFS 文件访问

    能在 HDFS 文件系统读取、编辑和创建文件。这一权限不会取代已有的 HDFS 文件权限,因此如果用户或用户所在的组不能读取或写入该文件,则 HDFS 文件访问权限不能授予该文件的读/写访问权限。

    如果 HDFS 已启用基于角色的验证,则用户必须具备拥有这一权限的角色,或具备访问一个或多个服务的权限,比如 MapReduce。

    注释: 如果表中的任何其他权限被分配给某个角色,则表示该角色给了用户在 HDFS文件系统上创建、编辑文件的权限,即使 HDFS 文件访问权限并没有授予给该角色。

    设置访问控制列表

    授予写、读和执行权限给用户定义的文件或文件夹列表。访问这些指定的文件权限将取代已有的 HDFS 文件权限, 因此如果文件系统权限之间存在冲突,,则访问这些指定的文件权限将被优先应用。

    比如,如果访问这些指定的文件权限授予用户对文件 /user/root/a.txt 的 jdoe 读权限,则 jdoe 能读取该文件,即使该文件所有者为其他用户且文件权限为 600。

    访问这些指定的文件权限允许用户在 HDFS 文件系统上读取、编辑和创建那些未被列入用户定义的文件和文件夹列表上的文件。

    管理 HDFS 系统, 成为 DFSAdmin 能执行 dfsadmin 命令。这一权限不允许用户执行 dfsadmin 子命令,比如 report,这需要超级用户的权限。
  • Kerberos 角色的MapReduce权限
    权限 描述
    提交作业到指定的队列

    能提交作业到用户定义的 MapReduce 队列列表中。如果队列不在列表中,则角色不被授予提交作业到队列的权限。

    如果 MapReduce 已启用基于角色的验证,则用户不能提交作业到队列中,除非用户具备某个带此权限的角色。

    管理指定队列中的作业

    某个用户和组能执行以下 MapReduce 队列中用户定义的列表上的作业有关操作。

    • 中断一个作业
    • 中断一个作业的任务
    • 取消一个作业的任务
    • 设置作业的优先级

    无论基于角色的验证如何设置,作业的所有者可能需要经常执行以上操作。

    管理 MapReduce,成为 MRadmin 能执行 mradmin 命令。这一权限不允许用户执行 mradmin 子命令,这需要超级用户的权限。
  • Kerberos 角色的Hyperbase权限
    权限 描述
    读取表格

    能读取用户定义列表中的一个或多个表中的所有列族。

    这一权限仅允许用户或组查看列表中的列族。如果表不在列表中,则此权限不允许用户或组在该表中读取表的列族。

    写入表格

    能编辑或插入用户定义列表中的一个或多个表中的所有列族。此权限不允许用户或组在表中创建列族。

    权限仅允许用户或组编辑列表中的列族。如果表不在列表中,则此权限不允许用户或组编辑表的列族。

    读取列族

    能读取用户定义列表中的一个或多个表中的所有列族。

    这一权限仅允许用户或组查看列表中的列族。如果表或列族不在列表中,则这一权限不允许用户或组读取列族。

    读取表格权限高于读取列族权限。如果用户和组被分配了具有读取表格权限的角色,则该用户或组可读取表中的所有列族,无论读取列族权限如何。

    写入列族

    能编辑或插入数据到用户定义列表中的一个或多个列族。此权限不允许用户或组在表中创建列族。

    这一权限仅允许用户或组编辑或插入数据到列表中的列族。如果列族不在列表中,则这一权限不允许用户或组编辑或插入数据到列族。

    写入表格权限高于写入列族权限。如果用户和组被分配了具有写入表格权限的角色,则该用户或组可插入或编辑表中的所有列族的数据,无论写入列族权限如何。

    管理维护

    用户或组能对用户定义列表中的表进行一下操作

    • 修改表属性
    • 添加、修改或删除列族。
    • 启用、禁用或删除表。
    • 触发 region (re)assignments 或 relocation。

    用户定义列表中应仅包含表。列表中不能包含任何列族。

    创建列族

    允许用户或组在用户定义列表的表中创建列族。

    此权限允许用户或组创建列表中的列族。如果表不在列表中,则此权限不允许用户或组在该表中创建列族。

    如果 HBase 已启用基于角色的验证,则用户不能在表中创建列族,除非用户有带此权限的角色,或者用户属于某个带此权限的角色的组。

    超级用户

    允许用户或组创建表并将 balancer 打开或关闭。同时,允许读取/写入数据库中的所有表和列族。

  • Kerberos 角色的Inceptor权限

    权限描述

    查看数据库

    允许用户或组查看 Inceptor 中的所有数据库。

    创建数据库

    允许用户或组在 Inceptor 环境中创建数据库。此权限不允许用户或组创建或编辑数据库中的表。

    如果 Inceptor 已启用基于角色的验证,则用户不能创建数据库,除非用户有带此权限的角色,或者用户属于某个带此权限的角色的组。

    在数据库中创建表

    允许用户或组在用户定义列表中的数据库中创建表。

    这些允许用户创建表的数据库是基于用户定义的列表的。如果数据库不在列表中,权限将不允许用户或组在数据库中创建表。

    如果 Inceptor 已启用基于角色的验证,则用户不能创建数据库中的表,除非用户有带此权限的角色,或者用户属于某个带此权限的角色的组。

    更新数据库中的数据

    允许用户或组在用户定义列表中的数据库中编辑表。

    这些允许用户编辑的数据库的表是基于用户定义的列表的。如果数据库不在列表中,权限将不允许用户或组在数据库中编辑任何表。

    修改数据库的结构

    允许用户或组在用户定义列表的数据库中修改结构。

    这些允许用户修改的结构是基于用户定义的列表的。权限将允许用户或组在数据库中任何地方修改结构,包括数据库的表。

    此权限允许用户或组在列表中的数据库中修改结构。如果数据库不在列表中,则此权限不允许用户或组在该数据库或表中修改结构。

    删除数据库

    允许用户或组删除用户定义列表中的数据库。

    这些允许用户删除的数据库是基于用户定义的列表的。此权限允许用户或组在用户定义列表中的数据库中删除任何表。

    此权限允许用户或组删除列表中的数据库。如果数据库不在列表中,则此权限不允许用户或组删除数据库。

    选择数据库

    允许用户或组选择用户定义列表中的已删除数据库。

    这些允许用户选择的数据库是基于用户定义的列表的。此权限允许用户或组在用户定义列表中的数据库中选择任何表。

    此权限允许用户或组选择列表中的数据库。如果数据库不在列表中,则此权限不允许用户或组选择数据库。

    创建表中的分区

    允许用户或组在用户定义列表的表中创建分区。

    这些允许用户创建分区的表是基于用户定义的列表的。如果表不在列表中,权限将不允许用户或组在表中创建分区。

    如果 Inceptor 已启用基于角色的验证,则用户不能在表中创建分区,除非用户有带此权限的角色,或者用户属于某个带此权限的角色的组。

    更新表中的数据

    允许用户或组在用户定义列表的表中编辑数据。

    这些允许用户编辑的表是基于用户定义的列表的。如果表不在列表中,权限将不允许用户或组在表中编辑数据。

    更新数据库中的数据权限高于更新表中的数据权限。如果用户和组被分配了具有更新数据库中的数据权限的角色,则该用户或组可更新数据库表中的所有数据,无论更新表中的数据权限如何。

    修改表的结构

    允许用户或组在用户定义列表的表中编辑结构。

    这些允许用户编辑的表的结构是基于用户定义的列表的。如果表不在列表中,权限将不允许用户或组修改表的结构。

    修改数据库的结构权限高于修改表的结构权限。如果用户或组被分配了具有修改数据库的结构权限的角色,则该用户或组可修改数据库表中的所有结构,无论修改表的结构权限如何。

    删除表

    允许用户或组删除用户定义列表中的表。

    这些允许用户删除的表是基于用户定义的列表的。此权限允许用户或组删除列表中的表。如果表不在列表中,则此权限不允许用户或组删除表。

    删除数据库权限高于删除表权限。如果用户或组被分配了具有删除数据库权限的角色,则该用户或组可删除数据库中的表,无论删除表权限如何。

    查看表

    允许用户或组查看用户定义列表中的已删除表。

    这些允许用户查看的表是基于用户定义的列表的。此权限允许用户或组查看列表中的表。如果表不在列表中,则此权限不允许用户或组查看表。

    查询数据库权限高于查看表权限。如果用户或组被分配了具有查询数据库权限的角色,则该用户或组可选择数据库中的表,无论查看表权限如何。

    Kerberos 用户条目配置


    对于运行在安全模式下的 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)

    Kerberos 常见问题


    客户端访问失败并显示错误信息 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 &ltkeytab_file&gt &ltprincipal_name&gt@&ltrealm&gt

    客户端访问失败并显示错误信息 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 &ltkeytab_file&gt &ltprincipal_name&gt@&ltrealm&gt 

    2. 执行以下命令,生成 JRE 可读取的票据缓存格式。

    kinit -R