SQL Server Agent Proxy Account
最近實務上接到了SQL Agent權限的需求,一般來說SQL的安全性考量及管理原則,應該只賦予使用者適合其需求的最小權限就好,不該為了方便性便直接將sysadmin權限給使用者,所以正好趁這機會把SQL Agent的Security給研究了一下…
使用者權限需求:(使用者SQL帳號為SQL_User)
- 能建立agent job
- 建立的agent job要能執行ssis package
- 能修改agent job的schedule
SQLAgentReaderRole 權限可以讓使用者建立agent job
USE[msdb]
GO
CREATEUSER[SQL_User] FORLOGIN[SQL_User]
GO
EXECsp_addrolememberN'SQLAgentUserRole',N'SQL_User'
GO
至於agent job執行ssis package的權限,只要將job owner指定為擁有sysadmin 的帳號就沒問題了! 只是job owner一改掉,SQL_User便無法修改job的schedule ….>”<
這時候就得靠SQL Agent proxy account了!
- 建立Credential (以windows帳號建立憑證)
USE[master]
GO
CREATECREDENTIAL[Credential_1]
WITHIDENTITY=N'ServerName\OS_User',-- windows帳號
SECRET=N'#######'
GO
2. 建立 SQL Server Agent Proxy
USE[msdb]
GO
EXECmsdb.dbo.sp_add_proxy@proxy_name=N'Proxy_1',
@credential_name=N'Credential_1',-- proxy的認證名稱
@enabled=1
GO
-- 授與proxy對subsystem的存取權
EXECmsdb.dbo.sp_grant_proxy_to_subsystem
@proxy_name=N'Proxy_1',
@subsystem_id=11 -- SSIS Package Execution 權限
GO
(subsystem代碼可參考http://msdn.microsoft.com/zh-tw/library/ms186760.aspx)
3. grant 權限給SQL_User去存取Proxy
USE[msdb]
GO
EXECsp_grant_login_to_proxy'SQL_User',@proxy_name ='Proxy_1'
GO
接下來只要使用者在建立Agent job時,將Job step的「Run as」指定成proxy account就ok囉。J