Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 вопрос по "олицетворению"  [new]
Алексей Куренков
Member [заблокирован]

Откуда: Москва
Сообщений: 567
Столкнулся с задачей на работе, не понял каким образом ее правильно реализовать.
Нужно пользователю дать минимальные и достаточные права на изменение логинов и пользователей БД, по возможности без привелегий sysadmin, securityadmin.
Поэтому вспомнил про "олицетворение". В общем сделал такую хранимку для теста (нужную хранимку не буду писать - многа букаф).

create proc dbo.testproc
@login sysname,
@pwd sysname
with execute as 'adm_user'
as
print user_name()
print suser_name()
declare @q nvarchar(4000) = 'create login ['+@login+'] with password = '''+@pwd+''', default_database=[master], check_expiration=off, check_policy=off'
print @q
exec ( @q )
go
назначил права на исполнение пользователю. и не дает выполнять хранимку - пишет не хватает прав. В оригинальной хранимке USER переименовывать дает, а вот с LOGIN проблемы такие.
Подскажите, каким образом можно обойти эту проблему?
8 ноя 12, 11:18    [13438101]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по "олицетворению"  [new]
Glory
Member

Откуда:
Сообщений: 104760
Для create login нужны права на уровне сервера, а не базы

Requires ALTER ANY LOGIN or ALTER LOGIN permission on the server.
If the CREDENTIAL option is used, also requires ALTER ANY CREDENTIAL permission on the server
8 ноя 12, 11:20    [13438115]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по "олицетворению"  [new]
Алексей Куренков
Member [заблокирован]

Откуда: Москва
Сообщений: 567
Glory
Для create login нужны права на уровне сервера, а не базы

Requires ALTER ANY LOGIN or ALTER LOGIN permission on the server.
If the CREDENTIAL option is used, also requires ALTER ANY CREDENTIAL permission on the server


Согласен, и спасибо за ответ.
Просто хотелось что бы пользователю не давать права на сервер, а только на хранимку. В хранимке можно поставить условия некоторые, например что бы менял только некоторых пользователей, не любых типа

if @login not like 'mysoftuser[_]%' return

И тогда вопрос - а для чего мне нужна фича "олицетворение"? Или каким образом ей пользоваться корректно? Просто когда то на курсах Microsoft ее описывали именно для повышения прав пользователю... Может у "олицетворения" есть ряд ограничений - типа работает на уровне БД, не на уровне сервера?
8 ноя 12, 11:25    [13438147]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по "олицетворению"  [new]
Glory
Member

Откуда:
Сообщений: 104760
Читаем внимательно хелп

{ EXEC | EXECUTE ] AS <context_specification>
[;]

<context_specification>::=
{ LOGIN | USER } = 'name'

LOGIN
Specifies the execution context to be impersonated is a login. The scope of impersonation is at the server level.

USER
Specifies the context to be impersonated is a user in the current database. The scope of impersonation is restricted to the current database. A context switch to a database user does not inherit the server-level permissions of that user.

Для create login нужны права на уровне сервера
8 ноя 12, 11:28    [13438166]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по "олицетворению"  [new]
Алексей Куренков
Member [заблокирован]

Откуда: Москва
Сообщений: 567
Glory,
Спасибо за оперативный и содержательный ответ. Вопрос снят. )
8 ноя 12, 11:28    [13438173]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по "олицетворению"  [new]
tt12
Member

Откуда: Ленинград
Сообщений: 86
Даем возможность пользователю создавать логины в SQL Server, не давая прав администратора.
8 ноя 12, 13:59    [13439613]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по "олицетворению"  [new]
Алексей Куренков
Member [заблокирован]

Откуда: Москва
Сообщений: 567
tt12
Даем возможность пользователю создавать логины в SQL Server, не давая прав администратора.

С олицетворением разобрался наконецто - заработало все. Но в вашей ссылке-статье решение интереснее - безопаснее. Огромное спасибо за инфу.

alter proc dbo.testproc
@login sysname,
@pwd sysname
--with execute as 'admin_sql'
as
print suser_name()
execute as login = 'admin_sql'
print suser_name()
declare @q nvarchar(4000) = 'create login ['+@login+'] with password = '''+@pwd+''', default_database=[master], check_expiration=off, check_policy=off'
print @q
exec ( @q )
go 


use [master]
GO
GRANT IMPERSONATE ON LOGIN::admin_sql TO user_sql
GO

grant exec on testproc to user_sql
8 ноя 12, 15:30    [13440403]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по "олицетворению"  [new]
оно?
Guest
Алексей Куренков
alter proc dbo.testproc
@login sysname,
@pwd sysname
--with execute as 'admin_sql'
as
print suser_name()
execute as login = 'admin_sql'
print suser_name()
declare @q nvarchar(4000) = 'create login ['+@login+'] with password = '''+@pwd+''', default_database=[master], check_expiration=off, check_policy=off'
print @q
exec ( @q )
go 

execute as login = 'admin_sql'
use [master]
GO
GRANT IMPERSONATE ON LOGIN::admin_sql TO user_sql
GO

grant exec on testproc to user_sql


я чего-то не понимаю, или так челу неявно подарили админские права?
т.е. товарищу достаточно набрать перед любой хотелкой
execute as login = 'admin_sql'
и хотелка исполнится от имени админа?
8 ноя 12, 17:43    [13441379]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по "олицетворению"  [new]
Алексей Куренков
Member [заблокирован]

Откуда: Москва
Сообщений: 567
оно?,

Ну... как бы да. Тут или конечному пользователю давать права на alter any login или некой учетке от которой пользователь олицетворение делает в хранимке, сам того не понимая... 2й вариант поинтереснее, хотя конечно с подписью сертификата веселее.
12 ноя 12, 15:59    [13459735]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по "олицетворению"  [new]
Алексей Куренков
Member [заблокирован]

Откуда: Москва
Сообщений: 567
оно?,

ну и учетку admin_sql не обязательно воспринимать как админ в прямом смысле. можно же ее назвать user_can_alter_login.
по сути меняем буквы а не смысл
12 ноя 12, 16:01    [13459743]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по "олицетворению"  [new]
оно?
Guest
с подписью сертификата надежнее.
а веселее как раз вариант с IMPERSONATE.
кагбэ можно в sys.server_permissions поинтересоваться, откуда вдруг права взялись логины создавать.
и если там стоит в явном виде ALTER ANY LOGIN, можно и успокоиться.
а вот если там IMPERSONATE, остается только логин подходящий подобрать для экспериментов.
и да, название логина говорящее.
куда веселее-то!
12 ноя 12, 17:47    [13460638]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по "олицетворению"  [new]
Алексей Куренков
Member [заблокирован]

Откуда: Москва
Сообщений: 567
оно?,

На всякий случай напишу завершенное решение
Для начала на текущую базу где эта хранимка необходимо разрешить инстансу доверять содержимому текущей БД - alter database mydb set trustworthy on. Затем вполне достаточно указать в хранимке WITH EXEC AS SELF (ну или другой юзер имеющий права на создание логинов).
И собственно назначить любому пользователю права на исполнение этой хранимки.
8 янв 13, 15:01    [13736123]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить