Sintoma: Falhas de logon no modo AD – domínio não confiável (Clusters de Big Data)
Importante
O complemento Clusters de Big Data do Microsoft SQL Server 2019 será desativado. O suporte para Clusters de Big Data do SQL Server 2019 será encerrado em 28 de fevereiro de 2025. Todos os usuários existentes do SQL Server 2019 com Software Assurance terão suporte total na plataforma e o software continuará a ser mantido por meio de atualizações cumulativas do SQL Server até esse momento. Para obter mais informações, confira a postagem no blog de anúncio e as opções de Big Data na plataforma do Microsoft SQL Server.
Em um Cluster de Big Data do SQL Server no modo Active Directory, pode ocorrer falha na tentativa de conexão e isso retorna o seguinte erro:
Login failed. The login is from an untrusted domain and cannot be used with Integrated authentication.
Isso pode ocorrer quando você configurou entradas DNS como CNAME apontando para um nome de alias de proxy reverso que distribui o tráfego para nós do Kubernetes.
Causa raiz
Quando os pontos de extremidade são configurados com entradas DNS com CNAME apontando para um nome de alias de proxy reverso que distribui o tráfego para nós do Kubernetes:
- O processo de autenticação Kerberos procura um SPN (nome da entidade de serviço) que corresponda à entrada para CNAME. Não é o SPN verdadeiro registrado pelo BDC no Active Directory
- A autenticação falha
Confirmar causa raiz
Após a falha de autenticação, verifique o cache de tíquetes do Kerberos.
Para verificar o cache de tíquetes, use o comando klist
.
Procure um tíquete com um SPN correspondente ao ponto de extremidade ao qual você tentou se conectar.
O tíquete esperado não está lá.
Neste exemplo, um ponto de extremidade mestre, registro DNS bdc-sql
é o CNAME definido como proxy reverso chamado ServerReverseProxy
Resolve-DnsName bdc-sql
A seção a seguir mostra os resultados do comando anterior.
Name Type TTL Section NameHost
---- ---- --- ------- --------
bdc-sql.mydomain.com CNAME 3600 Answer ReverseProxyServer.mydomain.com
Name : ReverseProxyServer.mydomain.com
QueryType : A
TTL : 3600
Section : Answer
IP4Address : 193.168.5.10
Observação
A seção a seguir faz referência a tshark
. tshark
o é um utilitário de linha de comando instalado como parte do utilitário de rastreamento de rede Wireshark.
Para ver o SPN solicitado no Active Directory, use tshark
. O comando a seguir limita a captura de rastreamento de rede para a comunicação do protocolo Kerberos e mostra apenas krb-error (30)
mensagens. Essas mensagens devem conter mensagens de solicitação de SPN com falha.
tshark -Y "kerberos && kerberos.msg_type == 30" -T fields -e kerberos.error_code -e kerberos.SNameString
Em um shell de comando diferente, tente se conectar ao pod mestre:
klist purge
sqlcmd -S bdc-sql.mydomain.com,31433 -E
Confira o exemplo de saída a seguir.
klist purge
Current LogonId is 0:0xf6b58
Deleting all tickets:
Ticket(s) purged!
sqlcmd -S bdc-sql.mydomain.com,31433 -E
sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : Login failed. The login is from an untrusted domain and cannot be used with Integrated authentication.
Verifique a saída tshark
.
Capturing on 'Ethernet 3'
25 krbtgt,RLAZURE.COM
7 MSSQLSvc,ReverseProxyServer.mydomain.com:31433
2 packets captured
Observe que o cliente solicita SPN MSSQLSvc,ReverseProxyServer.mydomain.com:31433
, que não existe. A tentativa de conexão acaba falhando com o erro 7. O erro 7 significa KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN Server not found in Kerberos database
.
Na configuração correta, o cliente solicita o SPN registrado pelo BDC. No exemplo, o SPN correto teria sido MSSQLSvc,bdc-sql.mydomain.com:31433
.
Observação
O erro 25 significa KDC_ERR_PREAUTH_REQUIRED
– pré-autenticação adicional é necessária. Isso pode ser ignorado com segurança. KDC_ERR_PREAUTH_REQUIRED
é retornado na solicitação inicial do AD do Kerberos. Por padrão, o cliente Kerberos do Windows não está incluindo informações de pré-autenticação nesta primeira solicitação.
Para ver a lista de SPN registrada pelo BDC para o ponto de extremidade mestre, execute setspn -L mssql-master
.
Confira o seguinte exemplo de saída:
Registered ServicePrincipalNames for CN=mssql-master,OU=bdc,DC=mydomain,DC=com:
MSSQLSvc/bdc-sqlread.mydomain.com:31436
MSSQLSvc/-sqlread:31436
MSSQLSvc/bdc-sqlread.mydomain.com
MSSQLSvc/bdc-sqlread
MSSQLSvc/bdc-sql.mydomain.com:31433
MSSQLSvc/bdc-sql:31433
MSSQLSvc/bdc-sql.mydomain.com
MSSQLSvc/bdc-sql
MSSQLSvc/master-p-svc.mydomain.com:1533
MSSQLSvc/master-p-svc:1533
MSSQLSvc/master-p-svc.mydomain.com:1433
MSSQLSvc/master-p-svc:1433
MSSQLSvc/master-p-svc.mydomain.com
MSSQLSvc/master-p-svc
MSSQLSvc/master-svc.mydomain.com:1533
MSSQLSvc/master-svc:1533
MSSQLSvc/master-svc.mydomain.com:1433
MSSQLSvc/master-svc:1433
MSSQLSvc/master-svc.mydomain.com
MSSQLSvc/master-svc
Nos resultados acima, o endereço do proxy reverso não deve ser registrado.
Resolver
Esta seção mostra duas maneiras de resolver o problema. Depois de fazer as alterações apropriadas, execute ipconfig -flushdns
e klist purge
em seu cliente. Então tente conectar novamente.
Opção 1
Remova o registro CNAME de cada ponto de extremidade do BDC no DNS e substitua por vários registros de A
que apontam para cada nó do Kubernetes ou cada mestre do Kubernetes se você tiver mais de um mestre.
Dica
O script descrito abaixo usa o PowerShell. Confira Como instalar o PowerShell no Linux para obter mais informações.
Você pode usar o script do PowerShell a seguir para atualizar os registros de pontos de extremidade de DNS. Execute o script de qualquer computador conectado ao mesmo domínio:
#Specify the DNS server, example contoso.local
$Domain_DNS_name=mydomain.com'
#DNS records for bdc endpoints
$Controller_DNS_name = 'bdc-control'
$Managment_proxy_DNS_name= 'bdc-proxy'
$Master_Primary_DNS_name = 'bdc-sql'
$Master_Secondary_DNS_name = 'bdc-sqlread'
$Gateway_DNS_name = 'bdc-gateway'
$AppProxy_DNS_name = 'bdc-appproxy'
#Performing Endpoint DNS records Checks..
#Build array of endpoints
$BdcEndpointsDns = New-Object System.Collections.ArrayList
[void]$BdcEndpointsDns.Add($Controller_DNS_name)
[void]$BdcEndpointsDns.Add($Managment_proxy_DNS_name)
[void]$BdcEndpointsDns.Add($Master_Primary_DNS_name)
[void]$BdcEndpointsDns.Add($Master_Secondary_DNS_name)
[void]$BdcEndpointsDns.Add($Gateway_DNS_name)
[void]$BdcEndpointsDns.Add($AppProxy_DNS_name)
#Build arrary for results
$BdcEndpointsDns_Result = New-Object System.Collections.ArrayList
foreach ($DnsName in $BdcEndpointsDns) {
try {
$endpoint_DNS_record = Resolve-DnsName $DnsName -Type A -Server $Domain_DNS_IP_address -ErrorAction Stop
foreach ($ip in $endpoint_DNS_record.IPAddress) {
[void]$BdcEndpointsDns_Result.Add("OK - $DnsName is an A record with an IP $ip")
}
}
catch {
[void]$BdcEndpointsDns_Result.Add("MisConfiguration - $DnsName is not an A record or does not exists")
}
}
#show the results
$BdcEndpointsDns_Result
Opção 2
Como alternativa, é possível contornar o problema modificando o CNAME para apontar para o endereço IP do proxy reverso, em vez do nome do proxy reverso.
Confirmar resolução
Depois de resolver a correção com uma das opções acima, confirme a correção conectando-se ao Cluster de Big Data com o Active Directory.
Próximas etapas
Verificar a entrada DNS reversa (registro PTR) para o controlador de domínio.