2013-04-22 40 views
0

我們正在爲我們的系統構建一個管理應用程序,其中一個應用程序的功能是爲新用戶創建新數據庫。這個應用程序需要創建數據庫,RESTORE DATABASE,創建用戶,授予權限等 - 所以用戶需要有一些非常強大的權限。SQL Server:爲存儲過程中的有限用戶授予非常高的權限

我們正在將這些服務訂約給外部公司,我們不想讓他們無限制地訪問我們的系統,我們只希望他們能夠做我們允許他們做的事情。因此,我們考慮將整個過程封裝在存儲過程中,將EXECUTE授予特定的域用戶,並使用EXECUTE AS'SA'運行它。

不幸的是這是不可能的 - SA是不是一個數據庫用戶,當我們試圖將它定義爲一個,我們得到的錯誤

Msg 15405, Level 16, State 1, Line 1 
Cannot use the special principal 'sa'. 

然後,我們想過用DBO和建立跨數據庫所有權鏈接,但這一切都開始是一個嚴重的頭痛。 有誰知道一個優雅的方式來做到這一點?

回答

-2
create database admin; 
GO 

alter database admin set trustworthy on 
GO 

alter authorization on database::admin to [sa] 
GO 

use admin 
GO 

create procedure adminProc 
with execute as 'dbo' 
as 
create database test 
GO 

create login tmp with password = 'tmp', check_policy = off 
GO 

create user tmp 
GO 

grant execute on adminProc to tmp 
GO 

execute as login = 'tmp' 
GO 

-- This fails 
create database test 

-- This works 
exec adminProc 
GO 

revert 
GO 

drop database test 
GO 
+0

-1如果供應商有權在可信賴的數據庫中以dbo的身份執行,則供應商實際上是'sa'。 – 2013-04-22 10:55:31

+0

該過程不是由外部方創建的,而是由本地DBA創建的。外部方只有權執行您允許的程序。只要他沒有被授予權限,比如'create procedure'或者直接模仿,就沒有泄漏。 – muhmud 2013-04-22 11:08:57

2

要管理數據庫中的東西,可以使用EXECUTE AS OWNER並確保dbo擁有存儲過程。那裏沒有問題

但是,CREATE DATABASE等需要服務器級權限。注意:您不需要sysadmin權限。

使用SQL Server 2012,您可以使用server rolesGRANT CREATE DATABASE來管理此服務器角色。對於較早的版本,您可以直接將其授予登錄名。如果您願意,也可以使用dbcreator

如果你決定他們需要但管理登錄,securityadmin具有相同的有效權限sysadmin

4

這是module signing完全可能的。

  • 創建執行提升代碼的過程。
  • 添加EXECUTE AS CALLER的程序
  • 創建證書和私鑰
  • 註冊程序
  • 刪除私鑰
  • 導出證書
  • 導入在[master]
  • 證書創建登錄派生自證書
  • 授予證書派生登錄所需的特權

注意任何改動程序將使簽名無效,將需要重做的過程。丟棄私鑰非常重要,否則供應商可以簽署不同的過程並獲得對任意代碼的提升權限。一個例子見Signing an Activated Procedure