Suporte a SPN (Nome da entidade de serviço) em conexões com o cliente
A partir do SQL Server 2008, o suporte para SPNs foi estendido para habilitar a autenticação mútua em todos os protocolos. Em versões anteriores do SQL Server, os SPNs foram apenas suportados para Kerberos em TCP quando o SPN padrão para a instância do SQL Server foi registrado com o Active Directory.
Os SPNs são usados pelo protocolo de autenticação para determinar a conta em que uma instância do SQL Server é executada. Se a conta da instância for conhecida, autenticação Kerberos poderá ser usada para fornecer autenticação mútua pelo cliente e servidor. Se a conta de instância não for conhecida, a autenticação NTLM, que só fornece autenticação do cliente pelo servidor, será usada. Atualmente, o SQL Server Native Client executa a pesquisa de autenticação, derivando o SPN das propriedades de nome da instância e conexão de rede. As instâncias do SQL Server tentarão registrar os SPNs na inicialização ou elas poderão ser registradas manualmente. Porém, o registro falhará se houver direitos de acesso insuficientes para a conta que tenta registrar os SPNs.
As contas de domínio e computador são registradas automaticamente no Active Directory. Elas podem ser usadas como SPNs ou os administradores podem definir seus próprios SPNs. O SQL Server torna a autenticação segura mais gerenciável e confiável, permitindo que os clientes especifiquem diretamente o SPN a ser usado.
Observação |
---|
Um SPN especificado por um aplicativo cliente só é usado quando uma conexão é feita com a segurança integrada pelo Windows NT. |
Para obter mais informações sobre Kerberos, consulte os artigos a seguir:
Uso
A tabela a seguir descreve os cenários mais comuns nos quais os aplicativos cliente podem habilitar a autenticação segura.
Cenário |
Descrição |
---|---|
Um aplicativo herdado não especifica um SPN. |
Este cenário de compatibilidade garante que não haverá nenhuma alteração de comportamento para aplicativos desenvolvidos para versões anteriores do SQL Server. Se nenhum SPN for especificado, o aplicativo confiará nos SPNs gerados e não terá nenhum conhecimento de qual método de autenticação será usado. |
Um aplicativo cliente que usa a versão anterior do SQL Server Native Client especifica um SPN na cadeia de conexão como um usuário do domínio ou uma conta de computador, como um SPN específico da instância ou uma cadeia definida pelo usuário. |
A palavra-chave ServerSPN pode ser usada em um provedor, uma inicialização ou uma cadeia de conexão para fazer o seguinte:
A palavra-chave FailoverPartnerSPN pode ser usada para especificar o SPN para o servidor de parceiro de failover. O intervalo de conta e valores de chave do Active Directory é igual aos valores que você pode especificar para o servidor principal. |
Um aplicativo ODBC especifica um SPN como um atributo de conexão para o servidor principal ou servidor de parceiro de failover. |
O atributo de conexão SQL_COPT_SS_SERVER_SPN pode ser usado para especificar o SPN para uma conexão com o servidor principal. O atributo de conexão SQL_COPT_SS_FAILOVER_PARTNER_SPN pode ser usado para especificar o SPN para o servidor de parceiro de failover. |
Um aplicativo OLE DB especifica um SPN como uma propriedade de inicialização de fonte de dados para o servidor principal ou para um servidor de parceiro de failover. |
A propriedade de conexão SSPROP_INIT_SERVER_SPN no conjunto de propriedades DBPROPSET_SQLSERVERDBINIT pode ser usada para especificar o SPN para uma conexão. A propriedade de conexão SSPROP_INIT_FAILOVER_PARTNER_SPN na DBPROPSET_SQLSERVERDBINIT pode ser usada para especificar o SPN para o servidor de parceiro de failover. |
Um usuário especifica um SPN para um servidor ou servidor de parceiro de failover em um DSN (nome de fonte de dados) ODBC. |
O SPN pode ser especificado em um DSN ODBC pelas caixas de diálogo de configuração do DSN. |
O usuário especifica um SPN para um servidor ou servidor de parceiro de failover em uma caixa de diálogo Vínculo de Dados ou Logon no OLE DB. |
O SPN pode ser especificado em uma caixa de diálogo Vínculo de Dados ou Logon. A caixa de diálogo Logon pode ser usada com ODBC ou OLE DB. |
Um aplicativo ODBC determina o método de autenticação usado para estabelecer uma conexão. |
Quando uma conexão foi aberta com êxito, um aplicativo pode consultar o atributo de conexão SQL_COPT_SS_INTEGRATED_AUTHENTICATION_METHOD para determinar qual método de autenticação foi usado. Os valores incluirão, mas não se limitarão, NTLM e Kerberos. |
Um aplicativo OLE DB determina o método de autenticação usado para estabelecer uma conexão. |
Quando uma conexão foi aberta com êxito, um aplicativo pode consultar a propriedade de conexão SSPROP_AUTHENTICATION_METHOD no conjunto de propriedades DBPROPSET_SQLSERVERDATASOURCEINFO para determinar qual método de autenticação foi usado. Os valores incluirão, mas não se limitarão, NTLM e Kerberos. |
Failover
Os SPNs não são armazenados no cache de failover e, portanto, não podem ser transmitidos entre conexões. Os SPNs serão usados em todas as tentativas de conexão com a entidade e o parceiro quando especificados na cadeia de conexão ou nos atributos de conexão.
Pool de conexões
Os aplicativos devem estar atentos que especificar SPNs em algumas, mas não em todas as cadeias de conexão, podem contribuir para o agrupamento da fragmentação.
Os aplicativos podem especificar SPNs programaticamente como atributos de conexão, em vez de especificar palavras-chave da cadeia de conexão. Isto pode ajudar no gerenciamento da fragmentação do pool de conexões.
Os aplicativos deverão saber que os SPNs nas cadeias de conexão possam ser substituídos definindo os atributos de conexão correspondentes, mas as cadeias de conexão usadas pelo pool de conexões usarão os valores da cadeia de conexão para fins de pool.
Comportamento de servidor de versão anterior
O novo comportamento de conexão é implementado pelo cliente; portanto, ele não é específico para uma versão do SQL Server.
Servidores vinculados e delegação
Quando são criados servidores vinculados, o parâmetro @provstr de sp_addlinkedserver pode ser usado para especificar os SPNs de servidor e de parceiro de failover. Os benefícios disso é o mesmo que especificar SPNs em cadeias de conexão de cliente. É mais simples e confiável estabelecer conexões que usam autenticação Kerberos.
A delegação com servidores vinculados exige a autenticação Kerberos.
Para obter uma lista de requisitos, consulte Configurando servidores vinculados para delegação.
Aspectos de gerenciamento de SPNs especificados por aplicativos
Ao escolher se deseja especificar SPNs em um aplicativo (por meio de cadeias de conexão) ou, programaticamente, por meio de propriedades de conexão (em vez de confiar no provedor padrão gerado por SPNs), considere os seguintes fatores:
Segurança: o SPN especificado divulga informações que estão protegidas?
Confiabilidade: para permitir o uso de SPNs padrão, a conta de serviço em que a instância do SQL Server é executada deve ter privilégios suficientes para atualizar o Active Directory no KDC.
Conveniência e transparência de local: como os SPNs de um aplicativo serão afetados se seu banco de dados for movido para uma instância diferente do SQL Server? Isto se aplicará ao servidor principal e seu parceiro de failover se você usar espelhamento de banco de dados. Se uma alteração de servidor significar que os SPNs devem ser alterados, como isto afetará os aplicativos? Qualquer alteração será gerenciada?
Especificando o SPN
Você pode especificar um SPN em caixas de diálogo e em código. Esta seção discute como você pode especificar um SPN.
O tamanho máximo de um SPN é 260 caracteres.
A sintaxe que os SPNs usam em cadeia de conexão ou atributos de conexão é a seguinte:
Sintaxe |
Descrição |
---|---|
MSSQLSvc/fqdn |
O SPN padrão gerado pelo provedor para uma instância padrão quando um protocolo diferente de TCP é usado. fqdn é um nome de domínio totalmente qualificado. |
MSSQLSvc/fqdn:port |
O SPN padrão gerado pelo provedor quando o protocolo TCP é usado. port é um número de porta TCP. |
MSSQLSvc/fqdn:InstanceName |
O SPN padrão gerado pelo provedor para uma instância nomeada quando um protocolo diferente de TCP é usado. InstanceName é um nome de instância do SQL Server. |
HOST/fqdn HOST/MachineName |
O SPN que mapeia para contas internas do computador que são automaticamente registradas pelo Windows. |
Username@Domain |
Especificação direta de uma conta de domínio. Username é um nome de conta de usuário do Windows. Domain é um nome de domínio ou nome de domínio totalmente qualificado do Windows. |
MachineName$@Domain |
Especificação direta de uma conta de computador. (Se o servidor ao qual você está se conectando estiver sendo executado em contas LOCAL SYSTEM ou NETWORK SERVICE, para obter autenticação Kerberos, o ServerSPN poderá estar no formato MachineName$@Domain.) |
KDCKey/MachineName |
Um SPN especificado pelo usuário. KDCKey é uma cadeia de caracteres alfanumérica que está em conformidade com as regras para uma chave do KDC. |
Sintaxe do ODBC e OLE DB que dão suporte a SPNs
Para informações específicas de sintaxe, consulte os seguintes tópicos:
SPNs (Nomes da Entidade de Serviço) em conexões de cliente (ODBC)
SPNs (Nomes da Entidade de Serviço) em conexões de cliente (OLE DB)
Para obter informações sobre aplicativos de exemplo que demonstram esse recurso, consulte Considerações para instalar exemplos e bancos de dados de exemplo do SQL Server.