AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 199237
Accepted
McNets
McNets
Asked: 2018-03-03 07:59:51 +0800 CST2018-03-03 07:59:51 +0800 CST 2018-03-03 07:59:51 +0800 CST

Permissões de serviço do SQL Server no compartilhamento de rede dependendo de IntegratedSecurity=true/false

  • 772

Nossa empresa recebe um arquivo diário de um de nossos clientes. É um arquivo EDIFACT traduzido para XML e baixado de um servidor SFTP.

Desenvolvemos um aplicativo (console c#) que:

  1. Baixe o arquivo.
  2. Carregue-o em um SQL Server (2005) usando um procedimento armazenado.
  3. Exclui este arquivo do compartilhamento de rede.
  4. Executa outro procedimento armazenado para integrá-lo às tabelas do nosso pedido de venda.

O serviço de agente SQL-Server e SQL-Server é iniciado como LocalSystemconta. (Ele será substituído em breve e prefiro deixá-lo como está, sei que não está configurado corretamente.)

O procedimento para armazenar o arquivo em nosso SQL-Server é semelhante a este:

CREATE PROCEDURE [dbo].[sp_ProviderName_Download]
(
    -- FQN of XML file
    @file_name nvarchar(260)
)
AS
BEGIN

    DECLARE @xml_data XML,
            @cmd nvarchar(max);

    BEGIN TRY

        SET @cmd = 'SELECT @xmlText = BulkColumn FROM OPENROWSET(BULK '
                    + '''' + @file_name + ''''
                    + ', SINGLE_BLOB) x;';

        EXEC sp_executesql @cmd, N'@xmlText XML OUTPUT', @xmlText = @xml_data OUTPUT;

        INSERT INTO [dbo].[ProviderXML_Register] (..., xml_data)
        VALUES (..., @xml_data);

        RETURN 0;

    END TRY
    BEGIN CATCH

        EXEC [dbo].[vsp_error_handler];
        RETURN -1;

    END CATCH

END

A questão :

O procedimento armazenado funciona dependendo de como definimos o ConnectionString em nosso aplicativo C#.

Se usar IntegratedSecurity=false:

this.scsb = new SqlConnectionStringBuilder();
this.scsb.ApplicationName = "ProviderXML_Download";
this.scsb.WorkstationID = Environment.MachineName;
this.scsb.DataSource = "xxx.xxx.xxx.xxx";
this.scsb.InitialCatalog = "my_db";
this.scsb.IntegratedSecurity = false;
this.scsb.Password = "*******";
this.scsb.UserID = "SqlServerLogin";

Funciona corretamente sem erros.

Mas se conectar usando IntegratedSecurity=true (usuário AD)

this.scsb = new SqlConnectionStringBuilder();
this.scsb.ApplicationName = "ProviderXML_Download";
this.scsb.WorkstationID = Environment.MachineName;
this.scsb.DataSource = "SQL_INSTANCE_NAME";
this.scsb.InitialCatalog = "my_db";
this.scsb.IntegratedSecurity = true;

ele falha com erro:

Erro do sistema operacional 5 Acesso negado.

O usuário do AD tem direitos MODIFICAR no compartilhamento de rede. E até onde eu sei, a conta 'LocalSystem' não deve poder acessar o compartilhamento de rede.

  • Por que estou recebendo este erro quando IntegratedSecurity=true?
sql-server sql-server-2005
  • 1 1 respostas
  • 6569 Views

1 respostas

  • Voted
  1. Best Answer
    Solomon Rutzky
    2018-03-03T09:01:48+08:002018-03-03T09:01:48+08:00

    O problema é devido à forma como a segurança é tratada para operações em massa e as limitações padrão de representação.

    Ao se conectar com um logon do SQL Server, não há SID/contexto de segurança externo do Windows, portanto, o SQL Server usa o contexto de segurança da conta de serviço quando precisar acessar fora do SQL Server (ou seja, interagir com o SO, rede etc.). Portanto, se a conta de serviço do SQL Server for a conta do sistema local, essa será a conta usada para acesso externo. Como seu arquivo está na rede, teria que ser que "Sistema Local" tenha acesso a esse compartilhamento de rede. Isso é possível dando acesso ao próprio servidor (especificando <domain_name>\<computer_name>$ para as permissões NTFS). Nesse caso, o processo do SQL Server não está usando a representação: o acesso externo está sendo feito no contexto de segurança do próprio processo.

    Ao se conectar ao SQL Server usando um Login do Windows (seja conta AD ou conta local no servidor), há um SID a ser usado, e o SQL Server usará esse SID (ID de segurança que aponta para a conta Windows/AD) para acesso externo . Isto é o que acontece ao conectar com "Integrated Security" / "Trusted_Connection" = true. Agora, usar o SID da conta que faz login no SQL Server significa que o SQL Server está usando a representação para fazer com que sua solicitação de rede pareça estar vindo desse outro SID em vez de "Sistema Local" (lembre-se, a conta de serviço possui osqlservr.exeprocesso, e é esse processo, não o SID que faz login no SQL Server, que está fazendo a solicitação de rede). A representação, por padrão, é colocada em quarentena na máquina em que o processo foi iniciado (semelhante a como o uso de representação via EXECUTE AS useré, por padrão, colocado em quarentena no banco de dados). Portanto, os comandos BULK INSERT/ OPENROWSET(BULK...devem ser capazes de ver arquivos localmente no servidor em que o SQL Server está sendo executado, mas os compartilhamentos de rede não são locais e o contexto de segurança representado, por padrão, não se estende tão longe. O que você está vendo aqui deve ser a mesma coisa que o infame problema do "salto duplo".

    Então, você pode fazer um dos seguintes:

    1. dar permissão nesse compartilhamento de rede paraEVERYONE

    2. continue fazendo login através do SQL Server Login e não se preocupe em usar a Segurança Integrada/Conexão Confiável.

    3. Habilite "Delegação", embora não tenha certeza se isso funcionará em uma conta do Sistema Local (você mencionou o SQL Server Agent em execução como "Sistema Local", então é isso que estaria se conectando ao SQL Server). Pode ser necessário configurar uma conta do AD e habilitar essa conta para "Delegação" para que possa ir além do servidor local. De qualquer forma, "Delegação" é como se configura o AD para permitir que uma permissão de conta (talvez até mesmo uma combinação de conta/serviço) vá além da quarentena padrão.

      PS @StrayCatDBA mencionou que usar a conta de serviço de rede (ou seja, NT AUTHORITY\NETWORK SERVICE permite delegação. Além disso, consulte o link "Configurar contas e permissões de serviço do Windows" na parte inferior, pois a documentação aborda as várias opções que você tem.

    Algumas informações aqui:

    • Importar dados em massa usando BULK INSERT ou OPENROWSET(BULK...) (a seção de considerações de segurança ; o link deve ir diretamente para lá)
    • Visão geral da delegação restrita de Kerberos
    • Como configurar o servidor para ser confiável para delegação
    • Como implementar a delegação restrita de Kerberos com o SQL Server 2008
    • Configurar contas e permissões de serviço do Windows
    • 4

relate perguntas

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

  • Downgrade do SQL Server 2008 para 2005

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve