Compartilhar via


Solucionar problemas de conectividade do PolyBase Kerberos

Aplica-se a: SQL Server 2016 (13.x) e versões posteriores no Windows

Para solucionar problemas de autenticação ao usar o PolyBase com um cluster Hadoop protegido por Kerberos, use o diagnóstico interativo integrado ao PolyBase.

Este artigo serve como um guia para orientar o processo de depuração desses problemas usando essas ferramentas de diagnóstico internas.

Dica

Em vez de seguir as etapas neste guia, você pode optar por executar o Testador Kerberos do HDFS para solucionar problemas de conexões Kerberos do HDFS para o PolyBase, quando enfrentar uma falha de Kerberos do HDFS ao criar uma tabela externa em um cluster HDFS protegido pelo Kerberos.

Essa ferramenta ajuda a descartar problemas que não são do SQL Server, para ajudá-lo a se concentrar na resolução de problemas de instalação kerberos do HDFS, ou seja, identificar problemas com configurações incorretas de nome de usuário/senha e configurações incorretas de configuração do Kerberos do cluster.

Essa ferramenta é independente do SQL Server. Ele está disponível como um Jupyter Notebook e requer o Azure Data Studio.

Pré-requisitos

  1. SQL Server 2016 (13.x) RTM CU6/SQL Server 2016 (13.x) SP1 CU3/SQL Server 2017 (14.x) ou versões posteriores com o PolyBase instalado

  2. Um cluster Hadoop (Cloudera ou Hortonworks) protegido por Kerberos (Active Directory ou MIT)

Introdução

Primeiramente, é necessário entender o protocolo Kerberos em um alto nível. Três atores estão envolvidos:

  1. O cliente Kerberos (SQL Server)
  2. O recurso protegido (HDFS, MR2, YARN, histórico de trabalhos etc.)
  3. Centro de distribuição de chaves (conhecido como um controlador de domínio no Active Directory)

Ao configurar o Kerberos no cluster Hadoop, você registra cada recurso protegido do Hadoop no KDC (Centro de Distribuição de Chaves) com um SPN (Nome exclusivo da Entidade de Serviço). O cliente precisa obter um tíquete de usuário temporário, chamado tíquete de concessão de tíquete (TGT), para que ele possa solicitar outro tíquete temporário, chamado de Tíquete de Serviço (ST), do KDC para o SPN específico que deseja acessar.

No PolyBase, quando você solicita a autenticação em qualquer recurso protegido por Kerberos, ocorre o handshake de quatro etapas a seguir:

  1. O SQL Server conecta-se ao KDC e obtém um TGT para o usuário. A chave privada KDC criptografa o TGT.

  2. O SQL Server chama o recurso protegido do Hadoop, HDFS e determina qual SPN necessita de um ST.

  3. O SQL Server volta para o KDC, passa o TGT novamente e solicita um ST para acessar o recurso protegido específico. A chave privada do serviço protegido criptografa o ST.

  4. O SQL Server encaminha o ST para o Hadoop e é autenticado para criar uma sessão nesse serviço.

Diagrama do PolyBase no SQL Server.

Os problemas com a autenticação se enquadram em uma ou mais das etapas anteriores. Para ajudar na depuração mais rápida, o PolyBase fornece uma ferramenta de diagnóstico integrada para ajudar a identificar o ponto de falha.

Solução de problemas

O PolyBase usa os seguintes arquivos XML de configuração para armazenar propriedades do cluster Hadoop:

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

Você pode encontrar esses arquivos no seguinte caminho:

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

Por exemplo, o caminho padrão para o SQL Server 2016 (13.x) é C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Binn\PolyBase\Hadoop\conf.

Edite core-site.xml e adicione essas propriedades. Defina os valores de acordo com seu ambiente:

<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>

Observação

O valor da polybase.kerberos.realm propriedade precisa ser todo maiúsculo.

Você precisará atualizar os outros arquivos XML se quiser habilitar operações de pushdown. Você pode acessar o sistema de arquivos HDFS apenas com este arquivo configurado.

A ferramenta é executada independentemente do SQL Server, portanto, ela não precisa ser executada. Você não precisará reiniciá-lo se atualizar os arquivos XML de configuração. Para executar a ferramenta, execute os comandos a seguir no host com o SQL Server instalado:

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)}

No SQL Server 2019 (15.x) e versões posteriores, ao instalar o recurso PolyBase, você pode referenciar um Ambiente de Runtime Java existente, ou instalar o AZUL-OpenJDK-JRE. Se você selecionar AZUL-OpenJDK-JRE, java.exe não faz parte da variável de $PATH ambiente e pode encontrar o erro

'java' isn't recognized as an internal or external command, operable program or batch file.

Se esse erro ocorrer, você precisará adicionar o caminho à variável de ambiente da sessão java.exe$PATH. O caminho de instalação padrão do executável Java é C:\Program Files\Microsoft SQL Server\MSSQL15.<instance name>\AZUL-OpenJDK-JRE\bin. Se esse for o caminho, você precisará executar o comando a seguir antes de executar o java comando para executar a ferramenta de solução de problemas de conectividade Kerberos.

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

Argumentos

Argument Descrição
Endereço do nó de nome O IP ou FQDN do nó de nome. Refere-se ao argumento "LOCATION" na sua CREATE EXTERNAL DATA SOURCE Transact-SQL. Observação: a versão 2019 da ferramenta SQL Server requer que hdfs:// anteceda o endereço IP ou o FQDN.
Porta do nó de nome A porta do nó de nome. Refere-se ao argumento "LOCATION" em seu CREATE EXTERNAL DATA SOURCE T-SQL. Por exemplo, 8020.
Entidade de Serviço A entidade de serviço do administrador para o KDC. Corresponde ao argumento "IDENTITY" no seu CREATE DATABASE SCOPED CREDENTIAL T-SQL.
Senha do serviço Em vez de digitar a senha no console, armazene-a em um arquivo e passe o caminho do arquivo aqui. O conteúdo do arquivo deve corresponder ao usado como seu argumento "SECRET" no seu CREATE DATABASE SCOPED CREDENTIAL T-SQL.
Caminho do arquivo HDFS remoto (opcional) O caminho de um arquivo existente a ser acessado. Se não for especificado, a pasta raiz (/) será usada.

Exemplos

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

A saída é detalhada para depuração aprimorada, mas há apenas quatro pontos de verificação principais para procurar, independentemente de você estar usando o MIT ou o AD. Eles correspondem às quatro etapas descritas anteriormente.

Os seguintes trechos são de um MIT KDC. Consulte as saídas de exemplo completas do MIT e do AD no final deste artigo no conteúdo relacionado.

Ponto de verificação 1

Deve haver um despejo hexadecimal de um tíquete com Server Principal = krbtgt/MYREALM.COM@MYREALM.COM. Isso indica que o SQL Server foi autenticado com êxito no KDC e recebeu um TGT. Caso contrário, o problema está estritamente entre o SQL Server e o KDC, e não no Hadoop.

O PolyBase não dá suporte a relações de confiança entre o AD e o MIT e deve ser configurado no mesmo KDC configurado no cluster Hadoop. Nesses ambientes, crie manualmente uma conta de serviço nesse KDC e use-a para executar a autenticação.

>>> 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.

Ponto de verificação 2

O PolyBase tenta acessar o HDFS e falha porque a solicitação não continha o Tíquete de Serviço necessário.

[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

Ponto de verificação 3

Um segundo dump hexadecimal mostra que o SQL Server usa com êxito o TGT e obtém o Tíquete de Serviço correto para o SPN do nó de nome a partir do KDC.

>>> 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 .

Ponto de verificação 4

Por fim, as propriedades do arquivo do caminho de destino são impressas junto com uma mensagem de confirmação. As propriedades do arquivo confirmam que o SQL Server é autenticado pelo Hadoop usando o ST e concede uma sessão para acessar o recurso protegido.

Chegar a esse ponto confirma que: (i) os três atores se comunicam corretamente, (ii) o core-site.xml e jaas.conf estão corretos, e (iii) seu KDC reconhece suas credenciais.

[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.

Erros comuns

Se você executar a ferramenta e as propriedades do arquivo do caminho de destino não imprimirem (Ponto de Verificação 4), uma exceção deverá ser lançada no meio do caminho. Examine-a e considere o contexto do fluxo de quatro etapas em que ela ocorreu. Considere os seguintes problemas comuns que podem ocorrer, na ordem:

Exceção e mensagens Causa
org.apache.hadoop.security.AccessControlException
SIMPLE authentication is not enabled. Available:[TOKEN, KERBEROS]
O core-site.xml arquivo não define a hadoop.security.authentication propriedade como KERBEROS.
javax.security.auth.login.LoginException
Client not found in Kerberos database (6) - CLIENT_NOT_FOUND
A principal de serviço de administrador não existe no realm especificado em core-site.xml.
javax.security.auth.login.LoginException
Checksum failed
O administrador de Entidade de Serviço existe, mas a senha está incorreta.
Native config name: C:\Windows\krb5.ini
Loaded from native config
Esta mensagem indica que o krb5LoginModule do Java detectou configurações personalizadas do cliente em seu computador. Verifique as configurações personalizadas do cliente, pois elas podem estar causando o problema.
javax.security.auth.login.LoginException
java.lang.IllegalArgumentException
Illegal principal name <admin_user@CONTOSO.COM>: org.apache.hadoop.security.authentication.util.KerberosName$NoMatchingRule: No rules applied to <admin_user@CONTOSO.COM>
Adicione a propriedade hadoop.security.auth_to_local a core-site.xml com as regras apropriadas de acordo com o cluster Hadoop.
java.net.ConnectException
Attempting to access external filesystem at URI: hdfs://10.193.27.230:8020
Call From IAAS16981207/10.107.0.245 to 10.193.27.230:8020 failed on connection exception
A autenticação no KDC é bem-sucedida, mas falha ao acessar o namenode do Hadoop. Verifique o IP e a porta do nó de nome. Verifique se que o firewall está desabilitado no Hadoop.
java.io.FileNotFoundException
File does not exist: /test/data.csv
A autenticação é bem-sucedida, mas o local especificado não existe. Verifique o caminho ou teste com a raiz / primeiro.

Dicas de depuração

MIT KDC

Você pode exibir todos os SPNs registrados com o KDC, incluindo os administradores, executando listprincs>> (conta de administrador) no host KDC ou em qualquer cliente KDC configurado. Se você configurar corretamente o Kerberos no cluster Hadoop, deverá haver um SPN para cada serviço disponível no cluster (por exemplo: nn, , dn, rm, yarne spnegoassim por diante). Você pode ver os arquivos de keytab correspondentes (substitutos de senha) em /etc/security/keytabs, por padrão. A chave privada KDC criptografa esses arquivos.

Para verificar as credenciais de administrador no KDC localmente, use kinit. Por exemplo, você pode executar kinit identity@MYREALM.COM. Se a identidade existir, você será solicitado a fornecer uma senha.

Os logs KDC estão disponíveis em /var/log/krb5kdc.log, por padrão. Os logs incluem todas as solicitações de tíquetes, incluindo o IP do cliente que fez a solicitação. Deve haver duas solicitações do IP do computador do SQL Server em que você executou a ferramenta: primeiro para o TGT do Servidor de Autenticação como um AS_REQ, seguido por um TGS_REQ para o ST do Servidor de Concessão de Tickets.

[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

No Active Directory, você pode exibir os SPNs navegando até Painel de Controle>Usuários e Computadores do Active Directory, em seguida, indo para <MyRealm> e selecionando <MyOrganizationalUnit>. Se você configurar corretamente o Kerberos no cluster Hadoop, haverá um SPN para cada serviço disponível no cluster (por exemplo: nn, , dn, rm, yarne spnegoassim por diante).

Dicas gerais de depuração

É útil ter alguma experiência em Java para examinar os logs e solucionar os problemas Kerberos, que são independentes do recurso PolyBase do SQL Server.

Se você ainda estiver tendo problemas para acessar Kerberos, siga estas etapas para depurar:

  1. Verifique se você consegue acessar os dados do HDFS Kerberos de fora do SQL server. Você pode:

    • Escreva seu próprio programa Java ou use HdfsBridge a classe da pasta de instalação do PolyBase. Por exemplo:

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

    No exemplo anterior, admin_user inclui apenas o nome de usuário – não qualquer parte de domínio.

  2. Se você não consegue acessar dados do HDFS do Kerberos de fora do PolyBase:

    • Há dois tipos de autenticação Kerberos: autenticação Kerberos do Active Directory e autenticação MIT Kerberos.

    • Verifique se o usuário existe na conta de domínio e use a mesma conta de usuário ao tentar acessar o HDFS.

  3. Para o Active Directory Kerberos, verifique se você pode ver um tíquete em cache usando o comando klist no Windows.

    Conecte-se ao computador PolyBase e execute klist e klist tgt no prompt de comando para ver se os tipos de KDC, nome de usuário e criptografia estão corretos.

  4. Se o KDC puder dar suporte apenas ao AES-256, verifique se os arquivos de política JCE estão instalados.