您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Hive中metastore如何認證和授權,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
metastore主要維護2種數據:
數據庫、表、分區等數據,算是DDL操作
權限、角色類的數據,算是DCL操作
metastore通過開啟thrift rpc服務,開啟對上述2種數據的操作接口,接口即 ThriftHiveMetastore.Iface 內容見下圖
第一種數據的操作如下:
第二種數據的操作如下:
metastore對該接口的實現為:HMSHandler,它主要有以下屬性:
ThreadLocal<RawStore> threadLocalMS
RawStore主要用于和數據庫打交道,存儲上述2種相關數據,RawStore和當前線程進行綁定,默認實現是ObjectStore
List<MetaStorePreEventListener> preListeners
當上述2種數據將要發生變化的時候,都會首先調用上述MetaStorePreEventListener執行一些預處理操作,如驗證一個用戶是否有權限來執行該操作
List<MetaStoreEventListener> listeners
當上述第一種數據發生變化后,會調用上述MetaStoreEventListener執行一些處理
由上述可以了解到,在metastore的數據發生修改之前可以進行驗權操作,hive默認提供了一個AuthorizationPreEventListener實現了上述MetaStorePreEventListener接口執行一些驗權操作
從上面可以看到,僅僅對DDL操作進行了驗權,并沒有對DCL操作進行驗權,這也是一個比較奇怪的地方。即如果你能直連到metastore服務,就可以隨意的進行授權操作。
接下來我們詳細看看這個認證和授權的過程
涉及到2個接口:
HiveMetastoreAuthenticationProvider:認證提供者,用于用戶的認證,一個HiveMetastoreAuthenticationProvider對象對應一個用戶,該對象包含用戶的userName和groups信息
HiveMetastoreAuthorizationProvider:授權提供者,用于用戶的驗權
下面分別來詳細說明
上述HiveMetastoreAuthenticationProvider的默認實現是HadoopDefaultMetastoreAuthenticator,通過hadoop中的UserGroupInformation來獲取當前用戶名和組的信息,如下所示
metastore的client端用戶是如何被傳遞到這里的呢?
這就涉及到了metastore開啟的thrift rpc服務了,metastore使用的是thrift的TThreadPoolServer來作為server。這種模式下,會啟動一個線程池,每來一個客戶端連接就取出一個線程來專門處理該連接,該連接就一直占用該線程了,這種方式就是傳統的BIO方式,能夠支持的并發量比較小。
metastore開啟的rpc服務分成3種類型:
使用sasl方式: 是一種安全的方式,使用kerberos認證用戶的身份,這一部分內容比較多,可能之后再詳細分析這一塊。
setUgi方式:
是一種非安全的方式,即并沒有對用戶的身份進行合法性驗證。當hive.metastore.execute.setugi=true時即采用這種模式。這種模式下如下操作:
client端會通過set_ugi方法來向服務器端傳遞用戶的ugi信息
服務器端將用戶的ugi信息綁定到當前連接上
client端向服務器端發送操作數據的請求,服務器端取出連接中的ugi信息,使用ugi的doas方法來執行操作
client占用服務器端的一個線程,會創建出一個HiveMetastoreAuthenticationProvider對象,該對象在創建過程中要獲取當前的ugi信息,即獲取到上述ugi信息,并且把client的上述HiveMetastoreAuthenticationProvider對象綁定在該線程中,至此便可以得到client的用戶信息。而groups信息則是通過hadoop默認的方式即獲取本metastore服務所在的機器上,該用戶所屬的groups信息。
其他:
就僅僅是將client的ip綁定到當前線程上,就沒有所謂的用戶信息了
上述的sasl也是通過ugi.doas方式來供后續獲取用戶信息的,但是sasl多了用戶身份合法性的驗證過程。而setUgi方式client端傳過來什么用戶就認為是什么用戶,所以只有sasl方式才是安全的方式,其他2種是非安全方式。
上一部分我們獲取到了用戶信息,下面就是要驗證用戶是否有權限執行相關操作,驗權接口就是HiveMetastoreAuthorizationProvider,實現類如下:
默認是DefaultHiveMetastoreAuthorizationProvider。
DefaultHiveMetastoreAuthorizationProvider:
根據userName和groups信息從數據庫中獲取權限信息來驗證用戶是否有權限
StorageBasedAuthorizationProvider:
判斷一個用戶是否對數據庫、表等是否有權限依據該用戶在HDFS上對這些文件是否有對應的權限
總結如下:
metastore只做了DDL操作的相關認證,并沒有做DCL操作的認證,一旦通過hive cli連接metastore,用戶就可以隨意進行賦權操作
根據用戶和用戶所屬的groups信息來獲取權限,大數據系統中用戶和groups關系的維護最好是自己統一維護,而不是借助默認的linux機器上用戶和groups的關系,不然之后會有很多麻煩的。
畫了一個默認情況下簡單的示意圖如下:
關于“Hive中metastore如何認證和授權”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。