2012年11月29日 星期四

[SQL2008R2]非sysadmin如何以最小權限執行舊版DTS?

        在SQL 2008之前的版本,像是SQL 2000,由於系統預設就把DTS 系統預存程序的「執行」權限授與 PUBLIC,所以只要有SQL登入帳號,就可以取得DTS封裝的清單;到了SQL 2005,用SSMS至管理/舊版/展開Data Transformation Services,會檢查是否有sysdtspackages的查詢權限,預設是沒有所以就看不到;SQL 2008更為了增加DTS封裝的安全性,已經撤銷 PUBLIC 對於 DTS 系統預存程序的「執行」權限呢!可參考保護儲存在 SQL Server 中的 DTS 封裝安全此篇的說明

        為了讓非sysadmin可以在SSMS 2008 R2中以最小權限開啟舊版DTS並執行,要沒有修改DTS權限,我研究了一下順便供有需要的人參考,執行如下指令,只先建一個登入帳號test

USE master
GO

CREATE LOGIN test
   WITH password = 'test',
   CHECK_POLICY = OFF
GO

USE msdb
GO
CREATE USER test
GO

        1.執行下列指令就能讓test帳號有權取得DTS封裝的清單,但無法限制只能查詢自己的DTS封裝

GRANT SELECT ON sysdtspackages TO test
GO

        若沒給訂權限將會遭遇如下錯誤喔

結構描述'dbo',資料庫'msdb',物件'sysdtspackages' 沒有SELECT 權限。(Microsoft SQL Server, 錯誤: 229)



        2.執行下列指令就可以讓test有權打開DTS封裝執行,很簡單

GRANT EXEC ON sp_enum_dtspackages TO test
GRANT EXEC ON sp_get_dtspackage TO test
GO

        若沒給訂上列兩個DTS的系統預存程序可能會遇到如下兩個錯誤喔

結構描述'dbo',資料庫'msdb',物件'sp_enum_dtspackages' 沒有EXECUTE 權限。



        因為沒有多給其他DTS的系統預存程序的權限,若嘗試將封裝編輯後儲存將會遇到如下錯誤,這樣就達到我們無法修改或新增的需求囉


        千萬不要指派像是db_ssisoperator角色之類的,因為預設權限太大了,如下圖


        其實我還希望讓test帳號只能列出自己擁有的封裝,不能列出其他人的封裝,因為這樣才算最小權限,但研究了半天好像做不到,後來我實際上是把這類需要給非sysadmin手動執行的封裝移到測試機去,給定上述的權限,反正他們也不能新增修改封裝內容,也只能看到部分的封裝,也算是一種折衷的作法吧,不知還有沒有其他辦法呢?

0 意見:

張貼留言