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


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中添加两个定时任务,使两个任务同时并发


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


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


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


3

问题分析


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


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


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


根据上述两点基本可以定位问题的原因,因为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)


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


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


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


5

总结


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


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


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


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


为天地立心,为生民立命,为往圣继绝学,为万世开太平。

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


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

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

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