Kerberos, SPN's duplicados e o Kerberos Configuration Manager.


Olá pessoal! 
 
Recentemente passei por um problema com o Kerberos em produção, e que tinha relação com o registro de SPN’s (Service Principal Name) duplicados para uma instância do SQL Server. Para detectar e resolver o problema, usei uma ferramenta bem interessante chamada Kerberos Configuration Manager for SQL Server:

Um SPN nada mais é do que o registro que o AD usa para identificar determinada instância de um serviço que está rodando em um host, ele basicamente é composto do nome deste host mais a conta utilizada para manter este serviço no ar. A autenticação de um login integrado via Kerberos depende deste registro, para quem quiser ir mais a fundo neste assunto recomendo os artigos do Adam W. Saxton que é um especialista da área, em especial recomendo um checklist sobre autenticação Kerberos feito por ele: http://blogs.msdn.com/b/psssql/archive/2010/06/23/my-kerberos-checklist.aspx.

Para a autenticação de um login integrado funcionar com o Kerberos no SQL Server, são necessários dois SPNs, assumindo que está sendo utilizada uma instancia nomeada do SQL Server e com uma porta fixa, teríamos algo seguindo o modelo abaixo:

MSSQLSvc/nomedohost.nomedodominio:NOMEDAINSTANCIADOSQLSERVER                                             
MSSQLSvc/nomedohost.nomedodominio:PORTADOSQLSERVER

Simulando o problema: SPN duplicado

Irei simular o problema que tive onde um dos registros SPN do SQL Server estava duplicado. Vamos primeiro entender meu cenário. Tenho uma instância do SQL Server 2014 chamada MSSQL2014 rodando sob a conta conta_sql2 que está no domínio DOMAINWIN2008 instalada em um Windows Server 2008 R2 SP1, conforme abaixo:


Por padrão, uma instância do SQL Server 2008 ou superior tenta registrar seus SPNs automaticamente quando seu serviço está sendo iniciado ou finalizado, contudo, na maioria dos ambientes a conta que mantem a instância no ar não tem as permissões necessárias no domínio para fazer este registro e no ERRORLOG você acaba vendo a seguinte mensagem:

The SQL Server Network Interface library could not register the Service Principal Name (SPN) for the
SQL Server service.

Desta forma, os registros SPN acabam sendo feitos manualmente por um administrador do domínio. Inclusive, em um ambiente cluster com versões inferiores ao SQL Server 2012, a recomendação é evitar que o registro dos SPN’s sejam controlados de forma automática pelo SQL Server (http://support.microsoft.com/kb/319723). Em meu caso por exemplo, os seguintes comandos foram usados por um administrador do domínio para registrar os SPN’s da minha instância:

Setspn –s “MSSQLSvc/win2k8sql14.DomainWin2008.net:MSSQL2014” “domainwin2008\conta_sql2”
Setspn –s “MSSQLSvc/win2k8sql14.DomainWin2008.net:1433” “domainwin2008\conta_sql2”

Para verificar que os SPNs estão corretamente registrados, basta rodar o comando abaixo em um prompt de comando elevado:

Setspn –l “domainwin2008\conta_sql2”

 
Sempre é possível que numa troca de conta de serviço, algum SPN seja deixado para trás, e foi o que aconteceu no meu caso. Vou simular isto usando o SETSPN para adicionar um SPN para a mesma instância do SQL Server, mas usando outra conta de serviço. Isto é um SPN duplicado:

Setspn –a “MSSQLSvc/win2k8sql14.DomainWin2008.net:MSSQL2014” “domainwin2008\conta_sql”

 
Note que estou usando o SETSPN embarcado com o Windows Server 2008 R2 SP1. Nesta versão o parâmetro –a adiciona um SPN sem verificar a existência de duplicatas. Nesta versão do SETSPN, o recomendado seria usar o parâmetro –s para verificar a duplicidade e fazer a adição do SPN. Também é possível usar o SETSPN com o parâmetro –x para procurar SPNs duplicados em todo o diretório (http://blogs.msdn.com/b/psssql/archive/2009/02/13/searching-for-duplicate-spn-s-got-a-little-easier.aspx), mas isto pode levar bastante tempo em ambientes muito grandes. No Windows Server 2012, o SETSPN com –a já faz a verificação de duplicidade na adição do SPN, o que teria evitado o problema neste caso, ( http://blogs.msdn.com/b/psssql/archive/2012/08/17/setspn-a-with-windows-2012-does-a-duplicate-check-upfront.aspx). Exemplificando, depois de adicionar o SPN duplicado, se rodar o SETSPN com o parâmetro –x recebo a seguinte saída:

Setspn –x

 
Como saber se existem SPNs duplicados, ou outro problema que impeça o uso do Kerberos para autenticação dos logins integrados, para uma determinada instância do SQL Server, sem ter que varrer todo o diretório ou fazer verificações manuais e extensivas de configuração? É aí que entra o Kerberos Configuration Manager for SQL Server (KCM).

O KCM pode ser instalado em qualquer servidor ou estação que tenha o .NET Framework 4.0 instalado, não é necessário instalar a ferramenta diretamente nos servidores que suportam as instâncias do SQL Server. Executo o KCM e vejo a tela a seguir:

 
Clico em “Connect” e forneço o nome da instância do SQL Server que desejo validar, WIN2K8SQL14 no meu caso. Não forneço um login do SQL Server, e portanto o KCM vai usar autenticação integrada:


Com o KCM conectado na instância, clico na aba “SPN”, e na coluna “Status” verifico que existem problemas. No meu caso, o SPN está duplicado:

 
Clicando em “Fix”, o KCM pode corrigir o problema para mim, se eu estiver logado com uma conta que possua os privilégios necessários. Se eu não tenho privilégios, o KCM pode gerar os comandos necessários para fazer a correção, basta clicar em “Generate”. Clico em “Generate”, salvo o arquivo em local adequado. Ao verificar o arquivo de comando gerado pelo KCM, encontro o comando abaixo. Note que o parâmetro –d indica a deleção do SPN.

Setspn –d “MSSQLSvc/win2k8sql14.DomainWin2008.net:MSSQL2014” “DomainWin2008\conta_sql”

Após a execução do arquivo de comando gerado pelo KCM, basta clicar em “Refresh” na barra de menu para conferir novamente o status:

 
Basicamente é isso pessoal! Espero que o post tenha sido útil e ajude vocês em problemas deste tipo. Um abraço!

5 comentários:

  1. Anônimo22/8/14

    Muito Bom Andre, Parabens!
    Um abraço,
    Alberto Lima

    ResponderExcluir
  2. Olá André tudo bem.
    Segui os passos descritos para um problema que está ocorrendo em meu ambiente, mas não tive sucesso. estou com o erro de "Cannot generate SSPI context"

    ResponderExcluir
    Respostas
    1. Olá Thiago tudo bem? Recomendo que siga os passos do artigo abaixo:

      https://support.microsoft.com/en-us/help/811889/how-to-troubleshoot-the-cannot-generate-sspi-context-error-message

      Pode ser que algum passo te ajudo na solução definitiva do problema.

      Abraço!

      Excluir