Solucionar problemas de conectividade do PolyBase Kerberos

Aplica-se a: SQL Server (somente Windows) Not supported. Banco de Dados SQL do Azure Not supported. Azure Synapse Analytics Not supported. PDW (Analytics Platform System)

Você pode usar o diagnóstico interativo, interno no PolyBase, para ajudar a solucionar problemas de autenticação no uso do PolyBase em um cluster Hadoop protegido por Kerberos.

Este artigo descreve o processo de depuração desses problemas por dessa ferramenta interna de diagnóstico.

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 ajudará a resolver problemas não relativos ao SQL Server, para ajudá-lo a se concentrar na resolução de problemas de configuração de Kerberos do HDFS, principalmente identificando problemas com configurações incorretas de nome de usuário/senha e configurações incorretas de instalação de Kerberos em clusters.
Essa ferramenta é completamente independente do SQL Server. Ela 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. Há três atores 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)

Cada recurso protegido do Hadoop é registrado no KDC (Centro de Distribuição de Chaves) com um único SPN (Nome da Entidade de Serviço) quando o Kerberos é configurado no cluster Hadoop. A meta é que o cliente obtenha um tíquete de usuário temporário, chamado Tíquete de Concessão de Tíquete (TGT), para solicitar outro tíquete temporário, chamado Tíquete de Serviço (ST) ao KDC no SPN específico que se deseja acessar.

No PolyBase, quando uma autenticação é solicitada em qualquer recurso protegido por Kerberos, o handshake com quatro viagens de ida e volta a seguir ocorre:

  1. O SQL Server se conecta ao KDC e obtém um TGT para o usuário. O TGT é criptografado usando a chave privada do KDC.
  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. O ST é criptografado usando a chave privada protegida do serviço.
  4. O SQL Server encaminha o ST para o Hadoop e é autenticado para criar uma sessão nesse serviço.

Polybase SQL Server

Problemas com a autenticação se encaixam em uma ou mais das quatro etapas acima. Para acelerar a depuração, o PolyBase introduziu uma ferramenta de diagnóstico integrada para ajudar a identificar o ponto de falha.

Solução de problemas

O PolyBase tem os seguintes arquivos XML de configuração contendo as propriedades do cluster Hadoop:

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

Esses arquivos estão localizados em:

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

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

Atualize core-site.xml e adicione as três propriedades abaixo. Defina os valores de acordo com o 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 propriedade polybase.kerberos.realm precisa estar todo em letras maiúsculas.

Posteriormente, será necessário atualizar os outros XMLs se você quiser realizar operações de aplicação. No entanto, apenas com a configuração desse arquivo, pelo menos o sistema de arquivos HDFS poderá ser acessado.

A ferramenta é executada independentemente do SQL Server, portanto, ela não precisa estar em execução ou ser reiniciada se as XMLs de configuração forem atualizadas. 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)}

Observação

Desde o SQL Server 2019, ao instalar o recurso PolyBase, você pode referenciar um Java Runtime Environment existente ou instalar AZUL-OpenJDK-JRE. Se AZUL-OpenJDK-JRE for selecionado, java.exe não fará parte da variável de ambiente $PATH e você poderá encontrar o erro “'java' não é reconhecido como um comando interno ou externo, programa operável ou arquivo em lotes”. Se isso ocorrer, você precisará adicionar o caminho para java.exe à variável de ambiente $PATH da sessão. O caminho de instalação padrão do executável java será C:\Program Files\Microsoft SQL Server\MSSQL15.{nome da instância}\AZUL-OpenJDK-JRE\bin. Se esse for o caminho, você precisará executar as etapas a seguir antes de executar o comando java para executar o comando da ferramenta de Solução de Problemas de Conectividade do 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" em seu CREATE EXTERNAL DATA SOURCE T-SQL. Observação: a versão do SQL Server 2019 da ferramenta requer que hdfs:// preceda o IP ou 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 estiver especificado, a raiz "/" será usada.

Exemplo

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 avançada, 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 acima.

Os seguintes trechos são de um MIT KDC. É possível consultar saídas de exemplo do MIT e do AD no final deste artigo, nas Referências.

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 oferece 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, criar uma conta de serviço manualmente no KDC em questão e usá-la para executar a autenticação funcionará.

|>>> 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 tentará acessar o HDFS e falhará, pois 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 despejo hexadecimal indica que o SQL Server utilizou o TGT com êxito e adquiriu o tíquete de serviço aplicável para o SPN do nó do nome 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 de arquivo do caminho de destino devem ser impressas junto com uma mensagem de confirmação. As propriedades do arquivo confirmam que o SQL Server foi autenticado pelo Hadoop usando o ST e uma sessão foi concedida para acessar o recurso protegido.

Ao atingir esse ponto, confirma-se que: (i) os três atores são capazes de se comunicar corretamente, (ii) o core-site.xml e o jaas.conf estão corretos e (iii) o KDC reconheceu as 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 a ferramenta foi executada e as propriedades de arquivo do caminho de destino não foram impressas (Ponto de verificação 4), deve haver uma exceção no centro. Examine-a e considere o contexto do fluxo de quatro etapas em que ela ocorreu. Considere os seguintes problemas comuns que podem ter ocorrido, em ordem:

Exceção e mensagens Causa
org.apache.hadoop.security.AccessControlException
A autenticação SIMPLES não está habilitada. Disponível:[TOKEN, KERBEROS]
O core-site.xml não tem a propriedade hadoop.security.authentication definida como "KERBEROS".
javax.security.auth.login.LoginException
Cliente não encontrado no banco de dados do Kerberos (6) – CLIENT_NOT_FOUND
O administrador de Entidade de Serviço fornecido não existe no realm especificado em core-site.xml.
javax.security.auth.login.LoginException
Houve uma falha na soma de verificação
O administrador de Entidade de Serviço existe, mas a senha está incorreta.
Nome de configuração nativa: C:\Windows\krb5.ini
Carregado da configuração nativa
Esta mensagem indica que o krb5LoginModule do Java detectou configurações personalizadas do cliente em seu computador. Verifique as configurações de cliente personalizadas que podem estar causando o problema.
javax.security.auth.login.LoginException
java.lang.IllegalArgumentException
Nome da entidade de segurança ilícita admin_user@CONTOSO.COM: org.apache.hadoop.security.authentication.util.KerberosName$NoMatchingRule: nenhuma regra foi aplicada a admin_user@CONTOSO.COM
Adicione a propriedade “hadoop.security.auth_to_local” ao core-site.xml com as regras apropriadas por cluster Hadoop.
java.net.ConnectException
A tentativa de acessar o sistema de arquivos externo no URI: hdfs://10.193.27.230:8020
Houve uma falha na chamada de IAAS16981207/10.107.0.245 to 10.193.27.230:8020 na exceção de conexão
A autenticação do KDC foi bem-sucedida, mas não conseguiu acessar o nó de nome do Hadoop. Verifique o IP e a porta do nó de nome. Verifique se que o firewall está desabilitado no Hadoop.
java.io.FileNotFoundException
O arquivo não existe: /test/data.csv
A autenticação foi bem-sucedida, mas o local especificado não existe. Verifique o caminho ou teste com a raiz "/" primeiro.

Dicas de depuração

MIT KDC

Todos os SPNs registrados com o KDC, incluindo os administradores, podem ser exibidos por meio da execução de kadmin.local> (logon do administrador) >listprincs no host do KDC ou em qualquer cliente do KDC. Se o Kerberos estiver configurado corretamente no cluster do Hadoop, deverá haver um SPN para cada um dos serviços disponíveis no cluster (por exemplo: nn, dn, rm, yarn, spnego etc.). Por padrão, os arquivos keytab correspondentes (substitutos de senha) podem ser vistos em /etc/security/keytabs. Eles são criptografados usando a chave privada do KDC.

Também considere usar a ferramenta kinit para verificar as credenciais de administrador no KDC localmente. Um exemplo de uso seria: kinit identity@MYREALM.COM. Um prompt de senha indica que a identidade existe.
Os logs do KDC estão disponíveis em /var/log/krb5kdc.log por padrão, que inclui todas as solicitações de tíquetes, bem como o IP do cliente que fez a solicitação. Deve haver duas solicitações do IP da computador do SQL Server onde a ferramenta foi executada: primeiro para o TGT do Servidor de Autenticação como AS_REQ, seguido de um TGS_REQ para o ST do Servidor de Concessão de Tíquetes.

 [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, os SPNs podem ser exibidos por meio do Painel de Controle > Usuários e Computadores do Active Directory >MyRealm>MyOrganizationalUnit. Se o Kerberos está configurado corretamente no cluster do Hadoop, há um SPN para cada um dos serviços disponíveis (por exemplo: nn, dn, rm, yarn, spnego etc.)

Dicas gerais de depuração

É útil ter alguma experiência em java para examinar os logs e depurar os problemas de Kerberos, que são independentes do recurso PolyBase do SQL server.

Se você ainda estiver com problemas para acessar o Kerberos, siga as etapas abaixo para depurar:

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

    • Escrever seu próprio programa Java ou

    • Use a classe HdfsBridge 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 acima, admin_user inclui apenas o nome de usuário, não qualquer parte do 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.

    • Entre no computador do PolyBase e execute klist e klist tgt no prompt de comando para ver se os tipos de criptografia, nome de usuário e KDC estão corretos.
  4. Se o KDC tiver suporte apenas para AES256, verifique se arquivos de política JCE estão instalados.

Confira também

Integrar o PolyBase com o Cloudera usando a Autenticação do Active Directory
Guia do Cloudera para a configuração do Kerberos para CDH
Guia do Hortonworks para a configuração do Kerberos para HDP
Solução de problemas do PolyBase
Erros do PolyBase e possíveis soluções