HBase Kerberos SaslException: Ошибка инициализации GSS (Уровень механизма: Не удалось найти ни одного Kerberos tgt)

Вопрос или проблема

Я пытаюсь настроить аутентификацию 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 для успешной аутентификации.

Вот несколько шагов, которые могут помочь вам решить эту проблему:

  1. Проверьте наличие TGT:
    Убедитесь, что у вас действительно есть действующий TGT. Выполните команду klist после использования kinit с вашим ключевым файлом (keytab). Убедитесь, что срок действия билета не истек.

    kinit -kt /opt/hbase.keytab hbase/[ваш_принципал]@YOUR.REALM
    klist

    Если вы видите действующий TGT в выводе, это означает, что аутентификация Kerberos работает.

  2. Старт HBase с действительными учетными данными:
    Убедитесь, что вы запускаете HBase после получения действительного TGT. Рекомендуется сначала выполнить kinit, а затем запускать HBase с использованием скриптов start-hbase.sh или через bin/hbase и т.д.

  3. Изоляция процесса:
    Для диагностики попробуйте запустить RegionServer отдельно. Это поможет выяснить, не возникает ли ошибка в процессе инициализации.

    bin/hbase-daemon.sh start regionserver
  4. Проверка конфигурации Kerberos:
    Убедитесь, что в вашей конфигурации hbase-site.xml указаны правильные пути к файлам ключа и правильные принципы. Например, убедитесь, что пути к hbase.master.keytab.file и hbase.regionserver.keytab.file верны и файлы доступны для чтения. Они должны корректно указывать на файлы ключей.

  5. Просмотр логов:
    Внимательно смотрите логи как HBase, так и KDC, чтобы выявить любые другие потенциальные проблемы или ошибки, которые могут указывать на причину проблемы.

  6. Настройки 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
  7. Firewall и порты:
    Убедитесь, что ваши брандмауэры (firewall) не блокируют порты, используемые HBase и Kerberos.

Если после выполнения всех этих действий проблема сохраняется, рассмотрите возможность включения отладочной информации в HBase или Kerberos для более детального анализа. Вы также можете обратиться к документации HBase и Kerberos или на форумы сообщества для дополнительных советов.

Оцените материал
Добавить комментарий

Капча загружается...