MCDBA Brasil


  • Home
  • Sobre
  • Contato

Livros





Links Rápidos

SQL Server Builds (All Versions/Editions)


Download SQL Server 2017 (trial)


SQL Server 2017 Feature Pack


SQL Server 2016 Feature Pack


Cumulative Update SQL Server 2017 builds


Cumulative Update SQL Server 2016 builds


Cumulative Update SQL Server 2014 builds


Cumulative Update SQL Server 2012 builds


SQL Server 2005/2008 Samples Databases


Documentando o Servidor SQL Server


Analisando a Performance do Servidor-CheckList


Virtual PASS PT


Faça parte do maior virtual chapter do PASS com conteúdos técnicos em Português sobre SQL Server.

Todos os meses um evento Online para você! Acompanhe aqui os WebCasts já agendados

Sindicalize seu blog ou site ao VirtualPASSPT

SQL Server Blogs

SQL Server Query Processing Team


SQL Programmability & API Development Team


SQL Server Manageability Team


Latin America Support Team


Database + Disk + Performance


Microsoft SQL Server Support


SQL CLR Team


SQL Query Optimization Team


SQL 2005 Code Samples


SQL Server Express Team


SQL SMO Samples


SQL Storage Engine Team


SQL CAT Team


SQL Protocols Team


PSS SQL Server Engineers


Slava Oks on SQLOS


Ken Henderson’s blog


LUTI@Microsoft Blog


kimberly L. Trip’s blog


Fernando Garcia Blog

Artigos

Brigando com o erro Cannot generate SSPI e Login failed for user ANONYMOUS LOGON

por Nilton Pinheiro abril 2, 2017 Nenhum comentário

Como vocês devem ter visto nos links que passei no post “Configurando Autenticação Kerberos” (obviamente para aqueles que leram), a configuração de autenticação trusted (Windows authentication) no SQL Server requer a utilização de autenticação KERBEROS.

A partir deste ponto o negócio é super sensível e qualquer erro de configuração pode gerar problemas de autenticação no SQL Server fazendo com que você receba a mensagem de erro “Cannot generate SSPI context” ao tentar se conectar a um servidor SQL Server ou ainda o erro abaixo ao tentar utilizar um linked server entre dois servidores SQL Server.


Msg 18456, Level 14, State 1, Line 1
Login failed for user ‘NT AUTHORITY/ANONYMOUS LOGON’.


Ontem passei por estes dois problemas e para que vocês tenham uma idéia dos detallhes que devemos ficar atendo ao utilizar autenticação Kerberos, vou relatar aqui (usando um cenário fictício) o que foi feito para solucionar.


O cenário:

Para que vocês possam entender melhor, vou utilizar um cenário onde tenho 4 instâncias de SQL, portas tcp/ip usada pelo SQL Server e a respectiva conta de serviço utilizada para subir o serviço do SQL Server:


Servidor SRV01: possui três instâncias de SQL Server 2005


Instância       Porta TCP  Conta de Serviço
========= =======  ================
SQL01           1433          contoso/sqlservice_des
SQL02           3218          contoso/sqlservice_des
SQL03           2927          contoso/sqlservice_des


Servidor SRV02: possui 1 instância de SQL Server 2005


Instância        Porta TCP  Conta de Serviço
========= =======  ================
SQL04            1377         contoso/sqlservice_des


Obs: Fique atendo à barra que separa o domínio da conta! Devido a uma limitação estou usando o formato domínio/conta.


Os Problemas:

Ok, a partir deste ponto o primeiro problema que tive foi que ao tentar estabelecer qualquer conexão com a instância SQL01 no servidor SRV01 a mensagem de erro “Cannot generate SSPI context” era apresentada. Há, vale lembrar que este erro somente ocorria quando se usava conexão trusted, ou seja, usando uma conta do windows. Conexão usando login standard (do próprio SQL) funcionavam normalmente.


Bom, tentei então estabelecer uma conexão usando o utilitário de linha de comando SQLCMD, isso porque, ele usa SQL Native Client e na maioria das vezes este utilitário apresenta mensagem de erro com um pouco mais de detalhe. Ao usar o SQLCMD a mensagem era a seguinte:


HResult 0x80090322, Level 16, State 1
SQL Network Interfaces: The target principal name is incorrect.
Sqlcmd: Error: Microsoft SQL Native Client : Cannot generate SSPI context.


Hummm.. note que agora temos o seguinte “SQL Network Interfaces: The target principal name is incorrect.” Isso me levou a crer que tinha algo de errado com meus registros SPN (veja o post anterior) para a instância de SQL Server que eu estava tentando acessar, a SQL01.


Verificando a porta TCP que a instância SQL01 estava usando constatei que era a porta 1433 e então fiz uma consulta dos registros de SPN para a conta sqlservice_des. Como podemos observar no output abaixo, tudo parecia normal, ou seja, eu tinha a entrada para a instância SQL01 e sua respectiva porta 1433.


C:/temp>setspn -L contoso/sqlservice_des
Registered ServicePrincipalNames for …
.
.
.
    MSSQLSvc/SQL01.contoso.com.br:1433
    MSSQLSvc/SQL02.contoso.com.br:3218
    MSSQLSvc/SQL04.contoso.com.br:1377


Aparentemente tudo ok, parti então para uma pesquisa na net onde caí no post “Cannot generate SSPI context” error message, when connect to local SQL Server outside domain no blog do SQL Server Protocol Team. Lendo o post, encontrei o seguinte já no último parágrafo:


“From the error message reported by SNAC ODBC/OLEDB, you can differentiated the issue described by this post from another case of “Cannot generate SSPI context”, in which the root cause is because, in Active Directory, the Service Principle Name (SPN) of SQL Server is registered for a domain account different from the SQL Server is actually running under. The error message for the other case is “[SQL Native Client]SQL Network Interfaces: The target principal name is incorrect.[SQL Native Client]Cannot generate SSPI context”


Hummm… isso fazia sentido uma vez que tenho contas de serviço diferentes para cada ambiente (desenvolvimento/produção/homologação)! Então poderia sim ser possível que o registro de SPN existente no AD estivesse como outra conta que não a que estava sendo usada pelo serviço do SQL Server naquele momento.


Executei então outras consultas dos SPN registrados para as outras contas e em uma delas encontrei a seguinte saída…


C:/temp>setspn -L contoso/sqlservice_prod
Registered ServicePrincipalNames for …
.
.
.
    MSSQLSvc/SQL01.contoso.com.br:1433
    MSSQLSvc/SQL06.contoso.com.br:1433
    MSSQLSvc/SQL010.contoso.com.br:2515


Opa… encontrei então um outro registro para a instância SQL01 e mesma porta! Note que a primeira entrada da saída acima é exatamente igual à saída que obtive para a conta de serviço sqlservice_des.


Bom, com isso o problema estava esclarecido! Ao tentar me conectar à instância SQL01 o SPN que estava sendo usado era o SPN que estava registrado no AD para a conta sqlservice_prod, porém, como o serviço do SQL Server estava subindo com a conta sqlservice_des o SPN não batia e a autenticação Kerberos falhava. Para resolver o problema eu simplesmente removí os dois SPN e cadastrei novamente o SPN correto (não requer parada do SQL Server!!)…


— Remove SPN da instância SQL01 na porta 1433 para as contas sqlservice_prod e sqlservice_des


setspn -D MSSQLSvc/SQL01.contoso.com.br:1433 contoso/sqlservice_prod
setspn -D MSSQLSvc/SQL01.contoso.com.br:1433 contoso/sqlservice_des


— Registra SPN da instância SQL01 na porta 1433 para a conta sqlservice_des


setspn -A MSSQLSvc/SQL01.contoso.com.br:1433 contoso/sqlservice_des


Legal, isso resolveu meu primeiro problema! Vamos então para o segundo…


O segundo problema estava relacionado ao uso de linked server entre a instância SQL04 e uma outra instância que vou chamar aqui de SQL05. A Instância SQL04 possui um linked server para a instância SQL05, no entanto, quando a procedure de um analista tentava usar um linked server ele recebia a mensagem de erro abaixo:


Msg 18456, Level 14, State 1, Line 1
Login failed for user ‘NT AUTHORITY/ANONYMOUS LOGON’.


O problema era facilmente reproduzido abrindo um sesão no Query Editor com meu usuário de domínio e executando uma query como esta…


SELECT TOP 10 * FROM LS_SQL05.master.dbo.sysobjects


Por skill, a causa mais comum deste erro também esta relacionada a problemas de autenticação Kerberos, ou seja, registro de SPN incorreto ou que não existe.


Verifiquei então a instância SQL04 e constatei que ela estava usando a conta de serviço sqlservice_des com a porta 1377. A instância SQL05, usava a mesma conta de serviço com a porta 2927.


Consultando mais uma vez os SPNs registrados para a conta sqlservice_des obtive o seguinte output…


C:/temp>setspn -L contoso/sqlservice_des
Registered ServicePrincipalNames for …
.
.
.
    MSSQLSvc/SQL01.contoso.com.br:1433
    MSSQLSvc/SQL02.contoso.com.br:3218
    MSSQLSvc/SQL04.contoso.com.br:1377


Hummm.. se as instâncias usam a mesma conta de serviço, cadê a entrada para a instância SQL05 na porta 2927?


Estava aí o problema! A autenticação Kerberos estava falhando porque não existia no AD um SPN registrado para a instância SQL05. Após registrar o SPN usando o comando abaixo o linked server passou a funcionar normalmente.


setspn -A MSSQLSvc/SQL05.contoso.com.br:1433 contoso/sqlservice_des


Ao final acabei com os seguintes SPN regsitrados para a conta sqlservice_des


C:/temp>setspn -L contoso/sqlservice_des
Registered ServicePrincipalNames for …
.
.
.
    MSSQLSvc/SQL01.contoso.com.br:1433
    MSSQLSvc/SQL02.contoso.com.br:3218
    MSSQLSvc/SQL04.contoso.com.br:1377
    MSSQLSvc/SQL05.contoso.com.br:2927


É isso pessoal, se você pretende utilizar ou utiliza o método de autenticação “Windows Authentication”, fique sempre atendo a estes problemas de Kerberos, nomes de computador no DNS, registros de SPN e não deixem de ler tudo que puder sobre autenticação Kerberos com SQL Server. Tenha ainda em mente que quando trabalhamos com autenticação Kerberos vários requisitos de configuração precisam ser satisfeitos e a correta configuração do SPN é apenas uma delas.


abraços e até
Nilton Pinheiro

Avaliação:
Compartilhe:
  • Anterior Brigando com o erro 18456, Login failed for user ANONYMOUS LOGON8 anos atrás
  • Próximo Brigando com o erro Msg 538 anos atrás

Deixe uma resposta Cancelar resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

MVP Reconnect Award

Categorias

  • Artigos (359)
  • Dica da Semana (95)
  • Documentação (54)
  • Downloads (113)
  • MSDE 2000 (3)
  • Sem categoria (1)
  • Tutoriais (9)

Posts recentes

  • #FechouBrasil #PartiuPortugal
  • Brigando com o erro “The cached MSI file is missing”
  • MCDBABRASIL está de volta
  • Documentando o Servidor SQL Server
  • Brigando com os Erros 17182, 17826 e 17120

SQL Server AlwaysOn Video Series

Video1: Introdução ao SQLServer2012 AlwaysOn


Video2: Introdução ao SQLServer2012 AlwaysOn Availability Group


Video3: Introdução ao SQLServer2012 AlwaysOn AVG-Demo


Video4: Introdução ao SQLServer2012 AlwaysOn Listener


Video5: Introdução ao SQLServer2012 AlwaysOn Readable Secondaries


Video6: Introdução ao SQLServer2012 AlwaysOn Readable Secondaries-Demo


Video7: Introdução ao SQLServer2012 AlwaysOn Failover Clustering


Serie SQL Server Failover Clustering End-to-End

Parte 1: Configuração da Rede e Ambiente


Parte 2: Configurando o Windows 2008 R2 Domain Controler e DNS


Parte 3: Preparando os nós para o Failover Cluster


Parte 4: Configurando um Failover Cluster de 2 nós


Parte 5: Configurando as LUNs no iSCSI Software Target (Parte 1)


Parte 6: Configurando as LUNs no iSCSI Software Target (Parte 2)


Parte 7: Apresentando as LUNs para os nós do Failover Cluster


Parte 8: Configurando os discos no Failover Cluster


Parte 9: Instalando a primeira instância virtual do SQL Server 2008


Parte 10: Instalando a segunda instância virtual do SQL Server 2008


Parte 11: Instalando e Configurando o MSDTC no Failover Cluster


Parte 12: Configurando Mount Points no Cluster e SQL Server 2008


Vídeo Extra: Removendo uma Instância do SQL Server 2008 R2 em Cluster


Alta Disponibilidade no SQL Server 2008 R2: Failover Clustering Overview


Alta Disponibilidade no SQL Server 2008 R2: Failover Clustering na Prática

Menu

  • Home
  • Sobre
  • Contato

Mais

  • RSS Feeds
2025 MCDBA Brasil.