在不使用 kinit 的情况下尝试访问 Kerberized HBase 时找不到任何 Kerberos TGT
Failed to Find Any Kerberos TGT while trying to access Kerberized HBase Without kinit
我有一个非常简单的 Scala HBase GET 应用程序。
我尝试建立如下连接:
import org.apache.hadoop.hbase.{HBaseConfiguration, TableName}
import org.apache.hadoop.hbase.client.{ConnectionFactory, Get}
object Debug extends App {
val hbaseConf: HadoopConf = HBaseConfiguration.create
val connection: Connection = ConnectionFactory.createConnection(hbaseConf)
val hbaseTable = connection.getTable(TableName.valueOf("my-hbase-table"))
hbaseTable.get(new Get("rowkey".getBytes).addColumn("colFam".getBytes,"colName".getBytes))
}
每当我 运行 这样做时,我都会收到如下错误:
Caused by: javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]
at com.sun.security.sasl.gsskerb.GssKrb5Client.evaluateChallenge(GssKrb5Client.java:211)
at org.apache.hadoop.hbase.security.AbstractHBaseSaslRpcClient.getInitialResponse(AbstractHBaseSaslRpcClient.java:131)
at org.apache.hadoop.hbase.security.NettyHBaseSaslRpcClientHandler.run(NettyHBaseSaslRpcClientHandler.java:108)
at org.apache.hadoop.hbase.security.NettyHBaseSaslRpcClientHandler.run(NettyHBaseSaslRpcClientHandler.java:104)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1746)
at org.apache.hadoop.hbase.security.NettyHBaseSaslRpcClientHandler.handlerAdded(NettyHBaseSaslRpcClientHandler.java:104)
at org.apache.hbase.thirdparty.io.netty.channel.DefaultChannelPipeline.callHandlerAdded0(DefaultChannelPipeline.java:606)
at org.apache.hbase.thirdparty.io.netty.channel.DefaultChannelPipeline.addFirst(DefaultChannelPipeline.java:187)
at org.apache.hbase.thirdparty.io.netty.channel.DefaultChannelPipeline.addFirst(DefaultChannelPipeline.java:380)
at org.apache.hbase.thirdparty.io.netty.channel.DefaultChannelPipeline.addFirst(DefaultChannelPipeline.java:359)
at org.apache.hadoop.hbase.ipc.NettyRpcConnection.saslNegotiate(NettyRpcConnection.java:200)
... 18 more
Caused by: GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)
at sun.security.jgss.krb5.Krb5InitCredential.getInstance(Krb5InitCredential.java:162)
at sun.security.jgss.krb5.Krb5MechFactory.getCredentialElement(Krb5MechFactory.java:122)
at sun.security.jgss.krb5.Krb5MechFactory.getMechanismContext(Krb5MechFactory.java:189)
at sun.security.jgss.GSSManagerImpl.getMechanismContext(GSSManagerImpl.java:224)
at sun.security.jgss.GSSContextImpl.initSecContext(GSSContextImpl.java:212)
at sun.security.jgss.GSSContextImpl.initSecContext(GSSContextImpl.java:179)
at com.sun.security.sasl.gsskerb.GssKrb5Client.evaluateChallenge(GssKrb5Client.java:192)
... 30 more
我用的是Windows,所以我在C盘根目录下放了4个文件:
C:\cacerts
C:\jaas.conf
C:\krb5.conf
C:\principal.keytab
我的C:\jaas.conf :
KafkaClient {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
keyTab="C:\principal.keytab"
useTicketCache=false
debug=true
principal="principal@REALM";
};
Client {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
keyTab="C:\principal.keytab"
useTicketCache=false
debug=true
principal="principal@REALM";
};
com.sun.security.jgss.krb5.initiate {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
keyTab="C:\principal.keytab"
principal="principal@REALM";
};
我正在使用 Cloudera CDH 版本 6.3.2。从 Cloudera manager 下载 hbase-client-config (ssl-client.xml, hdfs-site.xml, hbase-site.xml, core-site.xml) 并在资源下添加 HBase 客户端配置文件IntelliJ 中的文件夹。 my-hbase-client-config-files
并在 IntelliJ 中为 jaas.conf
设置 VM 选项,Run/Debug 配置 -> 应用程序 -> 构建和 运行 -> VM 选项。 my-intellij-application-vm-options-config
当应用程序启动时,我能够看到 jaas.conf
正在获取文件 jaas.conf-logs
即使它说它会使用密钥表,我仍然收到这样的错误:Kerberos-error-message
我的 Cloudera 版本:6.3.2
Scala 版本:2.11.12
HBase 客户端:2.1.0
有没有人有什么想法?
当我给 jaas.conf 时,Java 身份验证系统是否不会自行获取 Kerberos 票证?
当 Jaas 无法访问 kerberos 密钥表时,您将收到此错误消息。
你能检查一下用户权限问题吗?
以将 运行 代码并执行 kinit 的用户身份登录?你得到什么错误信息? (解决我建议你的权限问题。)
您似乎排除了路径问题,并且似乎有正确的“\\”。
我不确定 HBase 客户端是否实现了服务提供者接口(这将允许使用 JAAS-style 安全配置)。
也许您可以尝试直接在您的 Scala 代码中添加 UGI 初始化,如下所示?
object Debug extends App {
val hbaseConf: HadoopConf = HBaseConfiguration.create
UserGroupInformation.setConfiguration(hbaseConf)
UserGroupInformation.loginUserFromKeytab("principal@REALM","C:\principal.keytab")
val connection: Connection = ConnectionFactory.createConnection(hbaseConf)
:
etc
:
否则,您能否分享一个 reference/link 给任何表明它可以通过 jaas.conf
配置的信息?
我有一个非常简单的 Scala HBase GET 应用程序。 我尝试建立如下连接:
import org.apache.hadoop.hbase.{HBaseConfiguration, TableName}
import org.apache.hadoop.hbase.client.{ConnectionFactory, Get}
object Debug extends App {
val hbaseConf: HadoopConf = HBaseConfiguration.create
val connection: Connection = ConnectionFactory.createConnection(hbaseConf)
val hbaseTable = connection.getTable(TableName.valueOf("my-hbase-table"))
hbaseTable.get(new Get("rowkey".getBytes).addColumn("colFam".getBytes,"colName".getBytes))
}
每当我 运行 这样做时,我都会收到如下错误:
Caused by: javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]
at com.sun.security.sasl.gsskerb.GssKrb5Client.evaluateChallenge(GssKrb5Client.java:211)
at org.apache.hadoop.hbase.security.AbstractHBaseSaslRpcClient.getInitialResponse(AbstractHBaseSaslRpcClient.java:131)
at org.apache.hadoop.hbase.security.NettyHBaseSaslRpcClientHandler.run(NettyHBaseSaslRpcClientHandler.java:108)
at org.apache.hadoop.hbase.security.NettyHBaseSaslRpcClientHandler.run(NettyHBaseSaslRpcClientHandler.java:104)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1746)
at org.apache.hadoop.hbase.security.NettyHBaseSaslRpcClientHandler.handlerAdded(NettyHBaseSaslRpcClientHandler.java:104)
at org.apache.hbase.thirdparty.io.netty.channel.DefaultChannelPipeline.callHandlerAdded0(DefaultChannelPipeline.java:606)
at org.apache.hbase.thirdparty.io.netty.channel.DefaultChannelPipeline.addFirst(DefaultChannelPipeline.java:187)
at org.apache.hbase.thirdparty.io.netty.channel.DefaultChannelPipeline.addFirst(DefaultChannelPipeline.java:380)
at org.apache.hbase.thirdparty.io.netty.channel.DefaultChannelPipeline.addFirst(DefaultChannelPipeline.java:359)
at org.apache.hadoop.hbase.ipc.NettyRpcConnection.saslNegotiate(NettyRpcConnection.java:200)
... 18 more
Caused by: GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)
at sun.security.jgss.krb5.Krb5InitCredential.getInstance(Krb5InitCredential.java:162)
at sun.security.jgss.krb5.Krb5MechFactory.getCredentialElement(Krb5MechFactory.java:122)
at sun.security.jgss.krb5.Krb5MechFactory.getMechanismContext(Krb5MechFactory.java:189)
at sun.security.jgss.GSSManagerImpl.getMechanismContext(GSSManagerImpl.java:224)
at sun.security.jgss.GSSContextImpl.initSecContext(GSSContextImpl.java:212)
at sun.security.jgss.GSSContextImpl.initSecContext(GSSContextImpl.java:179)
at com.sun.security.sasl.gsskerb.GssKrb5Client.evaluateChallenge(GssKrb5Client.java:192)
... 30 more
我用的是Windows,所以我在C盘根目录下放了4个文件:
C:\cacerts
C:\jaas.conf
C:\krb5.conf
C:\principal.keytab
我的C:\jaas.conf :
KafkaClient {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
keyTab="C:\principal.keytab"
useTicketCache=false
debug=true
principal="principal@REALM";
};
Client {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
keyTab="C:\principal.keytab"
useTicketCache=false
debug=true
principal="principal@REALM";
};
com.sun.security.jgss.krb5.initiate {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
keyTab="C:\principal.keytab"
principal="principal@REALM";
};
我正在使用 Cloudera CDH 版本 6.3.2。从 Cloudera manager 下载 hbase-client-config (ssl-client.xml, hdfs-site.xml, hbase-site.xml, core-site.xml) 并在资源下添加 HBase 客户端配置文件IntelliJ 中的文件夹。 my-hbase-client-config-files
并在 IntelliJ 中为 jaas.conf
设置 VM 选项,Run/Debug 配置 -> 应用程序 -> 构建和 运行 -> VM 选项。 my-intellij-application-vm-options-config
当应用程序启动时,我能够看到 jaas.conf
正在获取文件 jaas.conf-logs
即使它说它会使用密钥表,我仍然收到这样的错误:Kerberos-error-message
我的 Cloudera 版本:6.3.2
Scala 版本:2.11.12
HBase 客户端:2.1.0
有没有人有什么想法? 当我给 jaas.conf 时,Java 身份验证系统是否不会自行获取 Kerberos 票证?
当 Jaas 无法访问 kerberos 密钥表时,您将收到此错误消息。
你能检查一下用户权限问题吗? 以将 运行 代码并执行 kinit 的用户身份登录?你得到什么错误信息? (解决我建议你的权限问题。)
您似乎排除了路径问题,并且似乎有正确的“\\”。
我不确定 HBase 客户端是否实现了服务提供者接口(这将允许使用 JAAS-style 安全配置)。
也许您可以尝试直接在您的 Scala 代码中添加 UGI 初始化,如下所示?
object Debug extends App {
val hbaseConf: HadoopConf = HBaseConfiguration.create
UserGroupInformation.setConfiguration(hbaseConf)
UserGroupInformation.loginUserFromKeytab("principal@REALM","C:\principal.keytab")
val connection: Connection = ConnectionFactory.createConnection(hbaseConf)
:
etc
:
否则,您能否分享一个 reference/link 给任何表明它可以通过 jaas.conf
配置的信息?