Устранение неполадок с подключением PolyBase к Kerberos

Применимо: SQL Server (только для Windows)Не поддерживается. База данных SQL AzureНе поддерживается. Azure Synapse Analytics Analytics Не поддерживается. Platform System (PDW)

В PolyBase встроен интерактивный инструмент диагностики, который помогает устранять неполадки с аутентификацией при использовании PolyBase с защищенным Kerberos кластером Hadoop.

В статье приведено пошаговое руководство по использованию этого инструмента для отладки таких проблем.

Совет

Вместо действий, описанных в этом руководстве, можно запустить HDFS Kerberos, чтобы устранить неполадки подключений HDFS Kerberos для Polybase в случае ошибки HDFS Kerberos при создании внешней таблицы в защищенном Kerberos кластере HDFS. Это средство поможет вам исключить проблемы, не связанные с SQL Server, чтобы сосредоточиться на решении проблем установки HDFS Kerberos, а именно — выявлении проблем с неправильной конфигурацией имени пользователя или пароля и неправильной конфигурацией протокола Kerberos для кластера.
Это средство полностью не зависит от SQL Server. Оно доступно в виде Jupyter Notebook и требует Azure Data Studio.

Необходимые компоненты

  1. SQL Server 2016 (13.x) RTM CU6 / SQL Server 2016 (13.x) с пакетом обновления 1 (SP1) и SQL Server 2017 (14.x) или более поздней версии с установленным PolyBase
  2. Кластер Hadoop (Cloudera или Hortonworks), защищенный с помощью Kerberos (Active Directory или MIT)

Введение

В первую очередь рекомендуется понять, как происходит работа протокола Kerberos на высоком уровне. В ней участвуют три субъекта:

  1. клиент Kerberos (SQL Server);
  2. защищаемый ресурс (HDFS, MR2, YARN, журнал заданий и т. д.);
  3. центр распространения ключей (называемый в Active Directory контроллером домена).

Если в кластере Hadoop настроен протокол Kerberos, каждый защищаемый ресурс регистрируется в центре распространения ключей (KDC) с уникальным именем субъекта-службы. Ожидается, что клиенту будет предоставляться временный пользовательский билет на получение билетов, позволяющий запрашивать в KDC билет службы, тоже временный, для доступа к субъекту службы с нужным именем.

При использовании PolyBase, когда на любом защищенном Kerberos ресурсе запрашивается аутентификация, запускается процедура подтверждения, происходящая в четыре этапа:

  1. SQL Server подключается к центру распространения ключей и загружает билет на получение билетов для пользователя. Этот билет шифруется с использованием закрытого ключа от центра.
  2. Затем SQL Server вызывает защищенный ресурс Hadoop (HDFS) и определяет, для какого имени субъекта-службы требуется билет службы.
  3. SQL Server возвращает центру распространения ключей билет на получение билетов, а затем запрашивает у него билет службы для доступа к нужному защищенному ресурсу. Билет службы шифруется закрытым ключом защищенной службы.
  4. SQL Server переадресовывает билет службы в Hadoop и проходит аутентификацию, необходимую для создания сеанса с этой службой.

SQL Server в PolyBase

Проблемы с аутентификацией могут возникать на любых из этих четырех этапов. Для упрощения отладки в PolyBase был встроен диагностический инструмент, который помогает определять точку отказа.

Устранение неполадок

В PolyBase имеются следующие XML-файлы конфигурации, содержащие свойства кластера Hadoop:

  • core-site.xml
  • hdfs-site.xml
  • Hive-site.xml
  • jaas.conf
  • mapred-site.xml
  • yarn-site.xml

Эти файлы находятся в следующей папке:

\[System Drive\]:{install path}\{MSSQL##.INSTANCENAME}\MSSQL\Binn\PolyBase\Hadoop\conf

Например, по умолчанию для SQL Server 2016 (13.x) используется C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Binn\PolyBase\Hadoop\confзначение по умолчанию.

Обновите файл core-site.xml, добавив три приведенных ниже свойства. Задайте значения в соответствии со средой:

<property>
    <name>polybase.kerberos.realm</name>
    <value>CONTOSO.COM</value>
</property>
<property>
    <name>polybase.kerberos.kdchost</name>
    <value>kerberos.contoso.com</value>
</property>
<property>
    <name>hadoop.security.authentication</name>
    <value>KERBEROS</value>
</property>

Примечание.

Значение свойства polybase.kerberos.realm должно быть задано в верхнем регистре.

Если планируется использовать операции передачи, впоследствии нужно будет изменить и другие XML-файлы. Но изменения одного этого файла уже будет достаточно как минимум для доступа к файловой системе HDFS.

Инструмент работает независимо от SQL Server, поэтому его не требуется запускать заранее или перезапускать при изменении XML-конфигураций. Для запуска инструмента выполните на хост-компьютере с установленным SQL Server следующие команды:

> cd C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Binn\PolyBase  
> java -classpath ".\Hadoop\conf;.\Hadoop\*;.\Hadoop\HDP2_2\*" com.microsoft.polybase.client.HdfsBridge {Name Node Address} {Name Node Port} {Service Principal} {Filepath containing Service Principal's Password} {Remote HDFS file path (optional)}

Примечание.

Начиная с SQL Server 2019, при установке компонента PolyBase можно либо указать существующую среду выполнения Java, либо установить AZUL-OpenJDK-JRE. Если выбран AZUL-OpenJDK-JRE, java.exe не будет частью переменной среды $PATH, и может возникнуть ошибка "java" не распознается как внутренняя или внешняя команда, операблная программа или пакетный файл". В этом случае необходимо добавить путь к java.exe в переменную среды сеанса $PATH. Путь установки по умолчанию исполняемого файла Java будет указан следующим образом: C:\Program Files\Microsoft SQL Server\MSSQL15.{имя экземпляра}\AZUL-OpenJDK-JRE\bin. Если это именно этот путь, то перед выполнением команды java для запуска команды средства устранения неполадок подключения Kerberos необходимо выполнить приведенную ниже команду.

set PATH=%PATH%;C:\Program Files\Microsoft SQL Server\MSSQL15.{instance name}\AZUL-OpenJDK-JRE\bin

Аргументы

Аргумент Description
Адрес узла имен IP-адрес или полное доменное имя узла имен. Относится к аргументу LOCATION в вашей инструкции CREATE EXTERNAL DATA SOURCE (T-SQL). Примечание. Версия средства SQL Server 2019 требует , чтобы hdfs:// предшествовать IP-адресу или полному доменному имени.
Порт узла имен Соответствует порту узла имен. Относится к аргументу LOCATION в вашей инструкции CREATE EXTERNAL DATA SOURCE (T-SQL). Например, 8020.
Субъект-служба Субъект-служба администрирования для вашего центра распространения ключей. Соответствует аргументу IDENTITY в инструкции T-SQL CREATE DATABASE SCOPED CREDENTIAL.
Пароль службы Вместо того, чтобы вводить пароль в консоли, сохраните его в файле и передайте сюда путь. Содержимое файла должно соответствовать аргументу SECRET в вашей инструкции CREATE DATABASE SCOPED CREDENTIAL (T-SQL).
Путь к файлу на удаленной HDFS (необязательно) Путь для доступа к существующему файлу. Если его не указать, будет использоваться корневая папка ("/").

Пример

java -classpath ".\Hadoop\conf;.\Hadoop\*;.\Hadoop\HDP2_2\*" com.microsoft.polybase.client.HdfsBridge 10.193.27.232 8020 admin_user C:\temp\kerberos_pass.txt

Полученный результат будет очень подробным, что позволяет проводить тщательную отладку. Но и при использовании MIT, и Active Directory следует в первую очередь обращать внимание на четыре главные контрольные точки. Они соответствуют четырем этапам, описанным выше.

Следующие фрагменты получены при работе с центром распространения ключей MIT. Полные примеры выходных данных для MIT и Active Directory см. в ссылках в конце статьи.

Контрольная точка 1

В выходных данных должен быть шестнадцатеричный дамп билета со значением Server Principal = krbtgt/MYREALM.COM@MYREALM.COM. Его наличие показывает, что сервер SQL Server успешно прошел проверку подлинности в центре распространения ключей и ему был предоставлен билет на получение билетов. Если такого дампа нет, проблема лежит строго между SQL Server и центром и Hadoop здесь ни при чем.

Технология PolyBase не поддерживает установление отношений доверия между Active Directory и MIT, поэтому она должна быть настроена на тот же центр получения ключей, что и Hadoop-кластер. В таких средах вы можете вручную создать в центре учетную запись службы и использовать ее для аутентификации.

|>>> KrbAsReq creating message 
 >>> KrbKdcReq send: kdc=kerberos.contoso.com UDP:88, timeout=30000, number of retries =3, #bytes=143 
 >>> KDCCommunication: kdc=kerberos.contoso.com UDP:88, timeout=30000,Attempt =1, #bytes=143 
 >>> KrbKdcReq send: #bytes read=646 
 >>> KdcAccessibility: remove kerberos.contoso.com 
 >>> EType: sun.security.krb5.internal.crypto.Des3CbcHmacSha1KdEType 
 >>> KrbAsRep cons in KrbAsReq.getReply myuser 
 [2017-04-25 21:34:33,548] INFO 687[main] - com.microsoft.polybase.client.KerberosSecureLogin.secureLogin(KerberosSecureLogin.java:97) - Subject: 
 Principal: admin_user@CONTOSO.COM 
 Private Credential: Ticket (hex) = 
 0000: 61 82 01 48 30 82 01 44 A0 03 02 01 05 A1 0E 1B a..H0..D........ 
 0010: 0C 41 50 53 48 44 50 4D 53 2E 43 4F 4D A2 21 30 .CONTOSO.COM.!0 
 0020: 1F A0 03 02 01 02 A1 18 30 16 1B 06 6B 72 62 74 ........0...krbt 
 0030: 67 74 1B 0C 41 50 53 48 44 50 4D 53 2E 43 4F 4D gt..CONTOSO.COM 
 0040: A3 82 01 08 30 82 01 04 A0 03 02 01 10 A1 03 02 ....0........... 
 *[...Condensed...]* 
 0140: 67 6D F6 41 6C EB E0 C3 3A B2 BD B1 gm.Al...:... 
 Client Principal = admin_user@CONTOSO.COM 
 Server Principal = krbtgt/CONTOSO.COM@CONTOSO.COM 
 *[...Condensed...]* 
 [2017-04-25 21:34:34,500] INFO 1639[main] - com.microsoft.polybase.client.HdfsBridge.main(HdfsBridge.java:1579) - Successfully authenticated against KDC server. 

Контрольная точка 2

PolyBase пытается получить доступ к HDFS и не может это сделать, так как запрос не содержит нужного билета службы.

 [2017-04-25 21:34:34,501] INFO 1640[main] - com.microsoft.polybase.client.HdfsBridge.main(HdfsBridge.java:1584) - Attempting to access external filesystem at URI: hdfs://10.193.27.232:8020 
 Found ticket for admin_user@CONTOSO.COM to go to krbtgt/CONTOSO.COM@CONTOSO.COM expiring on Wed Apr 26 21:34:33 UTC 2017 
 Entered Krb5Context.initSecContext with state=STATE_NEW 
 Found ticket for admin_user@CONTOSO.COM to go to krbtgt/CONTOSO.COM@CONTOSO.COM expiring on Wed Apr 26 21:34:33 UTC 2017 
 Service ticket not found in the subject 

Контрольная точка 3

Второй шестнадцатеричный дамп показывает, что SQL Server успешно воспользовался билетом на получение билетов и загрузил из центра распространения ключей нужный билет для имени субъекта-службы в узле имен.

 >>> KrbKdcReq send: kdc=kerberos.contoso.com UDP:88, timeout=30000, number of retries =3, #bytes=664 
 >>> KDCCommunication: kdc=kerberos.contoso.com UDP:88, timeout=30000,Attempt =1, #bytes=664 
 >>> KrbKdcReq send: #bytes read=669 
 >>> KdcAccessibility: remove kerberos.contoso.com 
 >>> EType: sun.security.krb5.internal.crypto.Des3CbcHmacSha1KdEType 
 >>> KrbApReq: APOptions are 00100000 00000000 00000000 00000000 
 >>> EType: sun.security.krb5.internal.crypto.Des3CbcHmacSha1KdEType 
 Krb5Context setting mySeqNumber to: 1033039363 
 Created InitSecContextToken: 
 0000: 01 00 6E 82 02 4B 30 82 02 47 A0 03 02 01 05 A1 ..n..K0..G...... 
 0010: 03 02 01 0E A2 07 03 05 00 20 00 00 00 A3 82 01 ......... ...... 
 0020: 63 61 82 01 5F 30 82 01 5B A0 03 02 01 05 A1 0E ca.._0..[....... 
 0030: 1B 0C 41 50 53 48 44 50 4D 53 2E 43 4F 4D A2 26 ..CONTOSO.COM.& 
 0040: 30 24 A0 03 02 01 00 A1 1D 30 1B 1B 02 6E 6E 1B 0$.......0...nn. 
 0050: 15 73 68 61 73 74 61 2D 68 64 70 32 35 2D 30 30 .hadoop-hdp25-00 
 0060: 2E 6C 6F 63 61 6C A3 82 01 1A 30 82 01 16 A0 03 .local....0..... 
 0070: 02 01 10 A1 03 02 01 01 A2 82 01 08 04 82 01 04 ................ 
 *[...Condensed...]* 
 0240: 03 E3 68 72 C4 D2 8D C2 8A 63 52 1F AE 26 B6 88 ..hr.....cR..&.. 
 0250: C4 . 

Контрольная точка 4

Наконец, должны выводиться свойства файла по целевому пути и подтверждение. Свойства файла подтверждают, что SQL Server прошел в Hadoop проверку подлинности с билетом службы и был создан сеанс для доступа к защищенному ресурсу.

Достижение этой точки подтверждает, что: (i) три субъекта могут обмениваться друг с другом данными, (ii) файлы core-site.xml и jaas.conf корректные, (iii) центр распространения ключей подтвердил ваши учетные данные.

 [2017-04-25 21:34:35,096] INFO 2235[main] - com.microsoft.polybase.client.HdfsBridge.main(HdfsBridge.java:1586) - File properties for "/": FileStatus{path=hdfs://10.193.27.232:8020/; isDirectory=true; modification_time=1492028259862; access_time=0; owner=hdfs; group=hdfs; permission=rwxr-xr-x; isSymlink=false} 
 [2017-04-25 21:34:35,098] INFO 2237[main] - com.microsoft.polybase.client.HdfsBridge.main(HdfsBridge.java:1587) - Successfully accessed the external file system. 

Распространенные ошибки

Если после запуска инструмента не были выведены свойства файла по целевому пути (контрольная точка 4), в ходе работы должно было быть выдано исключение. Проверьте его и рассмотрите контекст, то есть на каком из четырех этапов потока оно возникло. Рассмотрите по порядку следующие распространенные проблемы, которые могли возникнуть:

Исключение и сообщения Причина
org.apache.hadoop.security.AccessControlException
Не включена аутентификация SIMPLE. Доступно: [TOKEN, KERBEROS]
В файле "core-site.xml" для свойства "hadoop.security.authentication" не задано значение KERBEROS.
javax.security.auth.login.LoginException
Клиент не найден в базе данных Kerberos (6) — CLIENT_NOT_FOUND
Предоставленная субъект-служба администрирования не существует в области, указанной в файле "core-site.xml".
javax.security.auth.login.LoginException
Сбой контрольной суммы
Субъект-служба администрирования существует, но отправлен неправильный пароль.
Имя собственной конфигурации: C:\Windows\krb5.ini
Загружено из собственной конфигурации
Это сообщение указывает, что модуль Java krb5LoginModule обнаружил на вашем компьютере настроенные конфигурации клиента. Проверьте параметры настроенного клиента, так как они могут быть причиной проблемы.
javax.security.auth.login.LoginException
java.lang.IllegalArgumentException
Недопустимое имя admin_user@CONTOSO.COMсубъекта: org.apache.hadoop.security.authentication.util.KerberosName$NoMatchingRule: нет правил, применяемых к admin_user@CONTOSO.COM
Добавьте свойство hadoop.security.auth_to_local в файл core-site.xml с необходимыми правилами для Hadoop-кластера.
java.net.ConnectException
Попытка доступа к внешней файловой системе с универсальным кодом ресурса hdfs://10.193.27.230:8020
Сбой вызова с IAAS16981207/10.107.0.245 на 10.193.27.230:8020 с исключением подключения
Аутентификация в центре распространения ключей прошла успешно, но не удалось получить доступ к узлу имен Hadoop. Проверьте IP-адрес и порт узла имен. На Hadoop не должен работать брандмауэр.
java.io.FileNotFoundException
Файл не существует: /test/data.csv
Аутентификация прошла успешно, но указанного расположения не существует. Проверьте путь или попробуйте сначала использовать корневую папку ("/").

Советы по отладке

Центр распространения ключей MIT

Все имена субъектов-служб, зарегистрированные в KDC, включая администраторов, можно просматривать, выполнив список списков kadmin.local> (admin login)> на узле KDC или любом настроенном клиенте KDC. Если Kerberos настроен правильно в кластере Hadoop, для каждого из служб, доступных в кластере (например, , , , и т. д.) должен быть один поставщик услуг для каждого из служб, доступных в кластере (например, nn, yarndnrm, spnegoи т. д.). Соответствующие файлы keytab (замены паролей) можно увидеть в разделе /etc/security/keytabs по умолчанию. Они шифруются с использованием закрытого ключа центра распространения ключей.

Попробуйте также проверить учетные данные администратора в центре распространения ключей локально с помощью инструмента kinit. Пример его использования: kinit identity@MYREALM.COM. Если запрашивается пароль, значит, такой идентификатор существует.
Журналы центра распространения ключей по умолчанию находятся здесь: /var/log/krb5kdc.log. Они включают все запросы билетов и IP-адрес клиента, с которого поступал запрос. Должно быть два запроса с IP-адреса компьютера SQL Server, в котором было запущено средство: сначала для TGT из сервера проверки подлинности в качестве AS_REQ, а затем TGS_REQ для ST из сервера предоставления билетов.

 [root@MY-KDC log]# tail -2 /var/log/krb5kdc.log 
 May 09 09:48:26 MY-KDC.local krb5kdc[2547](info): **AS_REQ** (3 etypes {17 16 23}) 10.107.0.245: ISSUE: authtime 1494348506, etypes {rep=16 tkt=16 ses=16}, admin_user@CONTOSO.COM for **krbtgt/CONTOSO.COM@CONTOSO.COM** 
 May 09 09:48:29 MY-KDC.local krb5kdc[2547](info): **TGS_REQ** (3 etypes {17 16 23}) 10.107.0.245: ISSUE: authtime 1494348506, etypes {rep=16 tkt=16 ses=16}, admin_user@CONTOSO.COM for **nn/hadoop-hdp25-00.local@CONTOSO.COM** 

Active Directory

В Active Directory имена субъектов-служб можно просмотреть, перейдя к панель управления Пользователи и компьютеры Active Directory > >MyRealm>MyOrganizationalUnit. Если для кластера Hadoop корректно настроена защита Kerberos, имена субъектов-служб должны иметься для каждой из доступных служб (например, nn, dn, rm, yarn, spnego и т. д.).

Общие советы по отладке

Рекомендуется ознакомиться с журналами и отладкой проблем Kerberos, которые не зависят от функции PolyBase SQL Server.

Если у вас возникают проблемы с доступом посредством Kerberos, выполните указанные ниже действия по отладке.

  1. Убедитесь, что вы можете получить доступ к данным Kerberos HDFS извне SQL Server. Вы можете сделать одно из двух:

    • Создайте свою программу на Java или

    • используйте класс HdfsBridge из папки установки PolyBase. Например:

      -classpath ".\Hadoop\conf;.\Hadoop\*;.\Hadoop\HDP2_2\*" com.microsoft.polybase.client.HdfsBridge 10.193.27.232 8020 admin_user C:\temp\kerberos_pass.txt
      

    В приведенном выше примере admin_user включает в себя только имя пользователя, но не доменное имя.

  2. Если вы не можете получить доступ к данным Kerberos HDFS извне PolyBase:

    • Существует два типа проверки подлинности Kerberos: проверка подлинности Kerberos Active Directory и проверка подлинности MIT Kerberos.
    • Убедитесь в том, что пользователь имеется в учетной записи домена, и используйте ту же учетную запись пользователя при попытке доступа к HDFS.
  3. Если применяется проверка подлинности Kerberos в Active Directory, убедитесь в том, что при использовании команды klist в Windows отображается кэшированный билет.

    • Войдите на компьютер PolyBase и запустите klist и klist tgt в командной строке, чтобы узнать, правильны ли ключевые показатели эффективности, имя пользователя и типы шифрования.
  4. Если центр распространения ключей поддерживает только алгоритм AES256, должны быть установлены файлы политик JCE.

См. также

Integrating PolyBase with Cloudera using Active Directory Authentication (Интеграция PolyBase и Cloudera с помощью аутентификации Active Directory)
Руководство Cloudera по настройке Kerberos для CDH
Руководство Hortonworks по настройке Kerberos для HDP
Устранение неполадок c PolyBase
Ошибки в PolyBase и возможные решения