19.1.23

Даем возможность пользователю создавать логины в SQL Server, не давая прав администратора.

http://www.sql.ru/blogs/decolores/950

добавлено: 08 апр 11
Автор: DeColo®es

Очень популярный на форумах по SQL Server вопрос - "Как защититься от администратора?".
Самый популярный ответ "А не надо пущать!"
Но что делать, когда кто-то должен все-таки управлять сервером?
Например, создавать логины новых пользователей...



Рассмотрим сценарий (так теперь в Microsoft любят делать вместо просто создания красивых абстрактных технологий :) ):

Вы создали базу данных и установили заказчику.

Вы не хотите, чтобы он "ковырялся" в ней и для этого (например)

·  Доступа к таблицам нет, вся работа - только через процедуры

·  Настроили кучу джобов, которые обслуживают базу

·  Обеспечили возможность безопасного соединения по VPN на случай "если что-то слетит".

·  Дали "самый главный пароль" в запечатанном конверте директору под расписку.

·  Местному админу дали права администратора своей базы (не sysadmin и не db_owner), все возможности которого сводятся только к настройке бизнес-процессов в программе
Но через 2 месяца Вы поняли, что каждый раз заводить логин самому уже надоело, поскольку максимум, что может сделать любой другой пользователь - это поработать в программе.

Итак, наша задача дать простому пользователю (ну или не очень простому) не давая прав администратора, возможность создавать логины.

В принципе, есть такое право - ALTER ANY LOGIN, но для нас этого слишком много! Ведь он же сможет менять пароли и даже удалять пользователей!
(В моей практике был случай, когда не в меру шустрый коммерческий директор, у которого были права sysadmin как раз для раздачи прав, решил поковыряться в настройках доступа не из интерфейса программы, а из Enterprise Manager :) )

Еще есть конструкция EXECUTE AS...
Потратив на попытки прикрутить ее к этой задаче час-другой, разработчики обычно приходят к выводу, что все-таки создать логин не получится - impersonate для этой операции не работает и сервер явно проверяет права пользователя, подключившегося к нему.

А еще есть вариант: пишется процедура, которая сама логин не создает, а только кладет сам логин и пароль в некую табличку, данные из которой забирает специальный job и под правами sa создает все, что нужно. Ну а job выполняется раз в час или в минуту - по желанию.
Но например в Express редакциях нет SQL Agent-а...

Все гораздо проще!

Можно воспользоваться сертификатами (это совсем не больно и не надо ждать, пока job отработает):

-- Процедура регистрации нового пользователя в системе
create procedure dbo.___CreateLogin
      @login varchar(128),
      @password varchar(128)
as
begin
declare @sql varchar(max)    
set @sql = 'create login '
      +quotename(@login, '[')
      +' with password = '''
      +replace(@password, '''', '''''')+''''
exec(@sql)
end
go
-- И даже даем права на выполнение
grant execute on dbo.___CreateLogin to Demo
-- Но этого мало...
-- Создаем сертификат
CREATE CERTIFICATE SecurityDummyCertificate
ENCRYPTION BY PASSWORD = 'P@ssw0rds$houldBeReally$tr0ng'
WITH SUBJECT = 'For the very important things', 
EXPIRY_DATE = '2015-12-31'
-- Создаем логин из сертификата
CREATE LOGIN VirtualSecurityOfficer
FROM CERTIFICATE SecurityDummyCertificate;
go
-- Даем этому виртуальному логину нужные права
grant alter any login to VirtualSecurityOfficer
go
-- Подписываем процедуру сертификатом
ADD SIGNATURE TO dbo.___CreateLogin 
BY CERTIFICATE SecurityDummyCertificate
WITH PASSWORD = 'P@ssw0rds$houldBeReally$tr0ng'
go
-- Вот теперь все работает


Теперь наш логин Demo может запускать процедуру ___CreateLogin, у которой есть возможность модифицировать логины, но функционально - можно только создавать.

важный момент

Поскольку логины существуют на уровне сервера, то данный скрипт нужно выполнять в базе данных master



У данного решения есть и недостаток: пароль передается "открытым текстом". Но это можно "решить" либо включив шифрацию траффика, либо - передавать в процедуру пароль, шифрованный спелиально для этого созданным открытым ключем.

Исходный материал: http://msdn.microsoft.com/en-us/library/bb283630.aspx
То же, на русском: http://msdn.microsoft.com/ru-ru/library/bb283630.aspx

Комментариев нет:

Отправить комментарий