Supporto del nome dell'entità servizio (SPN) nelle connessioni client in SQL Server Native Client
Si applica a: SQL Server Database SQL di Azure Istanza gestita di SQL di Azure Azure Synapse Analytics Piattaforma di strumenti analitici (PDW)
Importante
SQL Server Native Client (SNAC) non viene fornito con:
- SQL Server 2022 (16.x) e versioni successive
- SQL Server Management Studio 19 e versioni successive
SQL Server Native Client (SQLNCLI o SQLNCLI11) e il provider OLE DB Microsoft legacy per SQL Server (SQLOLEDB) non sono consigliati per lo sviluppo di nuove applicazioni.
Per i nuovi progetti, usare uno dei driver seguenti:
Per SQLNCLI fornito come componente del motore di database di SQL Server (versioni dal 2012 al 2019), vedere questa Eccezione relativa al ciclo di vita del supporto.
A partire da SQL Server 2008 (10.0.x), il supporto per i nomi delle entità servizio (SPN) è stato esteso per abilitare l'autenticazione reciproca in tutti i protocolli. Nelle versioni precedenti di SQL Server i nomi SPN sono supportati solo per Kerberos su TCP quando il nome SPN predefinito per l'istanza di SQL Server viene registrato con Active Directory.
I nomi SPN vengono usati dal protocollo di autenticazione per determinare l'account usato per l'esecuzione di un'istanza di SQL Server. Se l'account dell'istanza è noto, è possibile usare l'autenticazione Kerberos per fornire autenticazione reciproca dal client e dal server. Se l'account dell'istanza non è noto, viene usata l'autenticazione NTLM, che fornisce solo l'autenticazione del client da parte del server. SQL Server Native Client esegue attualmente la ricerca dell'autenticazione, derivando il nome dell'istanza e le proprietà di connessione di rete. Le istanze di SQL Server tenteranno di registrare i nomi SPN all'avvio ma è possibile registrarli manualmente. La registrazione, tuttavia, non riuscirà se l'account dispone di diritti di accesso insufficienti per la registrazione dei nomi SPN.
Gli account di dominio e del computer vengono registrati automaticamente in Active Directory. Questi possono essere usati come SPN oppure gli amministratori possono definire i propri SPN. SQL Server rende l'autenticazione più gestibile e affidabile consentendo ai client di specificare direttamente i nomi SPN da usare.
Nota
Un nome SPN specificato da un'applicazione client viene usato solo quando viene stabilita una connessione con sicurezza integrata di Windows.
Suggerimento
Microsoft Kerberos Configuration Manager for SQL Server è uno strumento di diagnostica che semplifica la risoluzione dei problemi di connettività correlati a Kerberos con SQL Server. Per altre informazioni, vedere Microsoft Kerberos Configuration Manager per SQL Server.
Per altre informazioni su Kerberos, vedere gli articoli seguenti:
Utilizzo
Nella tabella seguente vengono descritti gli scenari più comuni in cui le applicazioni client possono abilitare l'autenticazione protetta.
Scenario | Descrizione |
---|---|
Un'applicazione legacy non specifica un nome SPN. | Questo scenario di compatibilità garantisce che non vi saranno differenze di comportamento per le applicazioni sviluppate per le versioni precedenti di SQL Server. Se non viene specificato alcun nome SPN, l'applicazione si basa sui nomi SPN generati e non è in grado di identificare il metodo di autenticazione usato. |
Un'applicazione client che usa la versione corrente di SQL Server Native Client specifica un nome SPN nel stringa di connessione come account utente di dominio o computer, come SPN specifico dell'istanza o come stringa definita dall'utente. | È possibile usare la parola chiave ServerSPN in una stringa del provider, di inizializzazione o di connessione per effettuare le operazioni seguenti: Specificare l'account usato dall'istanza di SQL Server per una connessione. Questa operazione semplifica l'accesso all'autenticazione Kerberos. Se è presente un centro distribuzione chiavi (KDC, Key Distribution Center) Kerberos ed è stato specificato l'account corretto, è più probabile che venga usata l'autenticazione Kerberos anziché l'autenticazione NTLM. Il centro distribuzione chiavi si trova in genere nello stesso computer del controller di dominio. Specificare un nome SPN per cercare l'account del servizio per l'istanza di SQL Server. Per ogni istanza di SQL Server vengono generati due nomi SPN predefiniti che possono essere usati a questo scopo. Non è tuttavia garantito che tali chiavi siano presenti in Active Directory, pertanto in questa situazione non è garantita neanche l'autenticazione Kerberos. Specificare un nome SPN che verrà usato per cercare l'account del servizio per l'istanza di SQL Server. Può trattarsi di qualsiasi stringa definita dall'utente di cui è stato eseguito il mapping all'account del servizio. In questo caso, la chiave deve essere registrata manualmente nel centro distribuzione chiavi e deve essere conforme alle regole relative ai nomi SPN definiti dall'utente. È possibile usare la parola chiave FailoverPartnerSPN per specificare il nome SPN per il server partner di failover. L'intervallo di valori per gli account e per le chiavi di Active Directory coincide con i valori che è possibile specificare per il server principale. |
Un'applicazione ODBC specifica un nome SPN come attributo di connessione per il server principale o il server partner di failover. | È possibile usare l'attributo di connessione SQL_COPT_SS_SERVER_SPN per specificare il nome SPN per una connessione al server principale. È possibile usare l'attributo di connessione SQL_COPT_SS_FAILOVER_PARTNER_SPN per specificare il nome SPN per il server partner di failover. |
Un'applicazione OLE DB specifica un nome SPN come proprietà di inizializzazione dell'origine dati per il server principale o per un server partner di failover. | È possibile usare la proprietà di connessione SSPROP_INIT_SERVER_SPN nel set di proprietà DBPROPSET_SQLSERVERDBINIT per specificare il nome SPN per una connessione. È possibile usare la proprietà di connessione SSPROP_INIT_FAILOVER_PARTNER_SPN nel set di proprietà DBPROPSET_SQLSERVERDBINIT per specificare il nome SPN per il server partner di failover. |
Un utente specifica un nome SPN per un server o per un server partner di failover in un nome di origine dati ODBC. | È possibile specificare il nome SPN in un nome di origine dati ODBC tramite le finestre di dialogo di configurazione del nome dell'origine dati. |
L'utente specifica un nome SPN per un server o per un server partner di failover in una finestra di dialogo Collegamento dati o Account di accesso OLE DB. | È possibile specificare il nome SPN in una finestra di dialogo Collegamento dati o Account di accesso . La finestra di dialogo Account di accesso può essere usata con ODBC o OLE DB. |
Un'applicazione ODBC determina il metodo di autenticazione usato per stabilire una connessione. | Se una connessione è stata aperta correttamente, un'applicazione può eseguire una query sull'attributo di connessione SQL_COPT_SS_INTEGRATED_AUTHENTICATION_METHOD per determinare il metodo di autenticazione usato. Alcuni dei valori possibili sono NTLM e Kerberos. |
Un'applicazione OLE DB determina il metodo di autenticazione usato per stabilire una connessione. | Se una connessione è stata aperta correttamente, un'applicazione può eseguire una query sulla proprietà di connessione SSPROP_AUTHENTICATION_METHOD nel set di proprietà DBPROPSET_SQLSERVERDATASOURCEINFO per determinare il metodo di autenticazione usato. Alcuni dei valori possibili sono NTLM e Kerberos. |
Failover
I nomi SPN non vengono archiviati nella cache di failover e pertanto non possono essere passati tra connessioni. I nomi SPN verranno usati in tutti i tentativi di connessione al server principale e al partner se specificati nella stringa di connessione o negli attributi di connessione.
Pool di connessioni
Nelle applicazioni è necessario tenere presente che la specifica dei nomi SPN solo in alcune stringhe di connessione può implicare la frammentazione del pool.
Le applicazioni possono specificare a livello di programmazione i nomi SPN come attributi di connessione anziché specificare parole chiave della stringa di connessione. In questo modo, viene semplificata la gestione della frammentazione del pool di connessioni.
Nelle applicazioni è inoltre necessario tenere presente che i nomi SPN nelle stringhe di connessione possono essere sostituiti dagli attributi di connessione corrispondenti, mentre le stringhe di connessione usate dal pool di connessioni useranno i valori della stringa di connessione ai fini del pool.
Comportamento dei server legacy
Il nuovo comportamento di connessione viene implementato dal client; pertanto, non è specifico di una versione di SQL Server.
Server collegati e delega
Quando si creano server collegati, è possibile usare il parametro @provstr di sp_addlinkedserver per specificare i nomi SPN del server e del server partner di failover. L'uso di questo parametro offre gli stessi vantaggi ottenuti specificando i nomi SPN nelle stringhe di connessione del client e consente di stabilire in modo più semplice e affidabile connessioni che usano l'autenticazione Kerberos.
La delega con server collegati richiede l'autenticazione Kerberos.
Aspetti correlati alla gestione dei nomi SPN specificati dalle applicazioni
Nel determinare se specificare nomi SPN in un'applicazione (tramite stringhe di connessione) o a livello di programmazione tramite proprietà di connessione (anziché basandosi sui nomi SPN generati dal provider predefinito), considerare gli aspetti seguenti:
Sicurezza: verificare se il nome SPN specificato comporta la divulgazione di informazioni protette.
Affidabilità: per consentire l'uso di nomi SPN predefiniti, è necessario che l'account del servizio usato per l'esecuzione dell'istanza di SQL Server disponga di privilegi sufficienti per l'aggiornamento di Active Directory nel Centro distribuzione chiavi.
Utilità e trasparenza a livello di posizione: valutare le conseguenze sui nomi SPN di un'applicazione se il database viene spostato in un'istanza diversa di SQL Server. Questa considerazione si applica sia al server principale sia al relativo partner di failover se si usa il mirroring del database. Se una modifica apportata al server comporta la modifica dei nomi SPN, valutare le conseguenze sulle applicazioni e determinare se sarà possibile gestire tutte le modifiche.
Definizione del nome SPN
È possibile specificare un nome SPN nelle finestre di dialogo e nel codice. In questa sezione viene descritto come specificare un nome SPN.
La lunghezza massima consentita per un nome SPN è 260 caratteri.
Di seguito viene indicata la sintassi usata per i nomi SPN nella stringa di connessione o negli attributi di connessione:
Sintassi | Descrizione |
---|---|
MSSQLSvc/fqdn | Nome SPN predefinito generato dal provider per un'istanza predefinita quando si utilizza un protocollo diverso da TCP. fqdn è un nome di dominio completo. |
MSSQLSvc/fqdn:port | Nome SPN predefinito generato dal provider quando si utilizza il protocollo TCP. port è un numero di porta TCP. |
MSSQLSvc/fqdn:InstanceName | Nome SPN predefinito generato dal provider per un'istanza denominata quando si usa un protocollo diverso da TCP. InstanceName è un nome di istanza di SQL Server. |
HOST/fqdn HOST/MachineName |
Nome SPN di cui viene eseguito il mapping ad account del computer predefiniti registrati automaticamente in Windows. |
Username@Domain | Specifica diretta di un account di dominio. Username è un nome di account utente di Windows. Domain è un nome di dominio di Windows o un nome di dominio completo. |
MachineName$@Domain | Specifica diretta di un account del computer. Se il server a cui si stabilisce la connessione viene eseguito usando l'account di sistema locale o del servizio di rete, per ottenere l'autenticazione Kerberos ServerSPN può usare il formato MachineName$@Domain . |
KDCKey/MachineName | Nome SPN specificato dall'utente. KDCKey è una stringa alfanumerica conforme alle regole relative alle chiavi KDC. |
Sintassi ODBC e OLE DB con supporto di nomi SPN
Per informazioni specifiche della sintassi, vedere gli argomenti seguenti:
Nomi dell'entità servizio (SPN) nelle connessioni client (ODBC)
Nomi dell'entità servizio (SPN) nelle connessioni client (OLE DB)
Vedi anche
Funzionalità di SQL Server Native Client
Registrazione di un nome dell'entità servizio per le connessioni Kerberos