SQL Server代理是所有實時資料庫的核心。代理有很多不明顯的用法,因此系統的知識,對於開發人員還是DBA都是有用的。這系列文章會通俗介紹它的很多用法。 在這一系列的上一篇,你查看了msdb庫下用於授權訪問SQL Server代理的安全形色。這些角色包括SQLAgentUserRole、SQLA
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