SQL Server Agent Proxy Account

SQL Server Agent Proxy Account

最近實務上接到了SQL Agent權限的需求,一般來說SQL的安全性考量及管理原則,應該只賦予使用者適合其需求的最小權限就好,不該為了方便性便直接將sysadmin權限給使用者,所以正好趁這機會把SQL Agent的Security給研究了一下…

 

 

使用者權限需求:(使用者SQL帳號為SQL_User)

  1. 能建立agent job
  2. 建立的agent job要能執行ssis package
  3. 能修改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了!

 

  1. 建立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