Sql-Server

從具有不同使用者權限的儲存過程執行 SSIS 包

  • March 28, 2017

由於需要不同級別的權限,我在允許我的使用者以合理的方式執行 SSIS 包時遇到問題。

場景:我們創建了一個數據倉庫,有兩個不同的 SSIS 包負責載入數據,一個是自動執行(通過 SQL 代理作業,並且工作正常),另一個必須在 -一旦上游數據最終確定和清理等,使用者的需求。

這個包執行非常特權的操作,包括在執行開始時備份數據庫(可以肯定,可以肯定),刪除和重新創建計算表等。

我編寫了一個儲存過程來通過

$$ SSISDB $$.$$ catalog $$.$$ create_execution $$和$$ SSISDB $$.$$ catalog $$.$$ start_execution $$儲存過程….在我的帳戶下執行時效果很好(我是系統管理員)。 儲存過程在由普通使用者執行時失敗,因為 SSISDB 和 MSDB 需要更高級別的權限才能將執行排入隊列,並且包本身失敗,因為它在其(低)安全上下文下執行。

我試過的

我試圖在儲存過程中使用“執行為”來解決問題,但是由於跨數據庫連結問題、可信賴標誌等而失敗。

我還嘗試通過讓代理作業執行包並僅從儲存過程執行代理作業來解決該問題,但是我很快進入了一個痛苦的世界,涉及:

  • 無法為每個作業設置執行權限
  • 希望通過中央伺服器角色配置此訪問權限,以適應隨時間變化的員工,並且工作只能有一個使用者作為所有者
  • 代理帳戶的黑暗世界,憑據與 sql-auth 登錄等相結合

計劃 C 和 D

我能想到的唯一選擇是創建一個具有提升權限的專用 SQL Server 登錄名,並相信使用者不會傳遞憑據/失去安排導入的人員的可審計性(如何在其他領域解決此問題組織),或自定義建構 Web 前端,純粹是為了允許使用者作為他們的“伺服器角色”帳戶進行身份驗證,然後讓 Web 應用程序在第二個(特權)連接下執行儲存過程。

所以….

有沒有關於如何:

  • 讓 SSIS 包執行特權操作
  • 由低權限使用者執行(使用 AD windows 帳戶)
  • 最好是通過中央伺服器角色管理執行作業的訪問權限(我無法輕鬆地為他們創建新的 Windows 組)
  • 並且任何新的中間/代理帳戶都是 SQL Server 身份驗證帳戶(同樣,對 AD 進行更改的能力非常有限)

我知道這裡有很多活動元件(有些感覺像旋轉的刀片),所以如果你覺得我錯過了任何其他資訊,請告訴我。

乾杯,蒂姆

編輯….

因此,今天我創建了一個具有 ssis_admin 權限的專用 SQL Server 登錄,創建了該使用者擁有的三個 SQL Server 代理作業,並更新了我的最終使用者呼叫execute as該使用者的儲存過程。由於無法create execution作為 SQL Server 登錄名呼叫而失敗,它需要一個 windows 帳戶。

我將使用者儲存過程更新為execute asWindows 帳戶 SQL Server 作為(AD 服務帳戶)執行,授予它ssis_admin,但它失敗並出現錯誤

目前的安全上下文無法恢復。請切換到呼叫“執行為”的原始數據庫並重試。

這不會很快:(

對於後代,我通過以下方式得到了這個工作:

  • 將使用者 ( ) 呼叫的儲存過程更改Admin.RunImport為“執行為”SQL 服務使用的帳戶
  • SQL Server 服務帳戶(AD 託管服務帳戶)被修改為具有執行 Admin sproc 的權限,允許使用execute as上述
  • SQL Server 服務帳戶已修改為具有 ssisdb.ssis_admin 和 msdb.SQlAgentOperator 角色。
  • 此儲存過程使用依賴於傳遞的參數

Admin.RunImport將 3 個代理作業之一排隊sp_start_job

  • 需要通過 SQL 代理進行此重定向才能繞過上面的 ssis 安全上下文錯誤
  • 代理作業歸“sa”所有,只需執行底層儲存過程 ( Raw.hp_Execute_Import_Impl),每個作業傳入不同的參數。
  • 這意味著代理作業sa由於上述 ssis_admin 權限而執行,與計劃作業相同
  • 儲存過程與正常一樣對Raw.hp_Execute_Import_ImplSSIS 包進行排隊。sa

代替能夠為此目的創建專用 Windows 帳戶,我認為這與我目前將要獲得的一樣好。

謝謝你們的幫助!

引用自:https://dba.stackexchange.com/questions/125962