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實操