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

Откуда:
Сообщений: 284
Имеется вызов требующий больших прав:
  select * from sys.dm_exec_sessions

При обычных правах пользователя [SimpleUser] видна только одна сессия - данного пользователя [SimpleUser].
Но, нужно увидеть все сессии.
Есть в базе еще один пользователь [SuperUser], у которого есть админовские права и он может видеть вс сессии.
Выполнение запроса от его имени:
  Execute as user = 'SuperUser'
  select * from sys.dm_exec_sessions
  Revert

дает ошибку:
 Cannot execute as the database principal because the principal "SuperUser" does not exist, 
             this type of principal cannot be impersonated, or you do not have permission.

Выполняю команду:
  grant IMPERSONATE on USER::[SuperUser] to [SimpleUser]

Теперь выполнение запроса:
  Execute as user = 'SuperUser'
  select * from sys.dm_exec_sessions
  Revert

не выдает ошибки, но запрос выдает только одну сессию, которая соответствует пользователю [SimpleUser].
Что-то не работает.
Подскажите что делаю не так.
20 авг 14, 11:03    [16466752]     Ответить | Цитировать Сообщить модератору
 Re: Execute AS  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6178
grant view server state to [SimpleUser]
20 авг 14, 11:54    [16467170]     Ответить | Цитировать Сообщить модератору
 Re: Execute AS  [new]
ЧитательX
Member

Откуда:
Сообщений: 284
Помогло. Спасибо за совет.
20 авг 14, 12:10    [16467331]     Ответить | Цитировать Сообщить модератору
 Re: Execute AS  [new]
ЧитательX
Member

Откуда:
Сообщений: 284
Вообще-то я слегка погорячился, заявив, что проблема решена.
В данном решении суть в том, что право дается [SimpleUser].
Мне же нужно, чтобы правом обладал только [SuperUser] и лишь иногда это право предоставлялось бы [SimpleUser].
Например, в некоторой процедуре, используя конструкцию "Execute AS USER=SuperUser".
20 авг 14, 12:39    [16467552]     Ответить | Цитировать Сообщить модератору
 Re: Execute AS  [new]
o-o
Guest
вы не понимаете разницу между юзером и логином, оттуда и вся проблема.
уже фраза "Есть в базе еще один пользователь [SuperUser], у которого есть админовские права" -- неправильная,
юзер базы имеет права в базе, а вам для всех сессий нужны права ЛОГИНУ на сервер.

Сон Веры Павловны подсказал, какие права дать ЛОГИНУ SimpleUser, чроб он увидел все сессии.
а юзер базы вообще ни при чем.
20 авг 14, 12:43    [16467579]     Ответить | Цитировать Сообщить модератору
 Re: Execute AS  [new]
o-o
Guest
ЧитательX
Мне же нужно, чтобы правом обладал только [SuperUser] и лишь иногда это право предоставлялось бы [SimpleUser].
Например, в некоторой процедуре, используя конструкцию "Execute AS USER=SuperUser".


смотрите.
sys.dm_exec_sessions is a server-scope view.
Requires VIEW SERVER STATE permission on server

если надо, чтобы кто-то смог воспользоваться правами логина SuperUser,
надо выполнить код от имени логина:
Execute as login = 'SuperUser'


в процедуре Execute as <login> не прокатит, в ней в именно юзер, а не логин.

дать логину SimpleUser IMPERSONATE на логин SuperUser с админскими правами это примерно то же, что емy прямиком sysadmin-а дать, так делать не надо.
но есть решение через сертификат, заморочно, но можно
20 авг 14, 12:58    [16467710]     Ответить | Цитировать Сообщить модератору
 Re: Execute AS  [new]
ЧитательX
Member

Откуда:
Сообщений: 284
Уважаемый ооо. Я понимаю разницу между юзером и логином.
Суть в том, что мне нежелательно каждому очередному [SimpleUser]-у прописывать права на просмотр серверных свойств.
По хорошему, этим [SimpleUser]-ам вообще нельзя давать таких прав.
Поэтому, в момент когда нужно провести некотрый анализ в сессии конкретного [SimpleUser] нужно выполнить некоторый код от имени [SuperUser]. Т.е. речь идет об инструкции "Execute as ..", которая работает при наличии делегирования.
20 авг 14, 13:02    [16467749]     Ответить | Цитировать Сообщить модератору
 Re: Execute AS  [new]
o-o
Guest
ЧитательX,

уверены, что понимаетe?
вам надо дать server-scope permission,
и вы хотите его дать ЮЗЕРУ?
попробуем вместе:
create user o_o without login
grant view server state to o_o

Msg 15151, Level 16, State 1, Line 1
Cannot find the login 'o_o', because it does not exist or you do not have permission.
сервер считает, что права уровня сервера надо логину давать, а не юзеру.
лучше бы почитали про сертификаты
20 авг 14, 13:10    [16467809]     Ответить | Цитировать Сообщить модератору
 Re: Execute AS  [new]
ЧитательX
Member

Откуда:
Сообщений: 284
А вот инструкция в сессии [SimpleUse]
execute as login=SuperUser

выдает:
The name "SuperUser" is not permitted in this context. Valid expressions are constants, constant expressions, and (in some contexts) variables. Column names are not permitted.
20 авг 14, 13:12    [16467820]     Ответить | Цитировать Сообщить модератору
 Re: Execute AS  [new]
o-o
Guest
ЧитательX,
закавычить надо
execute as login='SuperUser'
20 авг 14, 13:15    [16467835]     Ответить | Цитировать Сообщить модератору
 Re: Execute AS  [new]
ЧитательX
Member

Откуда:
Сообщений: 284
Cannot execute as the server principal because the principal "SuperUser" does not exist, this type of principal cannot be impersonated, or you do not have permission.
20 авг 14, 13:19    [16467848]     Ответить | Цитировать Сообщить модератору
 Re: Execute AS  [new]
invm
Member

Откуда: Москва
Сообщений: 9724
ЧитательX,

use master;
create login SuperUser with password = '111111';
create login SimpleUser with password = '111111';
go

grant view server state to SuperUser;
go

create database TestSuperUser;
alter database TestSuperUser set trustworthy on;
go

use TestSuperUser;
go

create user SuperUser for login SuperUser;
create user SimpleUser for login SimpleUser;
go

grant impersonate on user::SuperUser to SimpleUser
go

execute as user = 'SimpleUser';
go

execute as user = 'SuperUser';
go

select * from sys.dm_exec_sessions;
go

revert;
go

revert;
go

use master;
alter database TestSuperUser set single_user with rollback immediate;
drop database TestSuperUser;
go

drop login SimpleUser;
drop login SuperUser;
go
А потом закомментируйте выделенное и попробуйте еще раз.

ЗЫ: А вообще такие вещи делают через подписанную процедуру или функцию.
20 авг 14, 13:23    [16467875]     Ответить | Цитировать Сообщить модератору
 Re: Execute AS  [new]
o-o
Guest
ЧитательX,

ну так или SuperUser существует всего лишь как юзер, а не как логин (о каких тогда админских правах речь?)
или у вас действительно нету прав его имперсонэйтить.
я спокойно выполняю под другими логинами что угодно:

К сообщению приложен файл. Размер - 33Kb
20 авг 14, 13:25    [16467892]     Ответить | Цитировать Сообщить модератору
 Re: Execute AS  [new]
ЧитательX
Member

Откуда:
Сообщений: 284
Спасибо. Щас поизучаю.
20 авг 14, 13:26    [16467901]     Ответить | Цитировать Сообщить модератору
 Re: Execute AS  [new]
o-o
Guest
invm
ЗЫ: А вообще такие вещи делают через подписанную процедуру или функцию.

ну т.е. в 3-ий раз: читайте про сертификаты

...а про trustworthy хорошо бы рассказать, как это невинно
20 авг 14, 13:27    [16467914]     Ответить | Цитировать Сообщить модератору
 Re: Execute AS  [new]
invm
Member

Откуда: Москва
Сообщений: 9724
o-o
...а про trustworthy хорошо бы рассказать, как это невинно
Ну в документации все написано. Зачем ее пересказывать?
20 авг 14, 13:32    [16467962]     Ответить | Цитировать Сообщить модератору
 Re: Execute AS  [new]
o-o
Guest
invm,
судя по кол-ву включающих TRUSTWORTHY ON,
"включателей" куда больше, чем читателей
20 авг 14, 13:51    [16468138]     Ответить | Цитировать Сообщить модератору
 Re: Execute AS  [new]
ЧитательX
Member

Откуда:
Сообщений: 284
Все разобрался. Все права вычистил. Еще раз аккуратно проделал на master:
grant IMPERSONATE on Login::[SuperUser] to [SimpleUser]

В сессии [SimpleUser] запрос:
execute as login='SuperUser'
select * from sys.dm_exec_sessions
select * from sys.dm_exec_connections
revert

отработал как нужно.
Спасибо всем за участие.
20 авг 14, 13:52    [16468153]     Ответить | Цитировать Сообщить модератору
 Re: Execute AS  [new]
invm
Member

Откуда: Москва
Сообщений: 9724
o-o
invm,
судя по кол-ву включающих TRUSTWORTHY ON,
"включателей" куда больше, чем читателей
Ну "хомячкам" гораздо удобнее и проще поставить костыль в виде trustworthy on, чем что-то там изучать и делать нормально. Такова их суть.
ТС вон тоже не читатель...
20 авг 14, 14:01    [16468241]     Ответить | Цитировать Сообщить модератору
 Re: Execute AS  [new]
o-o
Guest
ну хоть на TRUSTWORTHY не повелся, уже вперед.
не очень правда понятно, чем отличается от выдачи view server state в явном виде.

я все же оставлю дополнение к коду invm
для любителей все подряд включать

create login SuperAdmin with password = '111111';
create login Simple_db_owner with password = '111111';
exec sp_addsrvrolemember 'SuperAdmin', 'sysadmin';
go

use TestSuperUser;
go

create user Simple_db_owner for login Simple_db_owner;
go

exec sp_addrolemember 'db_owner', Simple_db_owner;

execute as login = 'Simple_db_owner'
create user SuperAdmin from login SuperAdmin

/* теперь хоть отсюда, хоть из соседней сессии, залогинившись под Simple_db_owner
и перейдя в TestSuperUser*/
execute as user = 'SuperAdmin'

drop database est -- левую базу дропнул, а сам всего овнер единственной базы, к-ая TRUSTWORTHY
---
Command(s) completed successfully.


собственно, можно и не мелочиться, а просто выполнить
exec sp_addsrvrolemember 'Simple_db_owner', 'sysadmin'

ну или себе подарить CONTROL SERVER, ну, чтоб не сильно в глаза бросалось, как явный sysadmin
20 авг 14, 14:08    [16468304]     Ответить | Цитировать Сообщить модератору
 Re: Execute AS  [new]
o-o
Guest
ЧитательX
grant IMPERSONATE on Login::[SuperUser] to [SimpleUser]


мы тут надеемся, что у SuperUser все же не админские права, а только view server state, правда ведь?
20 авг 14, 14:11    [16468324]     Ответить | Цитировать Сообщить модератору
 Re: Execute AS  [new]
ЧитательX
Member

Откуда:
Сообщений: 284
Ну можно и так сказать!
Спасибо. Разобрался.
20 авг 14, 14:25    [16468443]     Ответить | Цитировать Сообщить модератору
 Re: Execute AS  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
create database demo_signing;
go

use demo_signing;
go

create procedure show_sessions
as
begin
	set nocount on;

	select *
	from
		sys.dm_exec_sessions;
end
go

create certificate __my_session_viewer_cert
	encryption by password = 'P@ssw0rd'
	with
		subject = '...',
		expiry_date = '20141231';
go

create user __my_session_viewer_user from certificate __my_session_viewer_cert;
go

add signature to show_sessions by certificate __my_session_viewer_cert with password = 'P@ssw0rd';
go

backup certificate __my_session_viewer_cert to file = 'c:\temp\__my_session_viewer_cert.cert';
go

use [master];
go

create certificate __my_session_viewer_cert from file = 'c:\temp\__my_session_viewer_cert.cert';
go

create login __my_session_viewer_login from certificate __my_session_viewer_cert;
go

grant view server state to __my_session_viewer_login;
go


create login cat_matroskin_login with password = 'P@fg23tf23y3223f2';
go

use demo_signing;
go

create user cat_matroskin_user for login cat_matroskin_login;
go

grant execute on show_sessions to cat_matroskin_user;
go

-- Тестим

execute as login = 'cat_matroskin_login';

select suser_sname(), user_name(), *
from 
	sys.fn_my_permissions(NULL, 'SERVER');

exec demo_signing.dbo.show_sessions;
go
20 авг 14, 18:41    [16470369]     Ответить | Цитировать Сообщить модератору
 Re: Execute AS  [new]
o-o
Guest
churupaha,

К сообщению приложен файл. Размер - 181bytes
20 авг 14, 20:45    [16470800]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить