Token Bloat – Cannot generate SSPI context

Olá amigos, há um tempo atrás enfrentei o famoso problema SSPI atípico e sempre adiava este post, bom finalmente decidi escrever o artigo. Espere que o ajude.

Problema

Um usuário sempre conectou ao SQL Server sem problemas, mas um dia ao tentar conectar-se ao mesmo serviço de SQL ele recebeu a seguinte mensagem:

sspi

Não houve nenhuma mudança por parte de infraestrutura e DBAs no servidor, o usuário simplesmente não consegue conectar mais, e o mais intrigante é que alguns usuários conseguem conectar-se e outros não.

Bom, na grande maioria das vezes o erro SSPI Context é gerado por falta de SPN em uma tentativa de conexão via kerberos com o SQL Server e para resolver este problema basta criar o SPN.

Listando os SPN atuais:

No prompt de comando digite o seguinte comando

SETSPN –L <domínio\conta_de_serviço_do_SQL>

spn

Nota: Se ao executar o comando setspn –L você não receber o SPN para a sua instância de SQL Server, você deve criar o SPN e você está recebendo o erro de SSPI Context, possivelmente o seu problema será resolvido com a criação manual do SPN com o seguinte comando:

SETSPN – A MSSQLSvc/fqdn <domínio>\<conta de serviço do SQL>

SETSPN – A MSSQLSvc/fqdn:1433 <domínio>\<conta de serviço do SQL>

Ex. SETSPN –A MSSLSvc/sqlproducao.contoso.com contoso\sqlServiceAcc

Maiores informações no artigo: https://msdn.microsoft.com/pt-br/library/ms191153.aspx

 

Como podemos observar no resultado do SETSPN –L no meu ambiente eu tenho os SPNs corretamente criados!

O que justifica algumas conexões conseguirem conectar-se, pois o SPN está ok, e então por que algumas conexões recebem o SSPI?

Para responder esta questão precisamos analisar o ticket do kerberos, executando a ferramenta tokensz você poderá evidenciar o problema de token bloat com a seguinte sintaxe

tokensz.exe /compute_tokensize /user:<usuário_com_erro_sspi>

tokensz-1

Como podemos notar na imagem acima, o tamanho máximo do Token é 12000 (12K) e o token do usuário contoso\usuarioSQL que estou tentando conectar-se ao SQL e estou recebendo o erro SSPI contexto ultrapassou o limite.

Um token basicamente contém os grupos e permissões de um usuário e é criado no momento do logon e este token é repassado aos outros serviços/servidores conforme o usuário necessita autenticar-se para consumir os serviços (para maiores detalhes sobre kerberos consulte o artigo https://msdn.microsoft.com/en-us/library/bb742516.aspx)

Pois bem, se em um token temos a ACL (Access control List) vamos investigar os usuários criados:

Os dois usuários são membros do grupo SQLacesso o qual foi criado o login no SQL Server, mas o segundo usuário é membro de mais algumas centenas de grupos.

Até o Windows 2008 R2 o tamanho máximo default de um token é de 12K a partir do Windows 2012 este valor foi alterado para 48K

Dependendo do tamanho de seu ambiente este limite de 12K é facilmente alcançado com um usuário pertencendo a aproximadamente 150 grupos.

Em uma empresa multinacional onde como boa prática são criados diversos grupos para controlar acessos a diversos compartilhamentos, servidores, aplicações etc. este limite é alcançado muito rapidamente.

aninhamento_grupo.png

Qual o tamanho de cada grupo?

Para calcular o tamanho do token utilizamos a seguinte formula:

TokenSize = 1200 + 40d + 8s

Onde:

D = (grupos domínio local + grupos universais externos)

S = (grupos globais + Universal)

Existem diversos scripts que automatizam este cálculo, abaixo um bem simples que encontrei no artigo http://www.cluberti.com/blog/2014/05/26/getting-kerberos-token-size-with-powershell/

# Always credit where due - this was found via
# http://jacob.ludriks.com/getting-kerberos-token-size-with-powershell/
 
#Gets max token size
#Run with .\get_tokensize.ps1 -Username "domain\username"
#Reference: http://support.microsoft.com/kb/327825
#tokensize = 1200 + 40d + 8s
Param(
    [Parameter(Mandatory=$True)]
    [String]$Username
)
$domain = ($username.split("\"))[0]
$user = ($username.split("\"))[1]
Import-Module ActiveDirectory
$rootdse = (Get-ADDomain $domain).distinguishedname
$server = (Get-ADDomain $domain).pdcemulator
$usergroups = Get-ADPrincipalGroupMembership -server $server $user | select distinguishedname,groupcategory,groupscope,name
$domainlocal = [int]@($usergroups | where {$_.groupscope -eq "DomainLocal"}).count
$global = [int]@($usergroups | where {$_.groupscope -eq "Global"}).count
$universaloutside = [int]@($usergroups | where {$_.distinguishedname -notlike "*$rootdse" -and $_.groupscope -eq "Universal"}).count
$universalinside = [int]@($usergroups | where {$_.distinguishedname -like "*$rootdse" -and $_.groupscope -eq "Universal"}).count
$tokensize = 1200 + (40 * ($domainlocal + $universaloutside)) + (8 * ($global + $universalinside))
Write-Host "
Domain local groups: $domainlocal
Global groups: $global
Universal groups outside the domain: $universaloutside
Universal groups inside the domain: $universalinside
Kerberos token size: $tokensize"

Outros scripts úteis

http://www.jhouseconsulting.com/2013/12/20/script-to-create-a-kerberos-token-size-report-1041

https://gallery.technet.microsoft.com/scriptcenter/Check-for-MaxTokenSize-520e51e5

Como Resolver

Você tem duas maneiras de resolver o problema, aumentando o default do token size ou excluindo grupos desnecessários.

Para aumentar o token size, você pode seguir as etapas do KB http://support.microsoft.com/kb/938118

Em cada estação:

  1. Inicie Regedt32.exe
  2. Localize a chave (HKLM\System\CurrentControlSet\Control\Lsa\Kerberos\Parameters)
  3. No menu Edit clique em NEW / DWORD e utilize os parâmetros abaixo:

Nome: MaxTokenSize

tipo: REG_DWORD

Base: Decimal

Valor: 48000

regedit

  1. Feche o Editor de Registro

Se executarmos novamente a ferramenta Tokensz teremos o seguinte resultado:

tokensz-2

 

Leituras adicionais

http://support.microsoft.com/kb/938118

http://blogs.technet.com/b/shanecothran/archive/2010/07/16/maxtokensize-and-kerberos-token-bloat.aspx

http://support.microsoft.com/kb/327825/en-us

http://blogs.technet.com/b/askds/archive/2012/07/27/kerberos-errors-in-network-captures.aspx

http://blogs.technet.com/b/askds/archive/2007/11/02/what-s-in-a-token.aspx

http://support.microsoft.com/kb/327825/en-us

http://blogs.technet.com/b/askds/archive/2012/09/12/maxtokensize-and-windows-8-and-windows-server-2012.aspx

 

 

 

Error to install SQL Server 2008 on Windows 2012

Olá Amigos…

Decidi escrever este post em inglês devido as origens dos acessos que estou recebendo em meu blog, você poderá ver este artigo em português no MCDBABrasil.com

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Hello Friends…

This week I faced an interesting error… My PFE friend Alex Rosa (blog) helped me to fix this problem and I’m sharing this problem / solution because it might help you.

The environment and Goal

A Windows 2012 R2 on cluster with 2 nodes and my goal was to setup a SQL Server 2008 in cluster.

The problem

Firstly, I must say that since Jul/14 SQL 2K8 is no longer supported, SQL2K8 is in Extended Support.

When SQL Server 2008 was released there wasn’t Windows 2012, so SQL Server was made based on Windows 2k8, I’m not saying that SQL 2k8 is not supported on Windows 2012, SQL is supported on Windows 2012. but some functionality were made based on Win2K8.

During the installation of SQL2K8 on Win12 on the first node I faced this error message:

error_clusterI do have my Cluster on online status and working well and I ran the cluster validation successfully, but during the SQL setup I faced a message error saying that my setup couldn’t check my cluster service, bellow we have part of the detail of the Report Setup Validation:

InstallFailoverClusterGlobalRules: SQL Server 2008 Setup configuration checks for rules group ‘InstallFailoverClusterGlobalRules’
  SQLNODE1 Cluster_IsOnline Verifies that the cluster service is online. Failed The SQL Server failover cluster services is not online, or the cluster cannot be accessed from one of its nodes. To continue, determine why the cluster is not online and rerun Setup. Do not rerun the rule because the rule cannot detect a cluster environment.
  SQLNODE1 Cluster_SharedDiskFacet Checks whether the cluster on a computer has at least one shared disk available. Failed The cluster on this computer does not have a shared disk available. To continue, at least one shared disk must be available.
  SQLNODE1 Cluster_VerifyForErrors Checks if the cluster has been verified and if there are any errors or failures reported in the verification report. Failed The cluster either has not been verified or there are errors or failures in the verification report. Refer to KB953748 or SQL Server Books Online for more information.

I also tried running the setup from the command line using the SKIP_RULES:

Setup /SkipRules=Cluster_VerifyForErrors /Action=InstallFailoverCluster

And I got the same error…

Looking at the detail of the first error, the message says that the SQL couldn’t verify the cluster service, the cluster was online but setup couldn’t access my cluster.

I did some research on the web and I found this article:

http://blogs.msdn.com/b/clustering/archive/2012/04/06/10291601.aspx

The author (Rob-MSFT) gave me a clue:

… These are deprecated features (Failover Cluster Command Interface (cluster.exe) and Failover Cluster Automation Server) in Windows Server 2012 but are made available, as there are still some applications that may need them, SQL Server being one of them.  Installing it may be necessary for any legacy scripts you have built on the old Cluster.exe command line interface. …

During the SQL Server 2008 installations the setup tries to check cluster service using a deprecated feature!

Checking my cluster installations using the articles from Rob I have this:

Get-WindowsFeature RSAT-Cluster*

posh1

 These is the features installed by default when we install the Cluster Feature.

The Solution

We just need to enable the Failover Cluster Automation Server, to achieve this you just need to run the PowerShell command bellow.

Install-WindowsFeature -Name RSAT-Clustering-AutomationServer

posh2

After these steps we’ll have success on our setup:

error_cluster3

PS: You need to run these steps on all Cluster nodes.

Regards….

Failed to open loopback connection

Amigos, recentemente passei por um problema muito interessante, ao executar a procedure SP_READERRORLOG recebia o erro abaixo:

Msg 22004, Level 16, State 1, Line 0
Failed to open loopback connection. Please see event log for more information.
Msg 22004, Level 16, State 1, Line 0
error log location not found

Este erro ocorreu em um ambiente clusterizado com Windows 2008 R2 e SQL Server 2008.
Publiquei um artigo no Technet Wiki com detalhes sobre o erro e como solucionar o problema:

http://social.technet.microsoft.com/wiki/contents/articles/7063.solucionando-problemas-error-failed-to-open-loopback-connection-ao-executar-sp-readerrorlog-pt-br.aspx