SQL Server Agent對象包括警報(Alert),操作員(Operator),Job,調度(Schedule)和代理(Proxy),SQL Server使用msdb系統數據庫管理Agent 對象的權限,msdb內置三個固定數據庫角色,按照權限從小到大的順序,依次是:SQLAgentUserRole、SQLAgentReaderRole 和SQLAgentOperatorRole。如果一個用戶不是這三個角色或sysadmin角色中的成員,那么該用戶通過SSMS的Object Explorer看不到Agent節點。一個用戶必須是SQLAgent的角色或sysadmin角色的成員,才能使用SQL Server Agent。
另外,Agent的權限,還跟代理(Proxy)的訪問權限有關,代理是用來執行Job Step的,只有建立代理和登陸(Login)之間的映射,用戶創建(Own)的Job才能執行。
一,Agent固定數據庫角色
SQLAgentUserRole 角色被授予操作Agent的最小權限的集合,其成員只能對其創建的本地Job和Job Schedule具有操作權限,也就是有,該角色的成員對於Owner是自己的Job具有權限,並且不能修改job的所有權(Ownership)。
SQLAgentUserRole 角色具有的權限:
- 具有操作本地Job和Job Schedule的所有權限,包括創建(Create)、刪除(Delete),修改(Modify),啟用(Enable)、禁用(Disable)、執行(Execute)、開始(Start)、停止(Stop)等,但是不能修改Job的所有權關系(Ownership);
- 查看Owned Jobs的執行日志,但是不具有刪除歷史日志的權限;
- 查看可用的Operator列表;
- 查看可用的Proxy列表;
SQLAgentReaderRole 角色,除了具有Multiserver jobs的查看權限之外,和SQLAgentUserRole角色的權限相同;
SQLAgentOperatorRole 角色,除了具有查看警告(Alert)的列表和屬性的權限之外,和SQLAgentReaderRole 角色的權限相同;
SQLAgentUserRole、SQLAgentReaderRole 和SQLAgentOperatorRole 都對自己創建的Job具有操作權限,都不能修改Job的所有權:
sysadmin 角色的成員,具有SQL Server Agent的全部權限,能夠修改Job的所有權。
二,執行Job Step的權限
在執行Job Step時,SQL Server Agent使用兩種類型的權限,分別是Job Owner和代理(Proxy)。如果創建的Job Step是 Transact-SQL script (T-SQL) 類型,那么使用Job Owner的權限去執行TSQL腳本;如果創建的Job Step是另外11種類型種的一種,那么使用代理的權限去執行Job Step。在Job Step執行之前,Agent模擬憑證指定的Windows User的權限,在該權限范圍(Security Context)內執行Job Step,使Job Step有權限訪問SQL Server 實例之外的資源。
代理(Proxy)使得Job Step在特定的安全上下文中執行,DBA需要創建代理,並為代理設置必須的權限。
SQL Server Agent lets the database administrator run each job step in a security context that has only the permissions required to perform that job step, which is determined by a SQL Server Agent proxy. To set the permissions for a particular job step, you create a proxy that has the required permissions and then assign that proxy to the job step. A proxy can be specified for more than one job step. For job steps that require the same permissions, you use the same proxy.
1,創建代理
每一個Proxy都關聯一個憑證(Credential),憑證定義了執行Job Step的安全上下文(Security Context)。使用SSMS創建代理,在SQL Server Agent目錄下打開新建代理賬戶(New Proxy Account)的向導,輸入新建的代理名稱和關聯的憑證名稱,從11個子系統(subsystem)列表中選擇“SQL Server Intergration Services Package”,該子系統用於執行SSIS的Package。
由於代理的權限是由憑證決定的,因此,在創建代理時,為了有效管控執行Job Step的權限,一般情況下,需要為代理(Proxy)創建專用的用戶賬戶,並未用戶授予必需的權限,
-
Create dedicated user accounts specifically for proxies, and only use these proxy user accounts for running job steps.
-
Only grant the necessary permissions to proxy user accounts. Grant only those permissions actually required to run the job steps that are assigned to a given proxy account.
2,授予Login訪問代理的權限
在SQL Server中,不是所有的login都有權限訪問Proxy。為Proxy添加服務器級別(Server-Level)的安全主體(Login),授予其訪問Proxy的權限,這樣,用戶就能夠引用Proxy去執行Job Step。
在Principals Tab中,授予Login,服務器角色(server role)或msdb數據庫角色訪問Proxy的權限。只有被授予訪問Proxy權限的Principal,才能在Job Step中使用Proxy。默認情況下,固定服務器角色 sysadmin的成員有權限訪問實例中的所有Proxy。
3,引用代理
如果Login有權限訪問Proxy,或者Login屬於有權限訪問Proxy的服務器角色(Server Role),那么用戶能夠在Job Step中使用Proxy,例如,在創建Job Step,從Run as 列表種選擇可訪問的Proxy:
三,安全組(Security Group)
在Windows 域環境中,如果把Job的Owner設置為Security Group(SG),該組的成員無法訪問該Job,只有把Job的Owner設置為用戶的Windows 賬戶時,用戶才能操作Job。
參考文檔:
Implement SQL Server Agent Security