SQL Server ВИКОНАТИ ЯК БУДЬ


13

Я щось пропускаю, намагаючись використовувати свою збережену процедуру EXECUTE AS. Збережена процедура зчитує дані source_db, агрегує їх і зберігає в результаті target_db.

Сам сп є в 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вирішує проблему, але це не здається правильним рішенням для мене ...


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...
a1ex07
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.