Configurar delegação irrestrita para BULK INSERT

12

Eu tenho um par de nós do Microsoft SQL Server 2016 em um grupo de disponibilidade sempre ativa. Estou tentando executar um BULK INSERT(usando uma consulta do SQL Server 2016 Management Studio) em um arquivo localizado em um Cluster de Failover do Servidor de Arquivos do Windows Server 2016, mas recebo o seguinte erro:

Mensagem 4861, nível 16, estado 1
Não é possível carregar em massa porque o arquivo "\ nas2.my.domain \ Microsoft SQL Server 2016 Enterprise \ test.txt" não pôde ser aberto. Código de erro do sistema operacional 5 (acesso negado.).

Isso ocorrerá independentemente se eu usar o nome do nó ativo ( nas2.my.domain) ou o ouvinte do cluster de failover ( nas.my.domain).

Depois de olhar ao redor, descobri que isso se devia ao fato de o SQL Server não poder representar a conta de usuário com a qual estou conectado devido a nuances BULK INSERT.

Se você se conectar ao SQL Server usando a Autenticação do Windows, a conta de serviço do SQL Server tentará representar sua conta de usuário ao se conectar ao servidor de arquivos. Se você se conectar usando a autenticação do SQL Server, ele se conectará ao servidor de arquivos como a conta de serviço do SQL Server.

Se a delegação e a representação não estiverem configuradas corretamente (o estado padrão), o serviço do SQL Server não poderá representar sua conta de usuário e voltará a tentar se conectar ao servidor de arquivos como um usuário anônimo.

Isso pode ser confirmado consultando o log de eventos de segurança no servidor de arquivos. Esses fatos, juntamente com um guia sobre a configuração de delegação sem restrições e restritas, estão documentados nesses links:

Eu tentei seguir as instruções no guia do thqqude , mas ele ainda não está funcionando.

O banco de dados que estou tentando BULK INSERTnão faz parte do grupo de disponibilidade, portanto, apenas o nó MSSQL1 deve ser relevante. O servidor de arquivos estava ativo no nó NAS2. A verificação do log de eventos no servidor de arquivos mostra que ele ainda está sofrendo com esse problema e o SQL Server está tentando se autenticar no servidor de arquivos como um usuário anônimo, em vez de se passar por minha conta de usuário.

Alguém sabe o que está errado? Ou se algo mudou no SQL Server 2016 para tornar esses guias obsoletos?

Posso confirmar que esse GPO foi aplicado ao MSSQL1 via gpresult.exe /Re os nós do SQL e do servidor de arquivos foram reinicializados posteriormente para garantir que todos os caches fossem liberados.

Muh Fugen
fonte
1
Duas perguntas: 1) Será que você tente ativar sua conta do Windows domínio pessoal para Delegação ?, 2) Quando você se conectar ao SQL Server via SSMS, você está conectado ao servidor (desktop ou seja Remoto) que o SQL Server está sendo executado e ligar localmente, ou conectado à sua estação de trabalho e se conectando ao SQL Server remotamente? Se você não tentou fazer logon no servidor diretamente e se conectar localmente via SSMS, tente isso. Se você ainda não tentou habilitar sua conta de domínio para delegação, tente isso.
Solomon Rutzky 14/03

Respostas:

1

Sua configuração parece sólida. SPNs e delegação estão configurados como eu mesmo teria feito.

A única coisa que você não explicou são as permissões de arquivo / compartilhamento. É aqui que entra minha solução.

Solução 1 (conta pessoal)

  1. Verifique se sua conta pessoal tem permissão para acessar o arquivo no compartilhamento do servidor de arquivos
    • sua conta pessoal precisa de pelo menos permissões de leitura no nível de permissão de compartilhamento ou, na maioria dos casos, você verá que TODOS têm permissão de leitura.
    • sua conta pessoal precisa de pelo menos permissões de leitura no nível de permissão do arquivo
    • Verifique a herança de permissão no nível do arquivo para esse arquivo
      • Reinicie o SQL Server após alterar as permissões do arquivo ou alterne o serviço do SQL Server.
    • Como alternativa: Entre no SQL Server com sua conta pessoal e conecte-se ao compartilhamento e abra o arquivo.
  2. Abra o SSMS com sua conta pessoal .
  3. Abra uma conexão com sua instância do SQL Server com autenticação do Windows.
    • Verifique se você está conectado à sua instância com a conta de serviço do SQL Server com o script que você usou anteriormente.
  4. Execute a importação com BULK INSERT

Solução 2 (conta de serviço do SQL Server)

  1. Verifique se a conta de serviço do SQL Server tem permissão para acessar o arquivo no compartilhamento do servidor de arquivos
    • a conta de serviço do SQL Server precisa de pelo menos permissões de leitura no nível de permissão de compartilhamento ou, na maioria dos casos, você verá que TODOS têm permissões de leitura.
    • a conta de serviço do SQL Server precisa de pelo menos permissões READ no nível de permissão do arquivo
    • Verifique a herança de permissão no nível do arquivo para esse arquivo
      • Reinicie o SQL Server após alterar as permissões do arquivo ou alterne o serviço do SQL Server.
    • Como alternativa: Faça logon no SQL Server com a conta de serviço do SQL Server, conecte-se ao compartilhamento e abra o arquivo.
  2. Abra o SSMS com a conta de serviço do SQL Server .
    • Runas: seu_domínio \ SQL_Server_service_account
    • Forneça a senha
  3. Abra uma conexão com o SQL Server com autenticação do Windows.
    • Verifique se você está conectado à sua instância com a conta de serviço do SQL Server com o script que você usou anteriormente.
  4. Execute a importação com BULK INSERT

Permissões de inserção em massa

Delegação de conta de segurança (representação)

Se um usuário usar um logon do SQL Server, o perfil de segurança da conta de processo do SQL Server será usado. Um logon usando autenticação do SQL Server não pode ser autenticado fora do Mecanismo de Banco de Dados. Portanto, quando um comando BULK INSERT é iniciado por um logon usando a autenticação do SQL Server, a conexão com os dados é feita usando o contexto de segurança da conta de processo do SQL Server (a conta usada pelo serviço Mecanismo de Banco de Dados do SQL Server ). Para ler com êxito os dados de origem, você deve conceder à conta usada pelo Mecanismo de Banco de Dados do SQL Server, acesso aos dados de origem. Por outro lado, se um usuário do SQL Server fizer logon usando a Autenticação do Windows, o usuário poderá ler apenas os arquivos que podem ser acessados ​​pela conta do usuário, independentemente do perfil de segurança do processo do SQL Server.

Referência: BULK INSERT (Transact-SQL)

John aka hot2use
fonte
0

Na minha experiência com delegação, a Conta de Serviço do SQL Server precisa de permissões apropriadas para o compartilhamento que está tentando acessar em seu nome. Você ajustou essas permissões? Eu acho que apenas leitura seria suficiente antecipadamente.

Chris Lumnah
fonte