Configuração segura do usuário no Sql Server 2000

2

Estou procurando configurar uma conta de usuário no Sql Server 2000 da maneira mais segura. Os critérios são os seguintes:

  • Sem acesso ao banco de dados mestre ( db_denydatareader & db_denydatawriter no mestre)
  • Permissão de leitura do banco de dados ( db_datareader )
  • Permissão de gravação do banco de dados ( db_datawriter )
  • Permissão de execução do banco de dados para sprocs ( ??? )

Para mim, isso parece ser uma configuração bastante simples e que deveria ser um esquema padrão. Correndo por um casal artigos mostram que não é e que conceder permissões de execução de sproc é menos que fácil.

Existe uma maneira mais fácil de conceder permissão de execução ao sproc? Existe um esquema de captura de todos os que fornece acesso seguro ao banco de dados? Estou acompanhando no caminho certo?

    
por Gavin Miller 24.08.2009 / 17:59

2 respostas

1

Não há uma função de banco de dados incorporada para os direitos de execução de procedimentos armazenados no SQL Server 2000. No entanto, o primeiro artigo que você citou realmente contém tudo o que você precisa para resolver completamente o problema. No entanto, tentarei soletrar um pouco mais claramente em um processo passo a passo (que você precisará seguir apenas uma vez para criar a função e, em seguida, executar a última etapa somente sempre que criar uma nova procedimento). Neste procedimento, usarei o nome my_database para o banco de dados que você deseja configurar desta maneira:

  1. Crie o procedimento armazenado sp_grantexecute (vinculado desde o primeiro artigo):

    use master
    go
    create procedure sp_grantexec(@user sysname,@pattern sysname = NULL,@debug int = 0)
    as
    set nocount on
    declare @ret int
    declare @sql nvarchar(4000)
    declare @db  sysname ; set @db = DB_NAME()
    declare @u   sysname ; set @u = QUOTENAME(@user)
    
    set @sql ='select ''grant exec on '' + QUOTENAME(ROUTINE_SCHEMA) + ''.'' +
              QUOTENAME(ROUTINE_NAME) + '' TO ' + @u + ''' FROM INFORMATION_SCHEMA.ROUTINES ' + 
              'WHERE OBJECTPROPERTY(OBJECT_ID(ROUTINE_NAME),''IsMSShipped'') = 0'
    
    if @pattern is not null
    set @sql = @sql + N' AND ROUTINE_NAME LIKE ''' + @pattern + ''''
    
    if @debug = 1 print @sql
    else
    exec @ret = master.dbo.xp_execresultset @sql,@db
    
    If @ret <> 0
    begin
       raiserror('Error executing command %s',16,1,@sql)
       return -1
    end
    
  2. Crie uma função personalizada chamada db_executor (repita essa etapa para cada banco de dados no qual você deseja que essa função seja configurada)

    USE my_database
    GO
    EXEC sp_add_role 'db_executor'
    
  3. Conceder direitos de execução para todos os procedimentos existentes para a nova função (execute apenas esta etapa toda vez que criar um novo procedimento) usando o procedimento sp_grantexecute que você adicionou anteriormente:

    USE my_database
    GO
    EXEC master.dbo.sp_grantexecute 'db_executor'
    

Agora, basta atribuir a nova função ( db_executor ) às duas outras funções ( db_datareader e db_datawriter ) aos usuários que devem ter o acesso que você está procurando.

    
por 24.08.2009 / 19:18
1

Além da resposta de Jessica, você pode obviamente configurar um trabalho do SQL Agent para executar sp_grantexec a cada minuto ou algo assim. Se você estiver no SQL Server 2005, obtive êxito com os disparadores de esquema em nível de banco de dados para conceder a permissão EXEC ao db_executor sempre que um procedimento / função armazenado é criado.

Ausente de outros requisitos, geralmente você não precisa se preocupar com leitura / gravação master, mas sim executar determinados procedimentos armazenados estendidos em 2000 (a maioria das tabelas de sistema / views é limitada pela função do usuário executando a consulta). usuários associados).

O

link é um bom recurso para bloquear uma instância do SQL 2000. Lembre-se sempre de testar em uma máquina sem produção primeiro.

O MBSA às vezes também pode apontar problemas básicos no SQL.

    
por 06.01.2010 / 02:12