SQL Server EXECUTE AS ненадлежащее поведение
У меня есть пользователь, которому я предоставил доступ к учетным данным, используя:
GRANT ALTER ANY CREDENTIAL TO userA
Когда я вхожу в систему с этим пользователем, мне возвращаются следующие данные
SELECT * FROM sys.credentials
Я вижу, что у меня есть разрешение на уровне СЕРВЕРА. Это можно проверить, выполнив
SELECT * FROM fn_my_permissions (NULL, 'SERVER')
Используя другого пользователя, скажем, userB, я выдал себя за пользователя A, выполнив
GRANT IMPERSONATE ON USER::userA TO userB
В хранимой процедуре, когда я зарегистрирован как userB, я переключаю контекст на userA
EXECUTE AS user = 'userA'
SELECT user_name() AS ContextUserName
SELECT * FROM fn_my_permissions (NULL, 'SERVER')
SELECT * FROM sys.credentials
SELECT * FROM fn_my_permissions (NULL, 'SERVER')
не возвращает мне разрешение ALTER ANY CREDENTIAL.SELECT * FROM sys.credentials
не возвращает мне никаких значений.SELECT user_name()
однако возвращает мне userA.
Что я здесь пропустил? Почему я не могу вести себя как userA и получать данные из sys.credentials?
Спасибо!
2 ответа
Проблема, наверное, в том, что EXECUTE AS
только предоставляет UserB разрешения UserA для базы данных, которую вы выполняете, но не разрешения, предоставленные на сервере. Вот почемуSELECT user_name()
показывает UserA, но SELECT * FROM fn_my_permissions (NULL, 'SERVER')
не показывает разрешения UserA, но разрешения UserB.
Документы Microsoft:
EXECUTE AS (Transact-SQL)"Область олицетворения ограничена текущей базой данных. Переключение контекста на пользователя базы данных не наследует разрешения уровня сервера этого пользователя".
sys.fn_my_permissions"SELECT * FROM fn_my_permissions(NULL, 'SERVER');
возвращает список действующих разрешений вызывающего абонента на сервере".
Как сказал Матиас, я был Executing AS
ПОЛЬЗОВАТЕЛЬ, а не ВХОД. Мне пришлосьGRANT IMPERSONATE ON LOGIN::
чтобы это работало.