Вопрос или проблема
Я пытаюсь настроить аутентификацию Kerberos для HBase, используя эту http://hbase.apache.org/0.94/book/security.html документацию и пока что достиг очень маленького прогресса.
HBase 1.1.1 от Apache без каких-либо влияний Cloudera. Хост-машина работает под CentOS 6.5.
Я уже настроил KDC и клиент Kerberos, следуя инструкциям по https://gist.github.com/ashrithr/4767927948eca70845db. KDC расположен на той же машине, которую я пытаюсь защитить с помощью HBase.
В целом, вот текущее состояние окружения:
файл keytab находится здесь /opt/hbase.keytab
Содержимое файла hbase-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="https://serverfault.com/questions/730263/configuration.xsl"?>
<configuration>
<property>
<name>hbase.rootdir</name>
<value>file:///opt/hbase-data/hbase</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/opt/hbase-data/zookeeper</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.security.authentication</name>
<value>kerberos</value>
</property>
<property>
<name>hbase.security.authorization</name>
<value>true</value>
</property>
<property>
<name>hbase.coprocessor.region.classes</name>
<value>org.apache.hadoop.hbase.security.token.TokenProvider</value>
</property>
<property>
<name>hbase.master.keytab.file</name>
<value>/opt/hbase.keytab</value>
</property>
<property>
<name>hbase.master.kerberos.principal</name>
<value>hbase/[email protected]</value>
</property>
<property>
<name>hbase.regionserver.kerberos.principal</name>
<value>hbase/[email protected]</value>
</property>
<property>
<name>hbase.regionserver.keytab.file</name>
<value>/opt/hbase.keytab</value>
</property>
</configuration>
Это псевдо-распределенный режим, и я не стал мучиться с HDFS, чтобы сделать все как можно проще.
Однако когда я запускаю hbase с помощью команды ./start-hbase, я получаю следующую ошибку в regionserver.log
2015-10-20 17:33:18,068 INFO [regionserver/xxx.mycompany.com/172.24.4.60:16201] regionserver.HRegionServer: reportForDuty to master=xxx.mycompany.com,16000,1445349909162 with port=16201, startcode=1445349910087 2015-10-20 17:33:18,071 WARN [regionserver/xxx.mycompany.com/172.24.4.60:16201] ipc.AbstractRpcClient: 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)] 2015-10-20 17:33:18,071 FATAL [regionserver/xxx.mycompany.com/172.24.4.60:16201] ipc.AbstractRpcClient: SASL authentication failed. The most likely cause is missing or invalid credentials. Consider 'kinit'. 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:212)
at org.apache.hadoop.hbase.security.HBaseSaslRpcClient.saslConnect(HBaseSaslRpcClient.java:179)
at org.apache.hadoop.hbase.ipc.RpcClientImpl$Connection.setupSaslConnection(RpcClientImpl$Connection.java:609)
at org.apache.hadoop.hbase.ipc.RpcClientImpl$Connection.access$600(RpcClientImpl$Connection.java:154)
at org.apache.hadoop.hbase.ipc.RpcClientImpl$Connection$2.run(RpcClientImpl$Connection.java:735)
at org.apache.hadoop.hbase.ipc.RpcClientImpl$Connection$2.run(RpcClientImpl$Connection.java:732)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1614)
at org.apache.hadoop.hbase.ipc.RpcClientImpl$Connection.setupIOstreams(RpcClientImpl$Connection.java:732)
at org.apache.hadoop.hbase.ipc.RpcClientImpl$Connection.writeRequest(RpcClientImpl$Connection.java:885)
at org.apache.hadoop.hbase.ipc.RpcClientImpl$Connection.tracedWriteRequest(RpcClientImpl$Connection.java:854)
at org.apache.hadoop.hbase.ipc.RpcClientImpl.call(RpcClientImpl.java:1180)
at org.apache.hadoop.hbase.ipc.AbstractRpcClient.callBlockingMethod(AbstractRpcClient.java:213)
at org.apache.hadoop.hbase.ipc.AbstractRpcClient$BlockingRpcChannelImplementation.callBlockingMethod(AbstractRpcClient.java:287)
at org.apache.hadoop.hbase.protobuf.generated.RegionServerStatusProtos$RegionServerStatusService$BlockingStub.regionServerStartup(RegionServerStatusProtos.java:8982)
at org.apache.hadoop.hbase.regionserver.HRegionServer.reportForDuty(HRegionServer.java:2260)
at org.apache.hadoop.hbase.regionserver.HRegionServer.run(HRegionServer.java:893)
at java.lang.Thread.run(Thread.java:745) Caused by: GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)
at sun.security.jgss.krb5.Krb5InitCredential.getInstance(Krb5InitCredential.java:147)
at sun.security.jgss.krb5.Krb5MechFactory.getCredentialElement(Krb5MechFactory.java:121)
at sun.security.jgss.krb5.Krb5MechFactory.getMechanismContext(Krb5MechFactory.java:187)
at sun.security.jgss.GSSManagerImpl.getMechanismContext(GSSManagerImpl.java:223)
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:193)
... 18 more 2015-10-20 17:33:18,072 WARN [regionserver/xxx.mycompany.com/172.24.4.60:16201] regionserver.HRegionServer: error telling master we are up com.google.protobuf.ServiceException: java.io.IOException: Could not set up IO Streams to xxx.mycompany.com/172.24.4.60:16000
at org.apache.hadoop.hbase.ipc.AbstractRpcClient.callBlockingMethod(AbstractRpcClient.java:223)
at org.apache.hadoop.hbase.ipc.AbstractRpcClient$BlockingRpcChannelImplementation.callBlockingMethod(AbstractRpcClient.java:287)
at org.apache.hadoop.hbase.protobuf.generated.RegionServerStatusProtos$RegionServerStatusService$BlockingStub.regionServerStartup(RegionServerStatusProtos.java:8982)
at org.apache.hadoop.hbase.regionserver.HRegionServer.reportForDuty(HRegionServer.java:2260)
at org.apache.hadoop.hbase.regionserver.HRegionServer.run(HRegionServer.java:893)
at java.lang.Thread.run(Thread.java:745) Caused by: java.io.IOException: Could not set up IO Streams to xxx.mycompany.com/172.24.4.60:16000
at org.apache.hadoop.hbase.ipc.RpcClientImpl$Connection.setupIOstreams(RpcClientImpl.java:777)
at org.apache.hadoop.hbase.ipc.RpcClientImpl$Connection.writeRequest(RpcClientImpl.java:885)
at org.apache.hadoop.hbase.ipc.RpcClientImpl$Connection.tracedWriteRequest(RpcClientImpl.java:854)
at org.apache.hadoop.hbase.ipc.RpcClientImpl.call(RpcClientImpl.java:1180)
at org.apache.hadoop.hbase.ipc.AbstractRpcClient.callBlockingMethod(AbstractRpcClient.java:213)
... 5 more Caused by: java.lang.RuntimeException: SASL authentication failed. The most likely cause is missing or invalid credentials. Consider 'kinit'.
at org.apache.hadoop.hbase.ipc.RpcClientImpl$Connection$1.run(RpcClientImpl.java:677)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1614)
at org.apache.hadoop.hbase.ipc.RpcClientImpl$Connection.handleSaslConnectionFailure(RpcClientImpl$Connection.java:635)
at org.apache.hadoop.hbase.ipc.RpcClientImpl$Connection.setupIOstreams(RpcClientImpl$Connection.java:743)
... 9 more 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:212)
at org.apache.hadoop.hbase.security.HBaseSaslRpcClient.saslConnect(HBaseSaslRpcClient.java:179)
at org.apache.hadoop.hbase.ipc.RpcClientImpl$Connection.setupSaslConnection(RpcClientImpl$Connection.java:609)
at org.apache.hadoop.hbase.ipc.RpcClientImpl$Connection.access$600(RpcClientImpl$Connection.java:154)
at org.apache.hadoop.hbase.ipc.RpcClientImpl$Connection$2.run(RpcClientImpl$Connection.java:735)
at org.apache.hadoop.hbase.ipc.RpcClientImpl$Connection$2.run(RpcClientImpl$Connection.java:732)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1614)
at org.apache.hadoop.hbase.ipc.RpcClientImpl$Connection.setupIOstreams(RpcClientImpl.java:732)
... 9 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:147)
at sun.security.jgss.krb5.Krb5MechFactory.getCredentialElement(Krb5MechFactory.java:121)
at sun.security.jgss.krb5.Krb5MechFactory.getMechanismContext(Krb5MechFactory.java:187)
at sun.security.jgss.GSSManagerImpl.getMechanismContext(GSSManagerImpl.java:223)
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:193)
... 18 more 2015-10-20 17:33:18,073 WARN [regionserver/xxx.mycompany.com/172.24.4.60:16201] regionserver.HRegionServer: reportForDuty failed; sleeping and then retrying.
Я предполагаю, что Kerberos работает, потому что я могу получить
$ klist -ekt hbase.keytab
Keytab name: FILE:hbase.keytab
KVNO Timestamp Principal
---- ----------------- --------------------------------------------------------
3 10/19/15 17:11:42 hbase/[email protected] (arcfour-hmac)
3 10/19/15 17:11:42 hbase/[email protected] (des3-cbc-sha1)
3 10/19/15 17:11:42 hbase/[email protected] (des-cbc-crc)
$ kinit -kt /opt/hbase.keytab hbase/[email protected]
[userx1@gms-01 logs]$ klist
Ticket cache: FILE:/tmp/krb5cc_2369
Default principal: hbase/[email protected]
Valid starting Expires Service principal
10/20/15 17:49:32 10/21/15 03:49:32 krbtgt/[email protected]
renew until 10/27/15 16:49:32
hbase shell выдает ту же исключение, как указано выше, когда я пытаюсь выполнить команду status (или любую другую)
Если кто-то имеет какие-либо предложения или советы, пожалуйста, дайте мне знать
Заранее спасибо
Я столкнулся с такой же проблемой и решил ее, запустив сервер региона отдельно. Убедитесь, что при запуске демонов у вас есть действительный TGT Kerberos.
Я уже несколько дней пытаюсь решить ту же проблему. Никакого успеха, никакой надежды.
Ответ или решение
Проблема, с которой вы столкнулись, связана с тем, что HBase не может установить соединение с использованием Kerberos, поскольку отсутствует действительный билет TGT (Ticket Granting Ticket). Сообщение об ошибке javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]
указывает на необходимость наличия активного билета Kerberos для успешной аутентификации.
Вот несколько шагов, которые могут помочь вам решить эту проблему:
-
Проверьте наличие TGT:
Убедитесь, что у вас действительно есть действующий TGT. Выполните командуklist
после использованияkinit
с вашим ключевым файлом (keytab). Убедитесь, что срок действия билета не истек.kinit -kt /opt/hbase.keytab hbase/[ваш_принципал]@YOUR.REALM klist
Если вы видите действующий TGT в выводе, это означает, что аутентификация Kerberos работает.
-
Старт HBase с действительными учетными данными:
Убедитесь, что вы запускаете HBase после получения действительного TGT. Рекомендуется сначала выполнитьkinit
, а затем запускать HBase с использованием скриптовstart-hbase.sh
или черезbin/hbase
и т.д. -
Изоляция процесса:
Для диагностики попробуйте запустить RegionServer отдельно. Это поможет выяснить, не возникает ли ошибка в процессе инициализации.bin/hbase-daemon.sh start regionserver
-
Проверка конфигурации Kerberos:
Убедитесь, что в вашей конфигурацииhbase-site.xml
указаны правильные пути к файлам ключа и правильные принципы. Например, убедитесь, что пути кhbase.master.keytab.file
иhbase.regionserver.keytab.file
верны и файлы доступны для чтения. Они должны корректно указывать на файлы ключей. -
Просмотр логов:
Внимательно смотрите логи как HBase, так и KDC, чтобы выявить любые другие потенциальные проблемы или ошибки, которые могут указывать на причину проблемы. -
Настройки krb5.conf:
Проверьте файл конфигурации Kerberos (обычно/etc/krb5.conf
). Убедитесь, что настройки для вашей доменной зоны и KDC верны. Пример настройки может выглядеть следующим образом:[libdefaults] default_realm = YOUR.REALM dns_lookup_realm = false dns_lookup_kdc = true [realms] YOUR.REALM = { kdc = your.kdc.server admin_server = your.kdc.server } [domain_realm] .your.domain = YOUR.REALM your.domain = YOUR.REALM
-
Firewall и порты:
Убедитесь, что ваши брандмауэры (firewall) не блокируют порты, используемые HBase и Kerberos.
Если после выполнения всех этих действий проблема сохраняется, рассмотрите возможность включения отладочной информации в HBase или Kerberos для более детального анализа. Вы также можете обратиться к документации HBase и Kerberos или на форумы сообщества для дополнительных советов.