Suporte ao SPN (Nome da Entidade de Serviço) em conexões de cliente no SQL Server Native Client
Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Azure Synapse Analytics Analytics Platform System (PDW)
Importante
O SQL Server Native Client (SNAC) não é fornecido com:
- SQL Server 2022 (16.x) e versões posteriores
- SQL Server Management Studio 19 e versões posteriores
O SQL Server Native Client (SQLNCLI ou SQLNCLI11) e o Microsoft OLE DB Provider for SQL Server (SQLOLEDB) herdados não são recomendados para o desenvolvimento de novos aplicativos.
Para novos projetos, use um dos seguintes drivers:
Para SQLNCLI que é fornecido como um componente do Mecanismo de Banco de Dados do SQL Server (versões 2012 a 2019), confira esta exceção de Ciclo de Vida de Suporte.
A partir do SQL Server 2008 (10.0.x), o suporte para SPNs (nomes da entidade de serviço) foi estendido para habilitar a autenticação mútua em todos os protocolos. Em versões anteriores do SQL Server, apenas havia suporte para SPNs no Kerberos via TCP quando o SPN padrão da instância do SQL Server era registrado no Active Directory.
Os SPNs são usados pelo protocolo de autenticação para determinar a conta na qual 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 do nome da instância e das propriedades de conexão de rede. As instâncias do SQL Server tentarão registrar os SPNs na inicialização, ou eles podem ser registrados 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 é usado somente quando uma conexão é feita com a segurança integrada pelo Windows.
Dica
Microsoft Kerberos Configuration Manager for SQL Server é uma ferramenta de diagnóstico que ajuda a solucionar problemas de Kerberos relativos à conectividade com SQL Server. Para obter mais informações, consulte Microsoft Kerberos Configuration Manager for SQL Server.
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 atual do SQL Server Native Client especifica um SPN na cadeia de conexão como um usuário de domínio ou conta de computador, como um SPN específico da instância ou como uma cadeia de caracteres 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: – Especificar a conta usada pela instância do SQL Server para uma conexão. Isto simplifica o acesso à autenticação Kerberos. Se um KDC (Centro de Distribuição de Chaves) Kerberos estiver presente e a conta correta for especificada, a autenticação Kerberos provavelmente será mais usada que NTLM. O KDC normalmente reside no mesmo computador que o controlador de domínio. – Especificar um SPN para pesquisar a conta de serviço para a instância do SQL Server. Para cada instância do SQL Server, são gerados dois SPNs padrão que podem ser usados para essa finalidade. Não há garantia de que estas chaves estejam presentes no Active Directory. Entretanto, nesta situação, a autenticação Kerberos não é garantida. – Especificar um SPN que será usado para pesquisar a conta de serviço para a instância do SQL Server. Esta poderá ser qualquer cadeia de caracteres definida pelo usuário que mapeia para a conta de serviço. Neste caso, a chave deve ser registrada manualmente no KDC e deve satisfazer as regras para um SPN definido pelo usuário. 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 estarão limitados a) 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 estarão limitados a) 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, 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.
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 na qual a instância do SQL Server é executada precisa 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)
Confira também
Recursos do SQL Server Native Client
Registrar um nome de entidade de serviço para conexões de Kerberos