集群安全模式

概述

BMR从1.0.0版本开始支持创建安全类型的集群,即集群中的开源组件以Kerberos的安全模式启动,在这种安全环境下只有经过认证的客户端才能访问集群中的服务(如HDFS,HIVE 等)。

注:目前BMR版本中支持Kerberos的组件有HDFS、YARN、SPARK、HIVE、HBase。

创建安全集群

在集群创建页面的配置选项下打开安全模式即可,如下所示:

image.png

Kerberos身份认证原理

Kerberos是一种基于对称密钥技术的身份认证协议,它作为一个独立的第三方的身份认证服务,可以为其它服务提供身份认证功能,且支持SSO(即客户端身份认证后,可以访问多个服务如HBase/HDFS等)。

Kerberos协议过程主要有两个阶段,第一个阶段是KDC完成对Client的身份认证,第二个阶段是Service对Client的身份认证。

KDC 对 Client 的身份认证

当客户端用户(principal)访问一个集成了Kerberos的服务之前,首先需要通过KDC(kerberos的服务端程序)的身份认证。客户端用户通过 KDC 服务的身份认证后,会拿到一个TGT凭证(Ticket Granting Ticket,默认时效为24小时),后续访问集成了 kerberos 的服务时会使用该凭证。

Service 对 Client 的身份认证

当客户端用户访问集成 kerberos 的 Service服务时,它会使用TGT以及需要访问的服务名称(如HDFS)去KDC换取TGS(Ticket Granting Service),然后使用TGS去访问Service,Service会利用相关信息对Client进行身份认证,认证通过后便可以正常访问Service服务了。

Kerberos 常用命令指南

管理员登录

登录到管理员账户: 如果在BMR集群节点上,root 账户可以直接通过kadmin.local命令登录。

$ kadmin -p admin/admin    
Password for admin/admin@BAIDU.COM: (BMR集群默认密码为:hadoop)

增删改查账户

在管理员的状态下使用addprinc/delprinc/modprinc/listprincs 命令管理用户。使用?可以列出所有的命令。

# 增加 allen 用户
kadmin: addprinc allen
Enter password for principal "allen@BAIDU.COM":
Re-enter password for principal "allen@BAIDU.COM":
Principal "allen@BAIDU.COM" created.

# 为用户 allen 生成 keytab: 使用xst命令或者ktadd命令
kadmin: ktadd -k /etc/security/keytabs/allen.keytab allen
Entry for principal allen with kvno 2, encryption type aes256-cts-hmac-sha1-96 added to keytab WRFILE:/etc/security/keytabs/allen.keytab.
Entry for principal allen with kvno 2, encryption type aes128-cts-hmac-sha1-96 added to keytab WRFILE:/etc/security/keytabs/allen.keytab.

查看当前认证的用户

$ klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: admin/admin@BAIDU.COM

Valid starting       Expires              Service principal
2018-09-27T12:06:07  2018-09-28T12:06:07  krbtgt/BAIDU.COM@BAIDU.COM

通过 keytab 文件的方式认证用户

kinit -kt /etc/security/keytabs/allen.keytab allen

删除当前认证用户的缓存

kdestroy

BMR安全集群实践

初次使用 KDC 服务时,需要集群管理员登录 master 机器,执行 kadmin.local 命令创建客户端用户的 principal及密码(或者生成 keytab 文件,且注意该文件的属主及访问权限)。

因为 BMR 集群使用的 KDC 类型为 MIT KDC,创建的客户端用户 principal 最好与 UNIX 账户存在一一映射关系(尤其在部署有 Ranger 组件的 BMR 集群中,这源于 BMR 中的 Ranger UserSync 使用的是 UNIX 账户同步机制)。

例如,管理员首先在 BMR 集群各节点中创建 UNIX 用户 allen:

$ useradd allen

然后,管理员新增一个名为 allen/_HOST@BAIDU.COM 的 principal,如下所示:

登录 allen 账户(allen 为 UNIX 账户,如果有向集群YARN队列资源提交作业的需求,在启动安全模式下,还需要保障集群中各个节点已存在该账户,否则提交的 yarn 任务会提示用户不存在而运行失败),执行 kinit 指令获取初始有效凭证 TGT(默认有效期为24h)。

完成 kerberos 认证之后,接下来就可以正常访问集群中的服务了(比如 HDFS、YARN、HIVE等)。