新聞中心
這篇文章給大家分享的是有關(guān)Kerberos環(huán)境下Java應(yīng)用程序認(rèn)證超時(shí)異常是怎么回事的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。
創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),陽東企業(yè)網(wǎng)站建設(shè),陽東品牌網(wǎng)站建設(shè),網(wǎng)站定制,陽東網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,陽東網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
測(cè)試環(huán)境
1.CM和CDH版本為5.15.1
2.操作系統(tǒng)版本為RedHat7.2
3.集群已啟用Kerberos
問題描述
在使用JDK 8時(shí),在Kerberos環(huán)境下應(yīng)用程序在執(zhí)行的過程中報(bào)以下錯(cuò)誤:
Failed on local exception: java.io.IOException: javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]
問題分析
在Kerberos環(huán)境下長(zhǎng)時(shí)間運(yùn)行的作業(yè)會(huì)出現(xiàn)認(rèn)證失敗問題,認(rèn)證失敗是由于Ticket過期導(dǎo)致。Ticket過期是由ticket_lifetime和renew_lifetime兩個(gè)參數(shù)控制,具體分析如下:
先了解下krb5.conf里ticket_lifetime和renew_lifetime參數(shù):
ticket_lifetime = 24h
renew_lifetime = 7d
注:這里其實(shí)還跟kdc.conf里的ticket_lifetime和renew_lifetime相關(guān),本文不做討論,假設(shè)你配置都是一致的。
每一個(gè)Kerberos的ticket,包括TGT,都有一個(gè)ticket_lifetime(默認(rèn):1天);Ticket可以被延續(xù),但最多只能延續(xù)到renew_lifetime(默認(rèn):7天),超過7天后無法再延續(xù),此時(shí)ticket失效,只能重新login。
如果你的應(yīng)用程序需要運(yùn)行很長(zhǎng)時(shí)間或者需要持續(xù)不斷地一直運(yùn)行,就會(huì)有一個(gè)問題,即:
在應(yīng)用程序啟動(dòng)時(shí)進(jìn)行Kerberos認(rèn)證登錄后,是否還需要定時(shí)renew ticket或在ticket期滿失效后使用keytab重新login?例如,是否需要在應(yīng)用程序代碼里,在每個(gè)UGI.doAS(...)前調(diào)用UGI.checkTGTAndReloginFromKeytab或者使用一個(gè)Timer周期性地調(diào)用UGI.checkTGTAndReloginFromKeytab?
關(guān)于這個(gè)問題,首先需要了解在Hadoop系統(tǒng)里是如何進(jìn)行Kerberos認(rèn)證的:
Hadoop Kerberos認(rèn)證的主要使用場(chǎng)景是Hadoop RPC框架(使用SASL進(jìn)行kerberos認(rèn)證)。大部分Hadoop daemon進(jìn)程在啟動(dòng)時(shí)會(huì)調(diào)用UGI(org.apache.hadoop.security.UserGroupInformation),UGI.loginUserFromKeytab做kerberos認(rèn)證并獲取ticket,并在后續(xù)每一次RPC調(diào)用時(shí)使用該ticket認(rèn)證。比如,DataNode必須認(rèn)證它對(duì)NameNode的RPC調(diào)用,NodeManager也必須認(rèn)證它對(duì)ResourceManager的RPC調(diào)用。那么,這些daemon進(jìn)程為什么能在啟動(dòng)后長(zhǎng)時(shí)間持續(xù)運(yùn)行而不會(huì)出現(xiàn)kerberos ticket錯(cuò)誤呢(甚至已經(jīng)超過了renew_lifetime)?這是因?yàn)镠adoop在RPC Client層實(shí)現(xiàn)了一種自動(dòng)relogin機(jī)制。在Client.handleSaslConnectionFailure(org.apache.hadoop.ipc.Client)方法里有如下代碼:
// try re-login
if (UserGroupInformation.isLoginKeytabBased()) {
UserGroupInformation.getLoginUser().reloginFromKeytab();
} else if (UserGroupInformation.isLoginTicketBased()) {
UserGroupInformation.getLoginUser().reloginFromTicketCache();
}

上述代碼說明在使用RPC連接時(shí),如果因?yàn)閠icket失效造成認(rèn)證失敗,會(huì)自動(dòng)relogin。
基于以上認(rèn)識(shí),可以得出以下結(jié)論:
1.如果應(yīng)用程序的使用模式是從keytab登錄后執(zhí)行典型的Hadoop RPC Java調(diào)用(如調(diào)用HDFS FileSystem API),那么是不需要在應(yīng)用層增加renew ticket或relogin代碼的,因?yàn)镽PC Client層已經(jīng)幫你實(shí)現(xiàn)了。
2.如果應(yīng)用程序的使用模式是不使用Hadoop RPC,而是調(diào)用HDFS REST API或YARN REST API(使用SPNEGO進(jìn)行kerberos認(rèn)證),那么需要在應(yīng)用程序里增加relogin代碼。具體實(shí)現(xiàn)方式是:
Java方式:主Java程序使用keytab調(diào)用UGI.loginUserFromKeytab登錄,然后在每個(gè)UGI.doAS前調(diào)用UGI.checkTGTAndReloginFromKeytab方法,或者另啟動(dòng)一個(gè)線程周期性調(diào)用該方法。

Shell方式:主程序使用kinit登錄,然后啟動(dòng)另一個(gè)子進(jìn)程周期性的調(diào)用kinit -R去renew ticket或者調(diào)用kinit -kt去relogin。
需要注意的是當(dāng)使用JDK 8時(shí),UGI的relogin存在一個(gè)bug,即HADOOP-10786。該bug是因?yàn)镴DK 8的Krb5LoginModule有些小改動(dòng),這些改動(dòng)會(huì)造成UGI的relogin代碼認(rèn)為之前的登錄并不是基于keytab登錄的。所以,UGI.reloginFromKeytab和UGI.checkTGTAndReloginFromKeytab方法實(shí)際上什么都沒有做,并沒有執(zhí)行relogin。所以,此時(shí)應(yīng)用程序仍然會(huì)報(bào)以下錯(cuò)誤:
Failed on local exception: java.io.IOException: javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]
解決辦法
對(duì)于使用JDK 8應(yīng)用程序不能正常reloginFromKeytab的 bug,workaround是:
1. 使用JDK 7而不是JDK 8,或者
2. 確保hadoop-common包含了HADOOP-10786補(bǔ)丁。
建議使用CDH5.13.0或者以上版本的包,這些包已經(jīng)包括了該補(bǔ)丁。如果仍然在IDE開發(fā)環(huán)境出現(xiàn)了以上問題,可以檢查一下IDE依賴的hadoop-common包的版本是否有問題。
感謝各位的閱讀!關(guān)于“Kerberos環(huán)境下Java應(yīng)用程序認(rèn)證超時(shí)異常是怎么回事”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
網(wǎng)頁題目:Kerberos環(huán)境下Java應(yīng)用程序認(rèn)證超時(shí)異常是怎么回事
標(biāo)題鏈接:http://www.dlmjj.cn/article/pjisdj.html


咨詢
建站咨詢
