SQL Server EXECUTE AS проблема

13

Я что-то упускаю при попытке использовать мою хранимую процедуру EXECUTE AS. Хранимая процедура считывает данные source_db, объединяет их и сохраняет результат target_db.

Сам SP находится в target_db. У меня есть специальный логин и сопоставьте его пользователей как source_dbи target_dbдля владельца зр ( в так что пользователь app_agentв source_dbи target_dbдля входа в систему app_agent).

Если я войду как app_agentи выполню

EXEC target_db.app_agent_schema.import_data

все отлично работает Но если я изменю

ALTER PROCEDURE app_agent_schema.import_data WITH EXECUTE AS OWNER` (or `AS SELF`) 

и попробуйте выполнить его, он бросает

Участник сервера "app_agent" не может получить доступ к базе данных "source_db" в текущем контексте безопасности.

Я использую SQL Server 2008.

Может ли кто-нибудь указать на мою ошибку?

Благодарность

Обновление После некоторых исследований я обнаружил, что это ALTER DATABASE target_db SET TRUSTWORTHY ONрешает проблему, но это не кажется мне правильным решением ...

a1ex07
источник
1
Я думаю, что ответом является использование опции цепочки владения базой данных между уровнями базы данных . Мне удалось воспроизвести ошибку в вашем сценарии, но недостаточно информации, чтобы узнать, точно ли я ее воспроизвел ... Опция CDOC у меня не сработала, но попробуйте и посмотрите, так ли это.
Джон Зигель

Ответы:

24

Это объясняется в разделе Расширение олицетворения базы данных с помощью EXECUTE AS . Контекст EXECUTE AS является доверенным только в текущей базе данных, и его распространение на другие базы данных является вектором повышения привилегий.

Есть два решения, оба описаны в статье, приведенной выше:

  • легкий один является пометка достоверной базы данных: ALTER DATABASE [source_db] SET TRUSTWORTHY ON;. Хотя легко, также опасно, как это делает dboиз source_dbде-факто sysadmin.

  • безопасным является использование подписи кода, см. Пример вызова процедуры в другой базе данных . Это более сложно, но на 100% безопаснее.

Ремус Русану
источник
0

Какой пользователь запускает команду ALTER PROCEDURE? Возможно, он установил уровень доступа владельца (сам) для этого пользователя, а не того, который вы намеревались.

Небо
источник
Тот же пользователь, который создал процедуру ( app_agent). Если у меня есть процедура, созданная app_agentбез execute as owner/self, войдите в систему app_agent, SP выполняется правильно. Если я добавлю EXECUTE AS SELF(опять же, тот же пользователь) и app_agent...is not able to access the database...
войду