Pivotal Knowledge Base

フォローする

KerberosによるセキュアHDFSで、HDFS、DFS、またはHadoop FSを使用する場合に"No valid credentials provided"というエラーメッセージが表示される

環境

製品 バージョン
PHD 1.x と 2.x

事象

ERROR security.UserGroupInformation: PriviledgedActionException as:gpadmin (auth:KERBEROS) cause:javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]
14/05/15 11:41:55 WARN ipc.Client: Exception encountered while connecting to the server : javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]

原因

このエラーはよくkinitが成功して該当のkerberosレルムのKDCに有効なTGTが配布された時に発生する。HDFSクライアントが出力した一般エラーメッセージであり、以下の問題のいずれかの結果として発生する可能性がある。

  • ユーザが$KBR5_CONFIG環境変数をデフォルトの「/etc/krb5.conf 」以外の値に設定した。この場合にHDFSクライントはユーザシェルから$KBR5_CONFIGの設定内容を読み込むことができない。
  • /etc/gphd/hadoop/conf/hdfs-site.xmlにnamenode HDFSプリンシパルのKerberos設定が正しくなされていない 。
  • DNSが正しくFQDNを解決できていない。
  • Kerberosクライアントライブラリのバージョンがサーバのものと一致しない。
  • クライアントとKDCとで、異なるKerberosの暗号化方式を使用している 。

以下のトラブルシューティング方法を参照のこと。

"no valid credentials provided"はkerberos認証が失敗する時にHadoopのfsコマンドが出力するデフォルトのエラーメッセージである。kerberosのハンドシェイクのどこが失敗したか洗い出すためにデバックを有効にすることが最善の策である。 

  1. vi /etc/gphd/hadoop/conf/hadoop-env.sh
  2. sun.security.krb5.debug=trueをHADOOP_OPTS変数に追加する
    export HADOOP_OPTS="-Djava.net.preferIPv4Stack=true -Dsun.security.krb5.debug=true ${HADOOP_OPTS}”

デバッグを有効にすることで、問題の特定が容易になる。

エラーコード一覧

 1. Extra data given to DerValue constructor 
 2. Cross Realm TGS Request no tgt
 3. No valid credentials provided TGT: 18 

1. Extra data is given to DerValue constructor.

[gpadmin@hdm1-prod ~]$ hdfs dfs -ls /
Config name: /etc/krb5.conf
>>>KinitOptions cache name is /tmp/krb5cc_500
>>>DEBUG   client principal is gpadmin@PROD.PIVOTAL.HADOOP
>>>DEBUG  server principal is krbtgt/PROD.PIVOTAL.HADOOP@PROD.PIVOTAL.HADOOP
>>>DEBUG  key type: 16
>>>DEBUG  auth time: Thu May 15 11:47:45 PDT 2014
>>>DEBUG  start time: Thu May 15 11:47:45 PDT 2014
>>>DEBUG  end time: Fri May 16 11:47:45 PDT 2014
>>>DEBUG  renew_till time: Thu May 22 11:47:45 PDT 2014
>>> CCacheInputStream: readFlags()  FORWARDABLE; RENEWABLE; INITIAL;
>>>DEBUG 
>>>DEBUG   client principal is gpadmin@PROD.PIVOTAL.HADOOP
>>>DEBUG  server principal is X-CACHECONF:/krb5_ccache_conf_data/fast_avail/krbtgt/PROD.PIVOTAL.HADOOP@PROD.PIVOTAL.HADOOP
>>>DEBUG  key type: 0
>>>DEBUG  auth time: Wed Dec 31 16:00:00 PST 1969
>>>DEBUG  start time: Wed Dec 31 16:00:00 PST 1969
>>>DEBUG  end time: Wed Dec 31 16:00:00 PST 1969
>>>DEBUG  renew_till time: Wed Dec 31 16:00:00 PST 1969
>>> CCacheInputStream: readFlags()
java.io.IOException: extra data given to DerValue constructor
	at sun.security.util.DerValue.init(DerValue.java:368)
	at sun.security.util.DerValue.(DerValue.java:277)
	at sun.security.krb5.internal.Ticket.(Ticket.java:81)
	at sun.security.krb5.internal.ccache.CCacheInputStream.readData(CCacheInputStream.java:250)
	at sun.security.krb5.internal.ccache.CCacheInputStream.readCred(CCacheInputStream.java:357)
	at sun.security.krb5.internal.ccache.FileCredentialsCache.load(FileCredentialsCache.java:225)
	at sun.security.krb5.internal.ccache.FileCredentialsCache.acquireInstance(FileCredentialsCache.java:104)
	at sun.security.krb5.internal.ccache.CredentialsCache.getInstance(CredentialsCache.java:75)
	at sun.security.krb5.Credentials.acquireTGTFromCache(Credentials.java:304)
	at com.sun.security.auth.module.Krb5LoginModule.attemptAuthentication(Krb5LoginModule.java:589)
	at com.sun.security.auth.module.Krb5LoginModule.login(Krb5LoginModule.java:542)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at javax.security.auth.login.LoginContext.invoke(LoginContext.java:769)
	at javax.security.auth.login.LoginContext.access$000(LoginContext.java:186)
	at javax.security.auth.login.LoginContext$5.run(LoginContext.java:706)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.login.LoginContext.invokeCreatorPriv(LoginContext.java:703)
	at javax.security.auth.login.LoginContext.login(LoginContext.java:575)
	at org.apache.hadoop.security.UserGroupInformation.getLoginUser(UserGroupInformation.java:669)
	at org.apache.hadoop.security.UserGroupInformation.getCurrentUser(UserGroupInformation.java:571)
	at org.apache.hadoop.fs.FileSystem$Cache$Key.(FileSystem.java:2433)
	at org.apache.hadoop.fs.FileSystem$Cache$Key.(FileSystem.java:2425)
	at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2292)
	at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:317)
	at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:163)
	at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:301)
	at org.apache.hadoop.fs.Path.getFileSystem(Path.java:194)
	at org.apache.hadoop.fs.shell.PathData.expandAsGlob(PathData.java:270)
	at org.apache.hadoop.fs.shell.Command.expandArgument(Command.java:224)
	at org.apache.hadoop.fs.shell.Command.expandArguments(Command.java:207)
	at org.apache.hadoop.fs.shell.Command.processRawArguments(Command.java:190)
	at org.apache.hadoop.fs.shell.Command.run(Command.java:154)
	at org.apache.hadoop.fs.FsShell.run(FsShell.java:255)
	at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
	at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:84)
	at org.apache.hadoop.fs.FsShell.main(FsShell.java:305)

解決策

類似の問題がapache Jira HTTPCLIENT-934に報告されており、JDK 6とKRB 1.8以降との互換性問題に関連している。「kinit –R」を実行しクレデンシャルキャッシュを書き直すことで問題が解決する。このワークアラウンドを実行し、問題が修正されたことを確認したら、 再発防止のため、JDK 7へのアップグレードを推奨する。 

2. Cross Realm TGS Request no TGT.

>>> Credentials acquireServiceCreds: main loop: [0] tempService=krbtgt/PROD.PIVOTAL.HADOOP@DEV.PIVOTAL.HADOOP
default etypes for default_tgs_enctypes: 16 23 1 3.
>>> CksumType: sun.security.krb5.internal.crypto.RsaMd5CksumType
>>> EType: sun.security.krb5.internal.crypto.Des3CbcHmacSha1KdEType
>>> KrbKdcReq send: kdc=pccadmin-dev.phd.local TCP:88, timeout=30000, number of retries =3, #bytes=727
>>>DEBUG: TCPClient reading 621 bytes
>>> KrbKdcReq send: #bytes read=621
>>> KrbKdcReq send: #bytes read=621
>>> KdcAccessibility: remove pccadmin-dev.phd.local:88
>>> EType: sun.security.krb5.internal.crypto.Des3CbcHmacSha1KdEType
>>> Credentials acquireServiceCreds: no tgt; searching backwards
>>> Credentials acquireServiceCreds: inner loop: [1] tempService=krbtgt/PIVOTAL.HADOOP@DEV.PIVOTAL.HADOOP
default etypes for default_tgs_enctypes: 16 23 1 3.
>>> CksumType: sun.security.krb5.internal.crypto.RsaMd5CksumType
>>> EType: sun.security.krb5.internal.crypto.Des3CbcHmacSha1KdEType
>>> KrbKdcReq send: kdc=pccadmin-dev.phd.local TCP:88, timeout=30000, number of retries =3, #bytes=722
>>>DEBUG: TCPClient reading 187 bytes
>>> KrbKdcReq send: #bytes read=187
>>> KrbKdcReq send: #bytes read=187
>>> KdcAccessibility: remove pccadmin-dev.phd.local:88
>>> KDCRep: init() encoding tag is 126 req type is 13
>>>KRBError:
	 cTime is Thu May 15 11:59:58 PDT 2014 1400180398000
	 sTime is Thu May 15 11:59:53 PDT 2014 1400180393000
	 suSec is 860526
	 error code is 7
	 error Message is Server not found in Kerberos database
	 crealm is DEV.PIVOTAL.HADOOP
	 cname is gpadmin
	 realm is DEV.PIVOTAL.HADOOP
	 sname is krbtgt/PIVOTAL.HADOOP
	 msgType is 30
>>> Credentials acquireServiceCreds: no tgt; cannot get creds

解決策

この問題はPROD.PIVOTAL.HADOOPのレルムとDEV.PIVOTAL.HADOOPのレルム間のクロスレルムトラストに関係している。ユーザがHadoop コマンドの fs –lsを、DEVクラスタからPRODクラスタに対して実行している際、TGSリクエストがkrbtgt/PROD.PIVOTAL.HADOOP@DEV.PIVOTAL.HADOOPに対する有効なTGTを見つけることに失敗している。ここでの重要なエラーは、初回TGT取得時に当該処理が失敗して出力される"no tgt; searching backwards"である。その後、実際は存在しないkrbtgt/PIVOTAL.HADOOP@DEV.PIVOTAL.HADOOPのTGTを探そうとして失敗する。  

最初のTGSリクエストが失敗する原因は、バグ id 7061379として登録されているJDK 6の既知バグによるものである。基本的には、TGSの返答データ型がkrb5の新バージョンにて変更されたが、JDK 6では依然として旧バージョンの返答データ型を期待していることが原因である。解決策は、全PHDノードでJDK 7へのアップグレードを行うことである。 

3. No valid credentials provided TGT: 18

[gpadmin@etl1 ~]$ hdfs dfs -ls /
Java config name: null
Native config name: /etc/krb5.conf
Loaded from native config
>>>KinitOptions cache name is /tmp/krb5cc_500
>>>DEBUG   client principal is gpadmin/etl1.phd.local@PHD.LOCAL
>>>DEBUG  server principal is krbtgt/PHD.LOCAL@PHD.LOCAL
>>>DEBUG  key type: 18
>>>DEBUG  auth time: Mon Aug 18 11:09:40 PDT 2014
>>>DEBUG  start time: Mon Aug 18 11:09:40 PDT 2014
>>>DEBUG  end time: Tue Aug 19 11:09:40 PDT 2014
>>>DEBUG  renew_till time: Mon Aug 18 11:09:40 PDT 2014
>>> CCacheInputStream: readFlags()  FORWARDABLE; RENEWABLE; INITIAL;
>>>DEBUG   client principal is gpadmin/etl1.phd.local@PHD.LOCAL
>>>DEBUG  server principal is X-CACHECONF:/krb5_ccache_conf_data/fast_avail/krbtgt/PHD.LOCAL@PHD.LOCAL
>>>DEBUG  key type: 0
>>>DEBUG  auth time: Wed Dec 31 16:00:00 PST 1969
>>>DEBUG  start time: null
>>>DEBUG  end time: Wed Dec 31 16:00:00 PST 1969
>>>DEBUG  renew_till time: null
>>> CCacheInputStream: readFlags()
>>>DEBUG   client principal is gpadmin/etl1.phd.local@PHD.LOCAL
>>>DEBUG  server principal is /HTTP/hdw1.phd.local
>>>DEBUG  key type: 18
>>>DEBUG  auth time: Mon Aug 18 11:09:40 PDT 2014
>>>DEBUG  start time: Mon Aug 18 11:23:14 PDT 2014
>>>DEBUG  end time: Tue Aug 19 11:09:40 PDT 2014
>>>DEBUG  renew_till time: Mon Aug 18 11:09:40 PDT 2014
>>> CCacheInputStream: readFlags()  FORWARDABLE; RENEWABLE;
>>>DEBUG   client principal is gpadmin/etl1.phd.local@PHD.LOCAL
>>>DEBUG  server principal is HTTP/hdw1.phd.local@PHD.LOCAL
>>>DEBUG  key type: 18
>>>DEBUG  auth time: Mon Aug 18 11:09:40 PDT 2014
>>>DEBUG  start time: Mon Aug 18 11:23:14 PDT 2014
>>>DEBUG  end time: Tue Aug 19 11:09:40 PDT 2014
>>>DEBUG  renew_till time: Mon Aug 18 11:09:40 PDT 2014
>>> CCacheInputStream: readFlags()  FORWARDABLE; RENEWABLE;
>>>DEBUG   client principal is gpadmin/etl1.phd.local@PHD.LOCAL
>>>DEBUG  server principal is /HTTP/hdm1.phd.local
>>>DEBUG  key type: 18
>>>DEBUG  auth time: Mon Aug 18 11:09:40 PDT 2014
>>>DEBUG  start time: Mon Aug 18 11:23:28 PDT 2014
>>>DEBUG  end time: Tue Aug 19 11:09:40 PDT 2014
>>>DEBUG  renew_till time: Mon Aug 18 11:09:40 PDT 2014
>>> CCacheInputStream: readFlags()  FORWARDABLE; RENEWABLE;
>>>DEBUG   client principal is gpadmin/etl1.phd.local@PHD.LOCAL
>>>DEBUG  server principal is HTTP/hdm1.phd.local@PHD.LOCAL
>>>DEBUG  key type: 18
>>>DEBUG  auth time: Mon Aug 18 11:09:40 PDT 2014
>>>DEBUG  start time: Mon Aug 18 11:23:28 PDT 2014
>>>DEBUG  end time: Tue Aug 19 11:09:40 PDT 2014
>>>DEBUG  renew_till time: Mon Aug 18 11:09:40 PDT 2014
>>> CCacheInputStream: readFlags()  FORWARDABLE; RENEWABLE;
>>> unsupported key type found the default TGT: 18 

解決策

このエラーはAES256暗号化を有効にしており、Javaのアップグレードをしていた場合に発生する。これは、Javaのアップグレードを行うと、AES256暗号化サポートを含んでいるJCEポリシーファイルが上書きされてしまうためである。解決方法は、単純にJCEポリシーjarファイルを "/usr/java/default/jre/lib/security/"へ再インストールすることである。

コメント

Powered by Zendesk