可以用来帮助诊断 Kerberos 相关问题的原因并实施解决方案的指南。
javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]
此消息表明一个操作尝试要求以 Kerberos 的 user/host@realm 身份认证的操作,但票据 cache 中没有用于 user/host@realm 的票据。
用户环境引用的策略/票证缓存文件丢失、不可读(权限)、损坏或无效
票证续签寿命设置为零
票证授予票证(TGT)不存在,因为服务A需要将命令作为服务B运行,但尚未正确配置为允许模拟服务B
票证更新尚未执行/未成功。这可能是由于CDH 5.3之前的HBASE或CDH5.2之前的Hive / Sentry缺陷引起的
该用户的凭据尚未在KDC中生成
执行了手动步骤,例如hadoop fs -ls,但是用户从未通过Kerberos身份验证
Oracle JDK 6 Update 26或更早版本无法读取由MIT Kerberos 1.8.1或更高版本创建的Kerberos凭证高速缓存。
某些版本的Oracle JDK 8可能会遇到此问题
配置useTicketCache=false
,如果配置为true在新版本中可能不支持,就会出现每次票据更新的时间点产生GSS的问题
javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Fail to create credential. (63) - No service creds)]
由JDK缺陷引起
票证消息对于UDP协议而言太大
主机未正确映射到Kerberos领域
GSSException: No valid credentials provided (Mechanism level: Server not found in Kerberos database (7) - UNKNOWN_SERVER)
hostname或要访问的URL与keytab中列出的主机之间发生主机名不匹配。造成这种情况的原因多种多样,包括但不限于:
javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Receive timed out)]
网络连接问题,可能是由于使用UDP与KDC通信引起的
GSSException: Defective token detected (Mechanism level: GSSHeader did not find the right tag)
GSS initiate failed [Caused by GSSException: Failure unspecified at GSS-API level / (Mechanism level: Request is a replay (34)]
GSSException: No valid credentials provided (Mechanism level: Integrity check on decrypted field failed (31) - PROCESS_TGS)]; Host Details : local host is: “myhost61.mycompany.com/10.XX.XX.XXX”; destination host is: “myhost002.mycompany.com”:8020;…Caused by: KrbException: Identifier doesn’t match expected value (906)
尝试使用请求的KDC中存在的keytab中的Principal名称来kinit,但该keytab是从其他KDC生成的。尝试在使用Kerberos的群集(例如throughBDR)之间复制数据时,这两个群集都使用相同的领域名称,但使用不同的KDC
[Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos credentails)]
如果正向和反向DNS解析不一致,则会发生这种情况。
javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided Mechanism level: Failed to find any Kerberos TGT]
确保策略文件存在并且可由当前用户访问。cksum将文件与已知的工作副本进行比较,并在必要时进行替换:
$JAVA_HOME/jre/lib/security/US_export_policy.jar
$JAVA_HOME/jre/lib/security/local_policy.jar
确保为KDC和Principal设置了最大可再生寿命。请参阅知识文章, Impala服务无法以错误开头:“未能找到任何Kerberos tgt”
检查服务的配置,其中包含用户可以模拟其他用户的条目。通常列为proxyusers或类似配置。
升级到CDH 5.3。
注意:请参阅以下知识文章:
javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to create credential. (63) - No service creds)]
升级JDK:Cross Realm Authentication with Cluster Services Fail with GSS error (63) due to KRB/JDK 6 Bug
切换到TCP通过以下设置在krb5.conf中:udp_preference_limit = 1
确保存在krb5.conf的[domain_realm]节中的任一条目,以将请求的Principal的主机映射到Kerberos领域,或者确保[libdefaults]中的default_realm条目存在且与该Principal匹配
请参阅 《Cloudera Security:身份验证问题故障排除》
org.apache.hadoop.security.authentication.client.AuthenticationException: /GSSException: Failure unspecified at GSS-API level (Mechanism level: Specified version of key is not available (44))
用户或服务正在尝试使用旧的 Kerberos keytab 进行身份验证。
自发布此 keytab 以来,有人重新生成了 Principal,从而使 key 的版本值增加了。如果有人使用 Cloudera Manager 重新生成 key 但不重新启动服务,或者对于尚未分发新 keytab 的手动配置,可能会发生这种情况。
某些服务需要一些密钥,例如 MapReduce / HDFS 需要 HTTP 密钥。如果重新生成了 HDFS 服务密钥,则 HTTP 的版本也会增加,并且更新后的密钥必须同时部署到这两个服务并重新启动。
javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Receive timed out)]
配置Kerberos客户端配置krb5.conf以使用TCP和/或调查网络问题。请参阅在与KDC通信时强制Kerberos客户端使用TCP
org.apache.hadoop.security.authentication.client.AuthenticationException: GSSException: Failure unspecified at GSS-API level (Mechanism level:Specified version of key is not available (44))
GSSException: No valid credentials provided (Mechanism level: Server not found in Kerberos database(7) - UNKNOWN_SERVER
a-d:确保服务的主机名,URL,通信的NIC和keytab匹配。请参阅以下知识文章:
从Cloudera Manager中,导航到 管理>安全性 ,然后单击 导入Kerberos帐户管理器凭据以将管理凭据重新导入到Cloudera Manager中。
GSSException: Defective token detected (Mechanism level: GSSHeader did not find the right tag)
确保主机名解析为与KDC和其他服务通信的服务的IP。查看:错误:访问Oozie WebUI时出现“ HTTP状态401”
至少升级到JDK8的51更新
GSS initiate failed [Caused by GSSException: Failure unspecified at GSS-API level (Mechanism level: Request is a replay (34))]
请参阅 《 Cloudera Security:对身份验证问题进行故障排除》
GSSException: No valid credentials provided (Mechanism level: Integrity check on decrypted field failed (31) - PROCESS_TGS)]; Host Details : local host is: “myhost61.mycompany.com/10.XX.XX.XXX”; destination host is: “myhost002.mycompany.com”:8020;
…
Caused by: KrbException: Identifier doesn’t match expected value (906)
kinit: KDC cannot fulfill requested option while renewing credentials
已请求续订有效期为零的票证。如果在 kinit 命令中未指定,则生存期将从 krb5.conf 中获取,如果不存在 renew_lifetime,则生存期默认为零。
您的 KDC 上的 krbtgt 服务 Principal 的更新生命周期为0。
kinit: Cannot contact any KDC for realm ‘EXAMPLE.COM’ while getting initial credentials
客户端和KDC之间的网络问题
krb5.conf中的KDC详细信息不正确
KDC: no supported encryption type
在krb5.conf中定义的加密类型(如果部署了由Cloudera Manager集成的Cloudera Manager的Kerberos)不匹配您的KDC提供的加密类型
KDC中配置的Principal的加密类型和krb5.conf中的加密类型不匹配
群集已配置为仅支持128/256位加密,但是尚未为AD中的Principal启用此功能。
注意:
从Cloudera Manager5.4.2开始,默认情况下未完成此操作。
kinit: KDC has no support for encryption type while getting initial credentials或者 KDC has no support for encryption type (14) - BAD_ENCRYPTION_TYPE
尝试在Cloudera Manager中导入Kerberos帐户管理器凭据时,或者在KDC中配置与tgtPrincipal中存在的加密类型不匹配的加密类型(例如krbtgt/CLOUDERA@CLOUDERA)之后,使用向导启用Kerberos时,您可能会看到此错误。同时启动服务,其中在该enctypes也会发生这种情况的krbtgt委托人不匹配的服务密钥的使用。
kinit: Preauthentication failed while getting initial credentials
此问题的最常见原因是使用了错误的密码。例如,这可能是因为在导入Cloudera Manager凭据时或在keytab生成后更改了Principal的密码时(例如,如果重新生成了Principal,但keytab尚未更新)
server has invalid kerberos principal
由于主机解析问题,因此可以看到此错误,因为Kerberos选择确保IP地址、主机名和Principal都对齐
对于BDR,可能会由于https://issues.apache.org/jira/browse/HDFS-7546而看到此错误
kinit : Password incorrect while getting initial credentials
当所使用的kerberoskeytab中的密码与存储在KDC中的密码不匹配时,会发生此错误。发生这种情况的原因有多种,例如使用了一个旧的keytab进行初始化(此后更改了密码或重新生成了Principal,则该密码已在数据库中更改过,用户的密码已在数据库中更改过),等等。经常会出现此错误。同样,通常是由于用户干预,Cloudera Manager数据库中的Principal与KDC不同步时
kinit: KDC can’t fulfill requested option while renewing credentials.
kinit: Cannot contact any KDC for realm ‘EXAMPLE.COM’ while getting initial credentials
KDC: no supported encryption type
kinit: KDC has no support for encryption type while getting initial credentials OR KDC has no support for encryption type (14) - BAD_ENCRYPTION_TYPE
(1)
(2)
kinit: Preauthentication failed while getting initial credentials
为尝试的步骤提供正确的密码(kinit,导入Cloudera Manager帐户凭据。)
重新启动服务
如果凭据已更新,Cloudera Manager将推出新的keytab。
如果重新启动服务不能解决问题,请确定是否已从Cloudera Manager控件外部更新了凭据。
Caused by: javax.security.auth.login.LoginException: Client not found in Kerberos database (6) - CLIENT_NOT_FOUND
javax.security.auth.login.LoginException: Checksum failed或者GSSException: Failure unspecified at GSS-API level (Mechanism level: Checksum failed)
javax.security.auth.login.LoginException: Unable to obtain password from user
javax.security.auth.login.LoginException: Unable to obtain Principal Name for authentication
当JCE jar在客户端计算机上不是最新的并且无法使用Kerberos KDC提供的加密密钥时,就会发生此问题。
Exception in thread “main” java.lang.IllegalArgumentException: Couldn’t setup Kerberos authentication Caused by: javax.security.auth.login.LoginException: Clients credentials have been revoked (18) - LOCKED_OUT org.apache.hadoop.security.UserGroupInformation.loginUserFromKeytab(UserGroupInformation.java:816) Caused by: KrbException: Clients credentials have been revoked (18) - LOCKED_OUT Caused by: KrbException: Identifier doesn’t match expected value (906)
为所有Principal删除require_preauth标志:kadmin:modprinc -requires_preauth PRINCNAME
javax.security.auth.login.LoginException: Client not found in Kerberos database (6) - CLIENT_NOT_FOUND
javax.security.auth.login.LoginException: Checksum failed OR GSSException: Failure unspecified at GSS-API level (Mechanism level: Checksum failed)
确认正在使用最新的Principal/keytab。如有必要,重新生成Principal和/或重新启动服务
kinit作为您将在Hive中使用的帐户的用户,然后在beeline中与以下用户连接:!connect jdbc:hive2://localhost:10000/default;principal=hive/[email protected]
识别(在Windows上使用setspn -q * / 主机名)并删除KDC中任何重复的或小写的HTTP /主机名Principal。这将要求客户联系其广告管理员
javax.security.auth.login.LoginException: Unable to obtain password from user
确保keytab存在并且具有正确的权限,以便尝试使用它的用户可以读取它
确保正确安装了与JDK相匹配的无限强度策略文件的正确版本
确保对策略文件(位于jdk目录中,例如/usr/java/jdk1.7.0_67-cloudera/jre/lib/security/)的许可权能够被所有用户读取。
确保文件已部署到集群软件正在使用的JDK中
尝试使用kinit使用keytab,以确定此keytab包含Principal,将与当前的工作KDC/KRB5的conf
java.io.IOException: Couldn’t setup connection for [email protected] Status 401 - Authentication required
在访问任何使用 Kerberos 加密配置的 Web 界面(例如 Oozie 作业设计器)之前,需要 Kerberos HTTP 身份验证(SPNEGO)
java.io.IOException: Couldn’t setup connection for [email protected] HTTP Status 401 - Authentication required
尝试连接之前,请先进行身份验证kinit。对于Mac或Windows,请参阅以下说明:
org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.authorize.AuthorizationException): User: hdfs/[email protected] is not allowed to impersonate hdfs
检查请求的服务的配置中是否包含诸如hadoop.proxyuser.hdfs.*之类的条目,或查看以下文章以获取更多信息: 启用Kerberos的BDR HDFS复制失败,并显示“不允许模拟hdfs”异常
org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.authorize.AuthorizationException): java.io.IOException: Tgt generation for principal ‘hdfs/host1.testdomain@MYREALM’ failed with exit code ‘1’ kinit: KDC can’t fulfill requested option while renewing credentials
Exception in thread “main” java.lang.IllegalArgumentException: Couldn’t setup Kerberos authentication Caused by: javax.security.auth.login.LoginException: Clients credentials have been revoked (18) - LOCKED_OUT org.apache.hadoop.security.UserGroupInformation.loginUserFromKeytab(UserGroupInformation.java:816)Caused by: KrbException: Clients credentials have been revoked (18) - LOCKED_OUT Caused by: KrbException: Identifier doesn’t match expected value (906) Keytab contains no suitable keys for hue/[email protected] while getting initial credentialsor:Couldn’t reinit from keytab!
Keytab 中的 user/host@realm 与尝试针对领域进行身份验证的 user/hostname 不匹配
org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.authorize.AuthorizationException): / User: hdfs/[email protected] is not allowed to impersonate hdfs
服务A需要以服务B的身份运行命令,但尚未正确配置为允许模拟服务B。
org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.authorize.AuthorizationException:java.io.IOException: Tgt generation for principal ‘hdfs/host1.testdomain@MYREALM’ / failed with exit code '1’kinit: KDC can’t fulfill requested option while renewing credentials
发出了不允许的请求,例如尝试续订不可续签的票证。
enctype-related errors
提及“ enctype ”的错误通常表示Principal、客户端、服务器和KDC支持的加密类型不匹配。
Found unsupported keytype (18)
仅在为服务启用krb5调试(例如-Dsun.security.krb5.debug = true)后,您才可能看到此错误。
当keytab中的某个密钥无法被代码使用时,就会发生此错误。通常,当存在256位密钥但代码没有可用的无限强度库时,会发生这种情况。通常,当不存在策略文件,权限不正确,不匹配的JDK(安装到群集未使用的JDK),不匹配的策略文件集(例如JDK 6)安装到JDK 7环境中时,就会发生这种情况。
Diagnostics: Couldn’t create proxy provider class org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider…Caused by: org.apache.hadoop.security.authentication.util.KerberosName$NoMatchingRule: No rules applied to [email protected]
org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.token.SecretManager$InvalidToken): Token has expired at org.apache.hadoop.hbase.security.HBaseSaslRpcClient.readStatus
1、作业的运行时间超过“ hbase.auth.token.max.lifetime”(Region Server配置,默认情况下为7天)
2、一个长时间运行的非作业进程不必要地获取HBase身份验证令牌,通过keytab或票证高速缓存登录名绕过Kerberos身份验证方法的可更新用法,并将其生存期限制为“ hbase.auth.token.max.lifetime”价值。
Could not renew Kerberos ticket in order to work around Kerberos 1.8.1 issue
在KDC中设置适当的续订期限。看Hue Kerberos票证续订程序无法启动,错误:无法续订Kerberos票证以解决Kerberos 1.8.1问题
"enctype"related errors
在所有主机上检查kdc.conf或krb5.conf的supported_enctypes字段。
如果使用的是AES256,请确保已将无限强度策略文件添加到JDK。
检查已为KDC中的特定Principal配置了哪些加密类型。
请参阅 《Cloudera Security:对身份验证问题进行故障排除》
Found unsupported keytype(18)
确保正确安装了与JDK相匹配的无限强度策略文件的正确版本
确保对策略文件(位于jdk目录中,例如/usr/java/jdk1.7.0_67-cloudera/jre/lib/security/)的许可权能够被所有用户读取。
确保文件已部署到集群软件正在使用的jdk中
有关详细信息,使用以下的(链接以匹配关键字类型号18在该实例中)将其加密类型
http://www.iana.org/assignments/kerberos-parameters/kerberos-parameters.xml(AES256-CTS-HMAC-此示例为sha1-96)
Diagnostics: Couldn’t create proxy provider class org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
…
Caused by: org.apache.hadoop.security.authentication.util.KerberosName$NoMatchingRule: No rules applied to [email protected]
org.apache.hadoop.security.authentication.util.KerberosName $ NoMatchingRule:没有规则适用于[email protected]
注:通常打印这些错误代码是可用src.zip,可与你的JDK的部署。
例如:Krb5LoginModule.java
server has invalid kerberos principal
Could not renew kerberos ticket in order to work around Kerberos 1.8.1 issue
票证的续签 截止日期 与 有效开始日期 相同,因此无法续签该票证。