快捷搜索:  汽车  科技

kerberos认证涉及端口(0552-5.15.0-同一OS用户不同Kerberos用户执行脚本Principal串掉)

kerberos认证涉及端口(0552-5.15.0-同一OS用户不同Kerberos用户执行脚本Principal串掉)1.首先在客户端进行Kinit操作后,默认的Ticket Cache是存储在tmp/krb5cc_0临时文件中(Ticket cache文件是根据当前用户的uid在/tmp目录下生成一个以krb5cc_开头的临时文件)。在生成的testhbase.log和testyarn.log中可以看到两个脚本会获取到对方的Principal信息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(ho

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

kerberos认证涉及端口(0552-5.15.0-同一OS用户不同Kerberos用户执行脚本Principal串掉)(1)

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

kerberos认证涉及端口(0552-5.15.0-同一OS用户不同Kerberos用户执行脚本Principal串掉)(2)

3.问题分析

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

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

kerberos认证涉及端口(0552-5.15.0-同一OS用户不同Kerberos用户执行脚本Principal串掉)(3)

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

kerberos认证涉及端口(0552-5.15.0-同一OS用户不同Kerberos用户执行脚本Principal串掉)(4)

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

kerberos认证涉及端口(0552-5.15.0-同一OS用户不同Kerberos用户执行脚本Principal串掉)(5)

5.总结

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

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

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

猜您喜欢: