Я пытаюсь выполнить msdb.dbo.sp_start_Job из MyDB.dbo.MyStoredProc, чтобы выполнить MyJob
1) Я знаю, что если я дам пользователю роль SqlAgentUser, он сможет запускать принадлежащие ему задания (НО ЭТО ЧТО Я НАБЛЮДАЛ: ПОЛЬЗОВАТЕЛЬ МОЖЕТ ЗАПУСТИТЬ / ОСТАНОВИТЬ / ПЕРЕЗАПУСТИТЬ SQL-АГЕНТ, ПОЭТОМУ Я НЕ ХОЧУ ПО ЭТОМУ МАРШРУТУ) - Сообщите мне, если я ошибаюсь, но я не понимаю, почему такой пользователь с ограниченными правами может запускать / останавливать агентов.
2) Я знаю, что если я дам разрешения на выполнение для запуска пользователя в msdb.dbo.Sp_Start_job и Включить цепочку владения или включить Trustworthy в пользовательской базе данных, это будет работать (НО Я НЕ ХОЧУ ВКЛЮЧАТЬ ЦЕПЬ СОБСТВЕННОСТИ ИЛИ ДОВЕРИТЬ НА БАЗЕ ДАННЫХ ПОЛЬЗОВАТЕЛЯ)
3) Это можно сделать с помощью подписи кода
База данных пользователей i) создать сохраненный файл proc MyDB.dbo.MyStoredProc ii) создать сертификат job_exec iii) подписать MyDB.dbo.MyStoredProc сертификатом job_exec iv) экспортировать сертификат
msdb i) Импортировать сертификат ii) создать производного пользователя из этого сертификата iii) предоставить аутентификацию для этого производного пользователя iv) предоставить выполнение на msdb.dbo.sp_start_job производному пользователю v) предоставить выполнение на msdb.dbo.sp_start_job пользователю, выполняющему MyDB.dbo.MyStoredProc
но я попробовал, и это не сработало для меня - я не знаю, какой кусок мне не хватает или я делаю неправильно
поэтому, пожалуйста, предоставьте мне простой пример (со сценариями) для выполнения msdb.dbo.sp_start_job из сохраненного пользователем prod MyDB.dbo.MyStoredProc с использованием подписи кода
Заранее большое спасибо
Спасибо Рам
1) Я думаю, что SSMS делает что-то, что можно считать «функцией». Что вы наблюдаете, так это то, что SSMS позволяет вам перезапустить агент SQL Server с вашими разрешениями Windows, независимо от того, какие разрешения у вас есть в SQL Server или какие разрешения вы вошли на сервер в обозревателе объектов, например. Я создал учетную запись sql только с ролью SqlAgentUser в msdb и смог перезапустить агент, хотя я запускал SSMS как локальный администратор.
Я попытался сделать то же самое еще раз, хотя я создал локальную учетную запись пользователя Windows и запустил SSMS, используя Запуск от имени ... в качестве этого локального пользователя без прав администратора. Я обнаружил, что не могу остановить агент, на самом деле SSMS вылетал, когда я пытался (о боже!), Но агент продолжал работать. ... Итак, мораль этой истории такова: убедитесь, что пользователи, которым вы хотите иметь возможность запускать только определенные задания, не являются локальными администраторами на вашем сервере SQL. Если да, то они могут уже перезапустите агент и SQL Server, если на то пошло! так что перестань нервничать !!
2) Вы можете сделать что-то вроде создания собственного sproc, который вызывает msdb.dbo.sp_start_job
@yourjobid и используйте EXECUTE AS или setuser внутри этого sproc. Затем ПРЕДОСТАВЛЯЙТЕ пользователю разрешение только на этот sproc.
3) Вы с ума сошли?!?!?!
Подпись кода - правильный способ сделать это. Единственное, чего я не вижу в вашем описании, это MyDB.dbo.MyStoredProc должен иметь предложение EXECUTE AS (даже если это EXECUTE AS CALLER), иначе подпись кода не вступит в силу.
Джонатан Кехайас опубликовал решение, которое кажется вам идеальным.
Взгляните на это, чтобы узнать, подходит ли это вам. http://www.sqlservercentral.com/articles/Security/68873/