SQL Server代理(10/12):使用代理賬號運行作業


SQL Server代理是所有實時數據庫的核心。代理有很多不明顯的用法,因此系統的知識,對於開發人員還是DBA都是有用的。這系列文章會通俗介紹它的很多用法。


在這一系列的上一篇,你查看了msdb庫下用於授權訪問SQL Server代理的安全角色。這些角色包括SQLAgentUserRole、SQLAgentReaderRole和 SQLAgentOperatorRole。每個角色授予用戶一定的權限來使用SQL Server代理,而不必是sysadmin服務器角色的成員。為完全管理控制SQL Server代理,你仍然需要sysadmin角色的成員。此外,你回顧了SQL Server代理服務帳戶的安全影響和選擇。在這一篇,你將學習SQL Server代理的代理帳戶的概念。代理帳戶允許作業步驟來模擬一個特定的Windows安全帳戶為作業步驟執行操作。這通常是在作業所有者的安全憑據不 適用執行操作時應用。

代理帳戶是什么

正如上面提到的,一個代理帳戶是一組存儲在Windows的安全憑據。這些憑據可以作為作業的安全上下文。代理帳戶可由一個或多個符合條件的子系統使用。

可用代理帳戶的子系統

並不是所有的子系統都可以使用代理帳戶。可以使用代理帳戶的子系統包括:

  • ActiveX 腳本
  • 操作系統(CmdExec)
  • 復制系列任務
  • SQL Server Analysis Services 命令(XML/A)
  • SQL Server Analysis Services 查詢(MDX)
  • SQL Server Integration Services 包
  • PowerShell

上面沒有Transact-SQL腳本(T-SQL)子系統。T-SQL作業步驟通常運行於作業所有者的安全上下文,而且SSMS中不能改變。你可以手動配 置作業步驟,使用sp_add_jobstep系統存儲過程,通過database_user_name參數來模擬一個數據庫用戶,當然你需要安全權限來 模擬數據庫用戶這樣做。

你也會注意到復制子系統組合為一體,即使有幾個不同的子系統處理復制。理論上你可以使用代理帳戶,但那超出這系列范圍的高級配置。
當 你創建一個作業步驟,如圖1所示(打開作業選擇步驟頁面,然后點擊新建…按鈕,選擇一個支持代理帳戶的子系統如PowerShell。你會看到一個 可以模擬支持作業步驟的賬戶列表。如果你沒有創建任何代理帳戶憑據,列表看起來應該插圖1所示,僅有SQL Server代理安全帳戶。


插圖1:為作業步驟選擇代理帳戶

代理帳戶的安全考慮

為了一個代理帳戶的正確運行,該帳戶必須具有“作為批處理作業登錄”(seBatchLogonRight)權限,通過Windows管理員分配給它(在本 地安全策略->本地策略->用戶權限分配)。沒有特權的SQL Server代理服務將無法模擬帳戶來運行作業步驟。還需要注意的是,代理賬戶不是自動能訪問你的SQL Server。例如,你想使用一個CmdExec或PowerShell的作業步驟重新登錄到SQL Server,代理帳戶必須被顯式授予登錄回你的SQL Server(或者繼承訪問Windows組)。

創建代理帳戶

你可以使用Transact-SQL或SSMS創建一個代理帳戶。使用Transact-SQL,使用系統存儲過程sp_add_proxy

1 EXEC sp_add_proxy
2     [ @proxy_name = ] 'proxy_name' ,
3     [ @enabled = ] is_enabled ,
4     [ @description = ] 'description' ,
5         [ @credential_name = ] 'credential_name' ,
6     [ @credential_id = ] credential_id ,
7     [ @proxy_id = ] id OUTPUT

保留proxy_name空白,保證代理與憑據相同的名字。憑據名稱應該來自安全憑據(使用CREATE CREDENTIAL數據庫定義語句創建)。
例如,創建一個[Proxy1]代理帳戶,密碼“Password1”(即一個帳戶在你的本地SQL Server機器創建),你可以運行代碼1,替換成你的環境中有效的域、身份和密碼。

1 USE MSDB;
2 GO
3 CREATE CREDENTIAL [PC201602202041\ProxyDemo] with IDENTITY = 'PC201602202041\ProxyDemo'
4 , SECRET = 'Password1';
5 
6 Declare @rc int=0;
7 
8 EXEC sp_add_proxy [PC201602202041\ProxyDemo],1,'This is an example proxy account',
9 [PC201602202041\ProxyDemo], NULL,@rc;

代碼1: 創建憑據和代理帳戶
值得注意的是,目前你已經創建一個代理帳戶,但它不與任何特定的子系統關聯。如果你展開代理->未分配的代理,你會看到剛剛創建的代理帳戶,如插圖2所示。


插圖2: SSMS下未分配的代理帳戶
請注意,這里使用SSMS創建更容易,但仍然有兩步過程。你必須先創建一個憑據(安全性->憑據,新建憑據,打開新建憑據對話框)。在這個例子中,使用Cred1作為帳號,用相同的密碼,如插圖3所示。


插圖3: SSMS下創建憑據
單擊“確定”,然后導航到代理文件夾,並右鍵單擊任何代理子系統(或代理文件夾本身),新建代理。彈出新建代理帳戶,鍵入Proxy1名稱,選擇相匹配的憑 據,輸入一個描述,如果需要選擇一個作業子系統(如插圖4所示)。如果沒有選擇子系統,代理帳戶將出現在未分配的代理下(類似用語句創建的代理)。


插圖4:SSMS下創建代理帳戶
最后一步是將代理帳戶和子系統關聯,它是通過系統存儲過程sp_grant_proxy_to_subsystem實現的。在前面的例子,為了將代理帳戶[Proxy1]分配給PowerShell子系統,你可以運行下面代碼:

EXEC sp_grant_proxy_to_subsystem @proxy_name=N'Proxy1', @subsystem_id=12

子系統的subsystem_id可以在MSDN文檔查到https://msdn.microsoft.com/zh-cn/library/ms186760.aspx

授權代理憑據

你可能已經注意到,在新建代理帳戶對話框有一個主體頁簽。默認情況下,sysadmin服務器角色的成員有代理資格,但這不適用於其他人。如果你想有一個非 管理員用戶訪問代理憑據(這是很有可能的,否則為什么要創造它們),那么你需要授予明確的訪問給每一個你想使用代理的登錄。
你可以使用系統存儲過 程sp_grant_login_to_proxy 來實現,或者SSMS。打開PowerShell代理文件夾下的Proxy1代理帳戶,轉到主體頁簽。點擊添加(如圖10.5),你就可以關聯一個或多個 安全主體(登錄)和你的代理帳戶。一旦這樣操作后,任何主體擁有的作業可以使用這個代理帳戶。注意還有第三個頁簽,引用,這里會顯示出哪個作業步驟使用了 這個代理帳戶,你可以直接修改或刪除代理。

圖10.5 關聯代理帳戶和安全主體(SQL登錄)

使用代理帳戶

現在就可以修改作業步驟來使用代理帳戶。如果你是遵循本系列的文章,你應該有一個叫做ShellOut的作業,它的第二步s2是PowerShell子系 統。打開這個作業步驟,更改運行身份為Proxy1(如圖10.6所示)。如果你沒有這個作業步驟,你應該創建一個這樣的步驟。

插圖6:使用代理帳戶更新作業步驟
現在再次運行作業,這樣就是使用代理帳戶而不是SQL Server服務帳戶來執行作業步驟的。記住你的代理帳戶必須能登錄到你的數據庫實例,因此確保你已經為代理帳戶創建了一個數據庫登錄名。

修改和刪除代理

使用SSMS來修改或刪除代理是直觀的(打開代理帳戶對話框更改),但為了完整對應的Transact-SQL語句是:

exec msdb.dbo.sp_delete_proxy @proxy_name = 'proxy1'

下篇預告

SQL Server代理的代理帳戶允許非sysadmin用戶模擬其他Windows安全憑據有特權執行關鍵任務的能力。當結合子系統如CmdExec和PowerShell,他們允許比sysadmin低特權級被授予SQL代理作業的所有者。
在我們的下一篇,我們將看看維護計划作業,以及他們與你自己創建的作業的區別。

原文地址:http://www.sqlservercentral.com/articles/Stairway+Series/72461/

參考文章:http://www.cnblogs.com/Uest/p/4562219.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM