本篇文章是SQL Server代理系列的第十篇,詳細內容請參考原文
在這一系列的上一篇,你查看了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參數來模擬一個數據庫用戶,當然你需要安全權限來模擬數據庫用戶這樣做。
你也會注意到復制子系統組合為一體,即使有幾個不同的子系統處理復制。理論上你可以使用代理帳戶,但那超出這系列范圍的高級配置。
當你創建一個作業步驟,如圖10.1所示(打開作業選擇步驟頁面,然后點擊新建…按鈕,選擇一個支持代理帳戶的子系統如PowerShell。你會看到一個可以模擬支持作業步驟的賬戶列表。如果你沒有創建任何代理帳戶憑據,列表看起來應該如圖10.1所示,僅有SQL Server代理安全帳戶。
圖10.1 為作業步驟選擇代理帳戶
代理帳戶的安全考慮
為了一個代理帳戶的正確運行,該帳戶必須具有“作為批處理作業登錄”(seBatchLogonRight)權限,通過Windows管理員分配給它(在本地安全策略->本地策略->用戶權限分配)。沒有特權的SQL Server代理服務將無法模擬帳戶來運行作業步驟。還需要注意的是,代理賬戶不是自動能訪問你的SQL Server。例如,你想使用一個CmdExec或PowerShell的作業步驟重新登錄到SQL Server,代理帳戶必須被顯式授予登錄回你的SQL Server(或者繼承訪問Windows組)。
創建代理帳戶
你可以使用Transact-SQL或SSMS創建一個代理帳戶。使用Transact-SQL,使用系統存儲過程sp_add_proxy。
EXEC sp_add_proxy [ @proxy_name = ] 'proxy_name' , [ @enabled = ] is_enabled , [ @description = ] 'description' , [ @credential_name = ] 'credential_name' , [ @credential_id = ] credential_id , [ @proxy_id = ] id OUTPUT
保留proxy_name空白,保證代理與憑據相同的名字。憑據名稱應該來自安全憑據(使用CREATE CREDENTIAL數據庫定義語句創建)。
例如,創建一個[Proxy1]代理帳戶,密碼“Password1”(即一個帳戶在你的本地SQL Server機器創建),你可以運行代碼10.1,替換成你的環境中有效的域、身份和密碼。
USE MSDB; GO CREATE CREDENTIAL [Cred1] WITH IDENTITY = N'USER-67NP5R8LGK\ClearFile', SECRET = N'123456' Declare @rc int=0; EXEC sp_add_proxy [Proxy1],1,'This is an example proxy account',[Cred1], NULL,@rc;
代碼10.1 創建憑據和代理帳戶
值得注意的是,目前你已經創建一個代理帳戶,但它不與任何特定的子系統關聯。如果你展開代理->未分配的代理,你會看到剛剛創建的代理帳戶,如圖10.2所示。
圖10.2 SSMS下未分配的代理帳戶
請注意,這里使用SSMS創建更容易,但仍然有兩步過程。你必須先創建一個憑據(安全性->憑據,新建憑據,打開新建憑據對話框)。在這個例子中,使用Cred1作為帳號,用相同的密碼,如圖10.3所示。
圖10.3 SSMS下創建憑據
單擊“確定”,然后導航到代理文件夾,並右鍵單擊任何代理子系統(或代理文件夾本身),新建代理。彈出新建代理帳戶,鍵入Proxy1名稱,選擇相匹配的憑據,輸入一個描述,如果需要選擇一個作業子系統(如圖10.4所示)。如果沒有選擇子系統,代理帳戶將出現在未分配的代理下(類似用語句創建的代理)。
圖10.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文檔查到http://msdn.microsoft.com/en-us/library/ms186760.aspx
授權代理憑據
你可能已經注意到,在新建代理帳戶對話框有一個主體頁簽。默認情況下,sysadmin服務器角色的成員有代理資格,但這不適用於其他人。如果你想有一個非管理員用戶訪問代理憑據(這是很有可能的,否則為什么要創造它們),那么你需要授予明確的訪問給每一個你想使用代理的登錄。
你可以使用系統存儲過程sp_grant_login_to_proxy 來實現,或者SSMS。打開PowerShell代理文件夾下的Proxy1代理帳戶,轉到主體頁簽。點擊添加(如圖10.5),你就可以關聯一個或多個安全主體(登錄)和你的代理帳戶。一旦這樣操作后,任何主體擁有的作業可以使用這個代理帳戶。注意還有第三個頁簽,引用,這里會顯示出哪個作業步驟使用了這個代理帳戶,你可以直接修改或刪除代理。
圖10.5 關聯代理帳戶和安全主體(SQL登錄)
使用代理帳戶
現在就可以修改作業步驟來使用代理帳戶。如果你是遵循本系列的文章,你應該有一個叫做ShellOut的作業,它的第二步s2是PowerShell子系統。打開這個作業步驟,更改運行身份為Proxy1(如圖10.6所示)。如果你沒有這個作業步驟,你應該創建一個這樣的步驟。
圖10.6 使用代理帳戶更新作業步驟
現在再次運行作業,這樣就是使用代理帳戶而不是SQL Server服務帳戶來執行作業步驟的。記住你的代理帳戶必須能登錄到你的數據庫實例,因此確保你已經為代理帳戶創建了一個數據庫登錄名。
修改和刪除代理
使用SSMS來修改或刪除代理是直觀的(打開代理帳戶對話框更改),但為了完整對應的Transact-SQL語句是:
exec msdb.dbo.sp_delete_proxy @proxy_name = 'proxy1'
憑據的理解可參考:在SQL Server Agent中應用憑據
下一篇
SQL Server代理的代理帳戶允許非sysadmin用戶模擬其他Windows安全憑據有特權執行關鍵任務的能力。當結合子系統如CmdExec和PowerShell,他們允許比sysadmin低特權級被授予SQL代理作業的所有者。
在我們的下一篇,我們將看看維護計划作業,以及他們與你自己創建的作業的區別。