Я хочу настроить учетную запись пользователя в Sql Server 2000 наиболее безопасным способом. Критерии следующие:
db_denydatareader
& db_denydatawriter
на хозяине)db_datareader
)db_datawriter
)???
)Мне это кажется довольно простой схемой, и это должна быть стандартная схема. Пробегая через пара статьи покажите, что это не так и что предоставить sproc разрешения на выполнение непросто.
Есть ли более простой способ предоставить разрешение на выполнение sproc? Существует ли универсальная схема, обеспечивающая безопасный доступ к базе данных? На правильном ли я иду?
В дополнение к ответу Джессики вы, очевидно, можете настроить задание агента SQL для запуска sp_grantexec каждую минуту или что-то в этом роде. Если вы используете SQL Server 2005, я успешно использовал триггеры схемы на уровне базы данных, чтобы предоставить разрешение EXEC для db_executor всякий раз, когда создается хранимая процедура / функция.
При отсутствии других требований обычно вам не нужно беспокоиться о главном чтении / записи, а вместо этого выполнять определенные расширенные хранимые процедуры на 2000 (большинство системных таблиц / представлений ограничены ролью пользователя, выполняющего запрос (разрешенные входы не имеют связанных пользователей ).
http://vyaskn.tripod.com/sql_server_security_best_practices.htm - хороший ресурс для блокировки экземпляра SQL 2000. Не забывайте всегда сначала тестировать на непроизводственной машине.
MBSA иногда также может указать на основные проблемы в SQL.
В SQL Server 2000 нет встроенной роли базы данных для прав выполнения хранимых процедур. Однако первая процитированная вами статья фактически содержит все, что вам нужно для полного решения вашей проблемы. Тем не менее, я попытаюсь изложить это немного более четко в пошаговом процессе (вам нужно будет выполнить только один раз, чтобы создать роль, а затем повторно запустить последний шаг только при создании нового процедура). В этой процедуре я собираюсь использовать имя my_database для базы данных, которую вы хотите настроить следующим образом:
Создайте хранимую процедуру sp_grantexecute (ссылка из первой статьи):
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
Создайте настраиваемую роль с именем db_executor (повторите этот шаг для каждой базы данных, в которой вы хотите настроить эту роль)
USE my_database GO EXEC sp_add_role 'db_executor'
Предоставить права исполнения для всех существующий процедуры для новой роли (запускайте только этот шаг каждый раз, когда вы создаете новую процедуру) с помощью процедуры sp_grantexecute, которую вы добавили ранее:
USE my_database GO EXEC master.dbo.sp_grantexecute 'db_executor'
Теперь вы можете просто назначить новую роль (db_executor
) в дополнение к двум другим ролям (db_datareader
и db_datawriter
) пользователям, которые должны иметь доступ, который вы ищете.