Почему база данных MSDB ДОВЕРЕНА?

9

Параметр TRUSTWORTHYможет быть довольно опасным, если вы не будете осторожны, и, за исключением определенных обстоятельств, рекомендуется держать его выключенным. Однако по умолчанию MSDBбаза данных TRUSTWORHTYустановлена ONпо умолчанию. Мне интересно, почему?

Я прочитал эту запись в BOL

Примечание. По умолчанию для параметра TRUSTWORTHY установлено значение ON для базы данных MSDB. Изменение этого параметра по умолчанию может привести к непредвиденному поведению компонентов SQL Server, которые используют базу данных MSDB.

Но меня интересует конкретика. Почему конкретно MSDBнужно TRUSTWORTHYвключить? Какие функции это используют?

Кеннет Фишер
источник
2
Просто подумайте, почему бы не изучить WHY, чтобы служба агента SQL могла взаимодействовать со всеми БД в экземпляре, использовать почту БД для уведомлений, другие внешние ресурсы; пути, объекты AD и т. д. в заданиях агента SQL.
Сок Pimp IT
1
@JUICED_IT также историю заданий агента SQL, историю монитора доставки журналов, пакеты служб SSIS, данные помощника по настройке ядра СУБД, данные очереди компонента Service Broker и информацию о резервном копировании. Это много вещей, от которых вы хотите стандартного поведения. sqlperformance.com/2015/07/sql-maintenance/msdb
ConstantineK
Я подозреваю, что это требуется для всего, что использует вызовы между базами данных. Вы должны TRUSTWORTHYвыключить, msdbчтобы увидеть, что перестает работать, и у вас будет хотя бы часть ответа :). Я подумал, что у BACKUP будут проблемы, но я просто попытался, и это удалось.
Соломон Руцки

Ответы:

3

Есть десятки объектов в msdbэтом обращении к masterбазе данных.

Если бы msdb не были помечены как TRUSTWORTHY, пользователям потребовалось бы разрешение как на msdbобъект, с которым они взаимодействуют, так и на masterобъект, на который ссылается.

Например, пользователям msdb, которые получают разрешения через роль базы данных SQLAgentUserRole, разрешается выполнение msdb.dbo.sp_enum_sqlagent_subsystems. Стек вызовов для этой процедуры в конечном итоге достигает master:

* msdb.dbo.sp_enum_sqlagent_subsystems
    * msdb.dbo.sp_enum_sqlagent_subsystems_internal
        * master.dbo.xp_instance_regread

Если msdbне помечено как TRUSTWORTHY, то пользователям, которые являются частью роли базы данных SQLAgentUserRole, ТАКЖЕ потребуется разрешение на выполнение master.dbo.xp_instance_regread.

Технически говоря, возможно, возможно удалить TRUSTWORTHYпараметр в msdbи вместо этого предоставить определенные разрешения в master. Однако эти необходимые разрешения не документированы и не поддерживаются.

AMtwo
источник
Вы, вероятно, правы, но если это так, то не менее важно, чтобы владелец MSDB имел эти разрешения.
Кеннет Фишер
@KennethFisher Возможно? Я обычно не связываюсь с владельцем базы данных для msdb, поэтому я не уверен. Я всегда просто оставлял это как sa. Я законно не думал об этом.
2
Ах, но если у меня есть необходимые разрешения в MSDB, я могу использовать этот доступ в сочетании с TRUSTWORTHY, чтобы захватить ваш сервер :)
Кеннет Фишер,
Правда. Но именно поэтому доступ к системным БД должен быть тщательно ограничен. Если вы не администратор, вам не нужно заходить в системную базу данных.
AMTwo