0552-5.15.0-同一OS用户下不同Kerberos用户执行脚本Principal串掉问题分析

  • 2019 年 11 月 28 日
  • 筆記

温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。

Fayson的github: https://github.com/fayson/cdhproject

提示:代码块部分可以左右滑动查看噢

1

文档编写目的

在集群启用Kerberos后,使用同一个OS用户在客户端并发调度Python代码获取Hive数据(代码中使用不同的kerberos用户kinit),会出现两个作业的认证混乱获取到的票据串掉。本文Fayson主要分析Kerberos环境同一OS用户下并发执行不同身份认证的Python代码会导致Principal串掉问题解决。

  • 测试环境

1.CDH5.15.0

2.Redhat7.3

3.集群已启用Kerberos

2

问题描述

Fayson通过一段简单的示例代码说明问题,在代码中执行kinit命令初始化Kerberos信息,通过impyla包访问Hive,具体代码如下:

from impala.dbapi import connect  import os  os.system('kinit -k -t /data/disk1/pythonkb/hbase.keytab hbase/cdh04.fayson.net')  os.system('klist')    conn = connect(host='cdh02.fayson.net',port=10000,database='default',auth_mechanism='GSSAPI',kerberos_service_name='hive')  print(conn)    cursor = conn.cursor()  cursor.execute('show databases')  print (cursor.description)  # prints the result set's schema  results = cursor.fetchall()  print(results)

在同一个用户的OS下创建test_hbase.py和test_yarn.py的两个Python脚本,分别使用hbase和yarn用户初始化Kerberos信息。

在crontab中添加两个定时任务,使两个任务同时并发

在生成的testhbase.log和testyarn.log中可以看到两个脚本会获取到对方的Principal信息

3

问题分析

1.首先在客户端进行Kinit操作后,默认的Ticket Cache是存储在tmp/krb5cc_0临时文件中(Ticket cache文件是根据当前用户的uid在/tmp目录下生成一个以krb5cc_开头的临时文件)。

2.由于上述的两个脚本是在同一个OS用户下,所以两个不同的Kerberos用户在进行Kinit操作后都会覆盖/tmp/krb5cc_{uid}文件

根据上述两点基本可以定位问题的原因,因为Ticket cache文件被覆盖导致Kerberos的票据信息串掉。

4

问题解决

由于两个Python脚本使用了同一份Ticket cache文件导致Kerberos的票据信息串掉,那通过在代码中指定Ticket cache文件,而不使用默认的文件。Fayson对上述代码做了如下改动,在代码中增加了OS环境变量KRB5CCNAME的设置,具体代码如下:

from impala.dbapi import connect  import os  os.environ['KRB5CCNAME']='/tmp/krb5_ccname_hbase'  os.system('kinit -k -t /data/disk1/pythonkb/hbase.keytab hbase/cdh04.fayson.net')  os.system('klist')    conn = connect(host='cdh02.fayson.net',port=10000,database='default',auth_mechanism='GSSAPI',kerberos_service_name='hive')  print(conn)    cursor = conn.cursor()  cursor.execute('show databases')  print (cursor.description)  # prints the result set's schema  results = cursor.fetchall()  print(results)

通过修改上述两个脚本,在两个脚本中都指定KRB5CCNAME环境变量为不同的文件,再次进行测试未发现两个应用的票据信息串掉的问题。

5

总结

1.默认Ticket cache文件的生成是根据用户的uid在/tmp目录下生成一个以krb5cc_开头的缓存文件。

2.如果在同一个OS用户下使用不同的Kerberos用户进行kinit会覆盖/tmp/krb5cc_{uid}文件,从而导致应用中的票据信息串掉。

3.可以通过在应用中为不同的Kerberos用户指定一个独立的Ticket cache文件,以防止票据信息串掉。

提示:代码块部分可以左右滑动查看噢

为天地立心,为生民立命,为往圣继绝学,为万世开太平。 温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。

推荐关注Hadoop实操,第一时间,分享更多Hadoop干货,欢迎转发和分享。

原创文章,欢迎转载,转载请注明:转载自微信公众号Hadoop实操