Configurare la delega non vincolata per BULK INSERT


12

Ho un paio di nodi di Microsoft SQL Server 2016 in un gruppo di disponibilità Always On. Sto provando a eseguire un BULK INSERT(utilizzando una query di SQL Server 2016 Management Studio) su un file che si trova in un cluster di failover del file server di Windows Server 2016, ma visualizzo il seguente errore:

Messaggio 4861, livello 16, stato 1
Impossibile caricare in blocco perché non è stato possibile aprire il file "\ nas2.my.domain \ Microsoft SQL Server 2016 Enterprise \ test.txt". Codice di errore del sistema operativo 5 (accesso negato.).

Ciò accadrà a prescindere se utilizzo il nome nodo attivo ( nas2.my.domain) o il listener di cluster di failover ( nas.my.domain).

Dopo essermi guardato intorno ho scoperto che ciò era dovuto al fatto che SQL Server non era in grado di impersonare l'account utente con cui sono connesso a causa di sfumature BULK INSERT.

Se ci si connette a SQL Server utilizzando l'autenticazione di Windows, l'account del servizio SQL Server tenta di rappresentare l'account utente durante la connessione al file server. Se ci si connette utilizzando l'autenticazione di SQL Server, si connetterà al file server come account del servizio SQL Server.

Se la delega e la rappresentazione non sono configurate correttamente (lo stato predefinito), il servizio SQL Server non sarà in grado di impersonare l'account utente e tornerà a tentare di connettersi al file server come utente anonimo.

Ciò può essere confermato guardando nel registro degli eventi di sicurezza sul file server. Questi fatti insieme a una guida sulla configurazione della delega vincolata e vincolata sono documentati in questi collegamenti:

Ho provato a seguire le istruzioni nella guida di quequdeude ma non funziona ancora.

Il database che sto cercando di BULK INSERTfare non fa parte del gruppo di disponibilità, quindi solo il nodo MSSQL1 dovrebbe essere rilevante. Il file server era attivo sul nodo NAS2. Il controllo del registro eventi sul file server mostra che sta ancora soffrendo di questo problema e SQL Server sta tentando di autenticarsi sul file server come utente anonimo anziché impersonare il mio account utente.

Qualcuno sa cosa sta andando storto? O se qualcosa è cambiato in SQL Server 2016 per rendere obsolete queste guide?

Posso confermare che questo oggetto Criteri di gruppo è stato applicato a MSSQL1 tramite gpresult.exe /Re che sia i nodi SQL che i file server sono stati riavviati in seguito per garantire che tutte le cache siano state svuotate.


1
Due domande: 1) Hai provato ad abilitare il tuo account di dominio Windows personale per la delega? 2) Quando ti connetti a SQL Server tramite SSMS, sei connesso al server (ovvero Desktop remoto) su cui SQL Server è in esecuzione e si connette localmente, o hai effettuato l'accesso alla tua workstation e ti sei connesso a SQL Server in remoto? Se non si è tentato di accedere direttamente al server e connettersi localmente tramite SSMS, provare. Se non hai provato ad abilitare il tuo account di dominio per la delega, provalo.
Solomon Rutzky

Risposte:


1

La tua configurazione sembra solida. SPN e delegazione sono configurati come avrei fatto io.

L'unica cosa che non hai spiegato sono le autorizzazioni di file / condivisione. È qui che interviene la mia soluzione.

Soluzione 1 (account personale)

  1. Verificare che al proprio account personale sia consentito accedere al file sulla condivisione del file server
    • il tuo account personale richiede almeno le autorizzazioni READ a livello di autorizzazione della condivisione o nella maggior parte dei casi potresti vedere TUTTI i permessi READ.
    • il tuo account personale necessita almeno delle autorizzazioni READ a livello di autorizzazione del file
    • Controlla l'ereditarietà delle autorizzazioni a livello di file per quel file
      • Riavviare SQL Server dopo aver modificato le autorizzazioni del file o scorrere il servizio SQL Server.
    • In alternativa: accedi a SQL Server con il tuo account personale e connettiti alla condivisione e apri il file.
  2. Apri SSMS con il tuo account personale .
  3. Aprire una connessione all'istanza di SQL Server con l'autenticazione di Windows.
    • Verifica di essere connesso alla tua istanza con l'account del servizio SQL Server con lo script che hai usato in precedenza.
  4. Esegui l'importazione con BULK INSERT

Soluzione 2 (account del servizio SQL Server)

  1. Verificare che l' account del servizio SQL Server sia autorizzato ad accedere al file sulla condivisione del file server
    • l' account del servizio SQL Server richiede almeno le autorizzazioni READ a livello di autorizzazione di condivisione o nella maggior parte dei casi è possibile che TUTTI dispongano delle autorizzazioni READ.
    • l' account del servizio SQL Server richiede almeno le autorizzazioni READ a livello di autorizzazione del file
    • Controlla l'ereditarietà delle autorizzazioni a livello di file per quel file
      • Riavviare SQL Server dopo aver modificato le autorizzazioni del file o scorrere il servizio SQL Server.
    • In alternativa: accedere a SQL Server con l'account del servizio SQL Server, connettersi alla condivisione e aprire il file.
  2. Aprire SSMS con l'account del servizio SQL Server .
    • Runas: tuo_dominio \ SQL_Server_service_account
    • Fornire password
  3. Apri una connessione a SQL Server con l'autenticazione di Windows.
    • Verifica di essere connesso alla tua istanza con l'account del servizio SQL Server con lo script che hai usato in precedenza.
  4. Esegui l'importazione con BULK INSERT

BULK INSERT autorizzazioni

Delega dell'account di sicurezza (rappresentazione)

Se un utente utilizza un account di accesso di SQL Server, viene utilizzato il profilo di sicurezza dell'account del processo di SQL Server. Un accesso che utilizza l'autenticazione di SQL Server non può essere autenticato al di fuori del Motore di database. Pertanto, quando un comando BULK INSERT viene avviato da un accesso mediante l'autenticazione di SQL Server, la connessione ai dati viene stabilita utilizzando il contesto di sicurezza dell'account del processo di SQL Server (l' account utilizzato dal servizio Motore di database di SQL Server ). Per leggere correttamente i dati di origine è necessario concedere l'account utilizzato dal Motore di database di SQL Server, accedere ai dati di origine. Al contrario, se un utente di SQL Server accede utilizzando l' autenticazione di Windows, l'utente può leggere solo i file a cui è possibile accedere dall'account utente, indipendentemente dal profilo di sicurezza del processo di SQL Server.

Riferimento: BULK INSERT (Transact-SQL)


0

Nella mia esperienza con la delega, l'account del servizio SQL Server necessita delle autorizzazioni appropriate per la condivisione a cui sta tentando di accedere per conto dell'utente. Hai modificato queste autorizzazioni? Penso che la sola lettura sarebbe sufficiente in anticipo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.