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