Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Aplica-se a: SQL Server 2016 (13.x) e versões posteriores no Windows
Para resolver problemas de autenticação ao usar o PolyBase com um cluster Hadoop protegido por Kerberos, utilize os diagnósticos interativos incorporados no PolyBase.
Este artigo serve como um guia para percorrer o processo de depuração destes problemas, utilizando estes diagnósticos incorporados.
Sugestão
Em vez de seguir os passos deste guia, pode optar por executar o HDFS Kerberos Tester para diagnosticar ligações HDFS Kerberos para PolyBase, quando experienciar uma falha HDFS Kerberos ao criar uma tabela externa num cluster HDFS protegido por Kerberos.
Esta ferramenta ajuda a excluir problemas que não sejam do SQL Server, ajudando-o a concentrar-se na resolução de problemas de configuração do HDFS Kerberos, nomeadamente na identificação de erros de configuração de nome de utilizador/palavra-passe e configurações incorretas de configuração do Kerberos em cluster.
Esta ferramenta é independente do SQL Server. Está disponível como Jupyter Notebook e requer Azure Data Studio.
Pré-requisitos
SQL Server 2016 (13.x) RTM CU6 / SQL Server 2016 (13.x) SP1 CU3 / SQL Server 2017 (14.x) ou superior com PolyBase instalado
Um cluster Hadoop (Cloudera ou Hortonworks) protegido com Kerberos (Active Directory ou MIT)
Introdução
Ajuda primeiro compreender o protocolo Kerberos a um nível geral. Três atores estão envolvidos:
- Kerberos client (SQL Server)
- Recursos seguros (HDFS, MR2, YARN, Histórico de Emprego, etc.)
- Centro de distribuição de chaves (referido como controlador de domínio no Active Directory)
Quando configura o Kerberos no cluster Hadoop, regista cada recurso seguro Hadoop no Centro de Distribuição de Chaves (KDC) com um Nome Principal de Serviço (SPN) único. O cliente precisa de obter um ticket de utilizador temporário, chamado Ticket Granting Ticket (TGT), para poder solicitar outro ticket temporário, chamado Service Ticket (ST), ao KDC para o SPN específico a que pretende aceder.
No PolyBase, quando solicita autenticação para qualquer recurso protegido por Kerberos, ocorre o seguinte processo de handshake em quatro etapas:
O SQL Server conecta-se ao KDC e obtém um TGT para o utilizador. A chave privada KDC encripta o TGT.
O SQL Server chama o recurso seguro Hadoop, HDFS, e determina para qual SPN precisa de um ST.
O SQL Server volta ao KDC, passa o TGT de volta e solicita um ST para aceder a esse recurso seguro em particular. A chave privada do serviço seguro encripta o ST.
O SQL Server encaminha o ST para o Hadoop e é autenticado para ter uma sessão criada com esse serviço.
Os problemas de autenticação enquadram-se num ou mais dos passos anteriores. Para ajudar numa depuração mais rápida, o PolyBase disponibiliza uma ferramenta de diagnóstico integrada para ajudar a identificar o ponto de falha.
Solução de problemas
O PolyBase utiliza os seguintes ficheiros XML de configuração para armazenar propriedades do cluster Hadoop:
core-site.xmlhdfs-site.xmlhive-site.xmljaas.confmapred-site.xmlyarn-site.xml
Pode encontrar estes ficheiros no seguinte percurso:
[System Drive]:{install path}{MSSQL##.INSTANCENAME}\MSSQL\Binn\PolyBase\Hadoop\conf
Por exemplo, o caminho padrão para SQL Server 2016 (13.x) é C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Binn\PolyBase\Hadoop\conf.
Edite core-site.xml e adicione estas propriedades. Defina os valores de acordo com o 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 tem de ser todo maiúsculo.
Precisas de atualizar os outros ficheiros XML se quiseres ativar operações de pushdown. Podes aceder ao sistema de ficheiros HDFS apenas com este ficheiro configurado.
A ferramenta corre de forma independente do SQL Server, por isso não precisa de estar a correr. Não precisas de o reiniciar se atualizares os ficheiros XML de configuração. Para executar a ferramenta, execute os seguintes comandos no host com 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 a funcionalidade PolyBase, pode consultar um Ambiente de Execução Java existente ou instalar o AZUL-OpenJDK-JRE. Se selecionares AZUL-OpenJDK-JRE, java.exe não faz parte da $PATH variável de ambiente e podes encontrar o erro
'java' isn't recognized as an internal or external command, operable program or batch file.
Se este erro ocorrer, precisa de adicionar o caminho para java.exe à variável de ambiente da sessão $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, então tens de executar o comando seguinte antes de executar o java comando para executar a ferramenta de resolução de problemas de conectividade Kerberos.
set PATH=%PATH%;C:\Program Files\Microsoft SQL Server\MSSQL15.{instance name}\AZUL-OpenJDK-JRE\bin
Arguments
| Argument | Description |
|---|---|
| Endereço do NameNode | O IP ou o FQDN do nó de nomes. Refere ao argumento "LOCALIZAÇÃO" no Transact-SQL CREATE EXTERNAL DATA SOURCE.
Nota: a versão SQL Server 2019 da ferramenta exige hdfs:// preceder o IP ou FQDN. |
| Porta do Name Node | A porta do nome node. Refere-se ao argumento "LOCALIZAÇÃO" no seu comando CREATE EXTERNAL DATA SOURCE T-SQL. Por exemplo, 8020. |
| Entidade de Serviço | O principal do serviço administrativo do seu KDC. Corresponde ao argumento "IDENTIDADE" no teu CREATE DATABASE SCOPED CREDENTIAL T-SQL. |
| Palavra-passe do serviço | Em vez de escrever a tua palavra-passe na consola, guarda-a num ficheiro e passa o caminho do ficheiro aqui. O conteúdo do ficheiro deve corresponder ao que usas como argumento "SECRETO" no teu CREATE DATABASE SCOPED CREDENTIAL T-SQL. |
| Caminho remoto de ficheiro HDFS (opcional) | O caminho de um ficheiro existente para acesso. Se não for especificado, a pasta raiz (/) é utilizada. |
Examples
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 é extensa para depuração melhorada, mas há apenas quatro pontos principais de verificação a procurar, independentemente de usares MIT ou AD. Correspondem aos quatro passos descritos anteriormente.
Os excertos seguintes são de um KDC do MIT. Consulte exemplos completos de resultados tanto do MIT como do AD no final deste artigo no Conteúdo Relacionado.
Ponto de Controlo 1
Deverá haver um hex dump de um ticket com Server Principal = krbtgt/MYREALM.COM@MYREALM.COM. Indica que o SQL Server autenticou-se com sucesso contra o KDC e recebeu um TGT. Se não, o problema está estritamente entre o SQL Server e o KDC, e não entre o Hadoop.
O PolyBase não suporta relações de confiança entre AD e MIT e deve ser configurado contra o mesmo KDC configurado no cluster Hadoop. Nestes ambientes, cria manualmente uma conta de serviço nesse KDC e usa-a para realizar 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 controlo 2
O PolyBase tenta aceder ao HDFS e falha porque o pedido não continha o Ticket 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 Controlo 3
Um segundo dump hexadecimal mostra que o SQL Server usa com sucesso o TGT e obtém o Ticket 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 .
Posto de controlo 4
Finalmente, as propriedades do ficheiro do caminho de destino são impressas juntamente com uma mensagem de confirmação. As propriedades do ficheiro confirmam que o SQL Server autentica por Hadoop usando o ST e concede uma sessão para aceder ao recurso seguro.
Chegar a este ponto confirma que: (i) os três intervenientes comunicam corretamente, (ii) os core-site.xml e jaas.conf estão corretos, e (iii) o seu KDC reconhece as 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 executares a ferramenta e as propriedades do ficheiro do caminho de destino não se imprimirem (Checkpoint 4), uma exceção deve ser lançada a meio do processo. Revê o contexto e considera onde ocorreu no fluxo de quatro etapas. Considere as seguintes questões comuns que podem ocorrer, por ordem:
| Exceções e mensagens | Motivo |
|---|---|
org.apache.hadoop.security.AccessControlExceptionSIMPLE authentication is not enabled. Available:[TOKEN, KERBEROS] |
O core-site.xml ficheiro não define a hadoop.security.authentication propriedade para KERBEROS. |
javax.security.auth.login.LoginExceptionClient not found in Kerberos database (6) - CLIENT_NOT_FOUND |
O Principal de Serviço administrativo não existe no âmbito especificado em core-site.xml. |
javax.security.auth.login.LoginExceptionChecksum failed |
O Admin Service Principal existe, mas a palavra-passe está incorreta. |
Native config name: C:\Windows\krb5.iniLoaded from native config |
Esta mensagem indica que o krb5LoginModule do Java detetou configurações personalizadas de clientes na sua máquina. Verifica as definições personalizadas do cliente, pois podem estar a causar o problema. |
javax.security.auth.login.LoginExceptionjava.lang.IllegalArgumentExceptionIllegal 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 conforme o cluster Hadoop. |
java.net.ConnectExceptionAttempting to access external filesystem at URI: hdfs://10.193.27.230:8020Call From IAAS16981207/10.107.0.245 to 10.193.27.230:8020 failed on connection exception |
A autenticação com o KDC é bem-sucedida, mas não consegue aceder ao NameNode do Hadoop. Verifica o IP e a porta do nó de nome. Verifica se o firewall está desativado no Hadoop. |
java.io.FileNotFoundExceptionFile does not exist: /test/data.csv |
A autenticação é bem-sucedida, mas a localização especificada não existe. Verifique o caminho ou teste com root / primeiro. |
Dicas de depuração
MIT KDC
Pode visualizar todos os SPNs registados no KDC, incluindo os administradores, executando kadmin.local> (conta de administrador) > no host KDC ou em qualquer cliente KDC configurado. Se configurares corretamente o Kerberos no cluster Hadoop, deverá haver um SPN para cada serviço disponível no cluster (por exemplo: nn, dn, rm, yarn, spnego, e assim sucessivamente). Pode ver os respetivos ficheiros keytab (substitutos de palavra-passe) em /etc/security/keytabs, por defeito. A chave privada KDC encripta estes ficheiros.
Para verificar as credenciais de administrador no KDC localmente, use kinit. Por exemplo, pode executar kinit identity@MYREALM.COM. Se a identidade existir, é solicitada uma palavra-passe.
Os registos KDC estão disponíveis em /var/log/krb5kdc.log, por predefinição. Os registos incluem todos os pedidos de tickets, incluindo o IP do cliente que fez o pedido. Deverão existir dois pedidos do IP da máquina SQL Server onde executaste a ferramenta: primeiro para o TGT do Servidor de Autenticação como 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, pode visualizar os SPNs navegando até Painel de Controlo>Utilizadores e Computadores do Active Directory, depois vá a <MyRealm> e selecione <MyOrganizationalUnit>. Se configurares corretamente o Kerberos no cluster Hadoop, há um SPN para cada serviço disponível no cluster (por exemplo: nn, dn, rm, yarn, spnego, e assim suonta).
Dicas gerais de depuração
É útil ter alguma experiência em Java para analisar os logs e depurar os problemas do Kerberos, que são independentes da funcionalidade SQL Server PolyBase.
Se ainda estiver a ter problemas para aceder ao Kerberos, siga estes passos para depurar:
Certifique-se de que pode aceder aos dados HDFS do Kerberos a partir de fora do SQL Server. Pode optar por uma das seguintes opções:
Escreve o teu próprio programa Java ou usa
HdfsBridgea 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_userinclui apenas o nome de utilizador – não qualquer parte do domínio.Se não conseguir aceder aos dados HDFS do Kerberos a partir de fora do PolyBase:
Existem dois tipos de autenticação Kerberos: autenticação Kerberos do Active Directory e autenticação Kerberos do MIT.
Certifique-se de que o utilizador existe na conta de domínio e use a mesma conta de utilizador ao tentar aceder ao HDFS.
Para o Kerberos do Active Directory, certifique-se de que consegue ver o ticket em cache usando o comando
klistno Windows.Liga-te à máquina PolyBase e executa
klisteklist tgtno prompt de comandos para verificar se o KDC, o nome de utilizador e os tipos de encriptação estão corretos.Se o KDC só suportar AES-256, certifique-se de que os ficheiros de política JCE estão instalados.