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