Kerberos是一种基于对称密钥技术的身份认证协议,可以为其他服务提供身份认证功能,且支持SSO(即客户端身份认证后,可以访问多个服务,例如HBase和HDFS)。本文为您介绍Hive如何使用Kerberos。

背景信息

Kerberos协议过程主要有两个阶段,第一个阶段是KDC对Client身份认证,第二个阶段是Service对Client身份认证。Kerberos身份认证原理
  • KDC:Kerberos的服务端程序。
  • Client:需要访问服务的用户(Principal),KDC和Service会对用户的身份进行认证。
  • Service:集成了Kerberos的服务。例如,HDFS、YARN和HBase。
  • 第一阶段:KDC对Client身份认证

    当客户端用户(Principal)访问一个集成了Kerberos的服务之前,需要先通过KDC的身份认证。

    如果身份认证通过,则客户端会获取到一个TGT(Ticket Granting Ticket),后续就可以使用该TGT去访问集成了Kerberos的服务。

  • 第二阶段:Service对Client身份认证

    当用户获取TGT后,就可以继续访问Service服务。

    使用TGT以及需要访问的服务名称(例如HDFS)去KDC获取SGT(Service Granting Ticket),然后使用SGT去访问Service。Service会利用相关信息对Client进行身份认证,认证通过后就可以正常访问Service服务。

前提条件

已创建Hadoop集群,详情请参见创建集群

创建集群时,在软件配置页面的高级设置区域中,打开Kerberos集群模式开关。Kerberos

操作步骤

  1. 创建Principal。
    1. 通过SSH方式连接集群的emr-header-1节点,详情请参见登录集群
    2. 执行如下命令,进入Kerberos的admin工具。
      • EMR-3.30.0及后续版本和EMR-4.5.1及后续版本:
        sh /usr/lib/has-current/bin/admin-local.sh /etc/ecm/has-conf -k /etc/ecm/has-conf/admin.keytab
      • EMR-3.30.0之前版本和EMR-4.5.1之前版本:
        sh /usr/lib/has-current/bin/hadmin-local.sh /etc/ecm/has-conf -k /etc/ecm/has-conf/admin.keytab
    3. 执行如下命令,创建用户名为test的Principal。

      本示例密码设置为123456。

      addprinc -pw 123456 test
      说明 需要记录用户名和密码,在创建TGT时会用到。如果您不想记录用户名和密码,则可以执行下一步,把Principal的用户名和密码导入到keytab文件中。
    4. 可选:执行如下命令,生成keytab文件。
      ktadd -k /root/test.keytab test

      执行quit命令,可以退出Kerberos的admin工具。

  2. 创建TGT。
    创建TGT的机器,可以是任意一台需要运行Hive Client的机器。
    1. 使用root用户执行以下命令,创建test用户。
      useradd test
    2. 执行以下命令,切换为test用户。
      su test
    3. 生成TGT。
      • 方式一:使用用户名和密码方式,创建TGT。
        执行kinit命令,回车后输入test的密码123456。kinit
      • 方式二:使用keytab文件,创建TGT。
        步骤1中的test.keytab文件,已经保存在emr-header-1机器的/root/目录下,需要使用scp命令拷贝到当前机器的/home/test/目录下。
        kinit -kt /home/test/test.keytab test
    4. 查看TGT。
      使用klist命令,如果出现如下信息,则说明TGT创建成功,即可以访问Hive了。
      Ticket cache: FILE:/tmp/krb5cc_1012
      Default principal: test@EMR.23****.COM
      
      Valid starting       Expires              Service principal
      07/24/2021 13:20:44  07/25/2021 13:20:44  krbtgt/EMR.238075.COM@EMR.238075.COM
              renew until 07/25/2021 13:20:44
      注意 需要记录下回显信息EMR.23****.COM中的数字23****,即为cluster_id的值,后面访问Hive时需要。
  3. 访问应用Hive。
    1. 执行以下命令,进入Hive命令行。
      hive
      返回信息如下所示时,表示进入Hive命令行。
      Logging initialized using configuration in file:/etc/ecm/hive-conf-2.3.5-2.0.3/hive-log4j2.properties Async: true
      Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
    2. 执行以下命令,访问Hive。
      /usr/lib/hive-current/bin/beeline -u "jdbc:hive2://emr-header-1:10000/default;principal=hive/emr-header-1@EMR.<cluster_id>.COM"
      代码中的<cluster_id>为查看TGT中获取到的,或者您也可以在EMR控制台的Hive服务的配置页面,在搜索区域,搜索参数hive.server2.authentication.kerberos.principal,参数值中的数字即为<cluster_id>hive_cluster_id

相关文档