2009-04-23 215 views
1

有沒有一種方法可以讓開發人員授予用戶對對象的權限而不給他們創建用戶或功能的權限?如何授權開發人員授予用戶權限?

我試圖限制開發者的權限,我最近發現,開發商不得不在開發和生產線的環境db_owner權限!所以我正盡我所能阻止這種瘋狂。

關於此事的任何好文章?

+0

投票結束對serverfault爲所屬。 com – 2009-04-23 14:03:38

回答

2

至於說,如果有人能伸手的權限,他們可以把手伸到權限本身(或一個虛擬賬戶)。我不確定在SQL Server中是否有技巧提供「少於我的用戶權限」。

我會做的方式是使用存儲過程。

創建一個存儲過程,給予指定用戶一個特定權限或權限集合(這些權限是允許常規用戶擁有的權限)。然後讓開發人員執行對此存儲過程的訪問。實際上,您使用存儲過程來創建GRANT的受限版本,同時將完整的GRANT命令保留給自己。

+0

不錯,我沒有想到這個選擇。謝謝,我會試試看。 – 2009-04-23 14:09:31

1

如果有人可以給別人的權限,他也可以給自己做他想做的權限。那麼這有什麼好處呢?可能我不瞭解你的情況。

+0

這不正確。 WITH GRANT幫助在sql server中執行類似的操作。這就是爲什麼我問,我希望有一種方法來實現我想要的。 – 2009-04-23 14:03:26

3

你可以讓他們的「db_securityadmin」數據庫角色

+0

我曾想過這樣做,但db_securityadmin有一些權限,我希望它們不要有。 – 2009-04-23 14:02:17

0

成員正如斯特凡說,給他們授予權限將有效地給他們的所有權限,因爲如果他們想要做的所有的東西,他們需要做的是自己授予執行它的權限。

而不是考慮開發者的敵人,不過,你可能要考慮給開發商這是我們用來管理數據庫中的第二個用戶帳戶。至少在開發賬戶上,不給開發人員任何生產權限是很常見的。

1

對象的所有者可以授予這些對象的權限。如果您的開發人員不需要授予CREATE TABLE權限之類的東西,那麼您可能可以向他們授予您希望他們授予權限的對象的所有權。

0

像存儲過程的對象設置權限可與「GRANT完成上執行到;

但是,您可能還需要在登錄名和用戶級別授予安全權限您將要確定並只需授予需要訪問的對象(例如執行)所需的權限考慮使用「EXECUTE AS」功能,該功能可讓其他用戶模擬驗證執行代碼所需的權限,而不必授予所有必要權限權利的所有物件(例如表)的該EXECUTE AS可以被添加到存儲的特效,函數,觸發器等

添加到t他在存儲過程中的代碼如下:CREATE PROCEDURE dbo.MyProcedure WITH EXECUTE OWOW

在這種情況下,您正在模擬被調用模塊的所有者。您也可以模擬SELF,或者用戶創建或更改模塊OR ... imperlator CALLER,這將使模塊能夠接受當前用戶的權限,或者...模擬OWNER,它將獲得程序的所有者被稱爲OR ...impersonate'user_name',它將模擬特定用戶OR ...模擬'login_name'將會模擬特定的登錄名。

大多數情況下,您只需要授予存儲過程的EXECUTE權限,然後將權限授予存儲過程中引用的所有對象。

這樣,您不需要給予隱式權限(例如:更新數據或調用其他過程)。所有權鏈接爲您處理。這對動態sql特別有用,或者您需要創建提升的安全任務,例如CREATE TABLE。 EXECUTE AS是一個便於使用的工具。

該示例可以幫助闡明這一切:

創建一個名爲NoPrivUser公共訪問數據庫用戶(例如dbadb)

USE [主] GO CREATE LOGIN [NoPrivUser] WITH PASSWORD = N 'ABC5%',DEFAULT_DATABASE = [dbadb],CHECK_EXPIRATION = ON,CHECK_POLICY = ON GO USE [dBAdb] GO CREATE USER [NoPrivUser] FOR LOGIN [NoPrivUser] GO

注:Creator或OWNER此過程將需要CREATE目標數據庫中的TABLE RIGHTS。 (N'U')AND type in(N'U')AND type in(N'U')AND type in(N'U') )CREATE TABLE MyTable的(PKID INT,COLUMN1 CHAR(10))INSERT INTO MyTable的值(1, 'ABCDEF')

GO

GRANT EXEC ON dbo.MyProcedure TO NoPrivUser; GO

- 現在以NoPrivUser身份登錄數據庫服務器並運行以下命令。

使用dbadb去

EXEC dbo.MyProcedure

(1影響行(S))

現在嘗試從新表,同時登錄作爲NoPrivuser選擇。

您將獲得以下:

SELECT * FROM MyTable的去

消息229,級別14,狀態5,1的SELECT權限被拒絕對象 'MyTable的' 數據庫 'DBAdb' 上線,架構'dbo'。

由於您僅以NoPrivUser身份登錄時纔在所有者的安全上下文中運行此過程,因此期望這樣做。 NoPrivUser沒有實際讀取表的權限。只需執行創建並插入行的過程即可。

使用EXECUTE AS子句,存儲過程在對象所有者的上下文中運行。此代碼成功創建dbo.MyTable併成功插入行。在此示例中,用戶「NoPrivUser」絕對沒有被授予修改該表的權限,或者讀取或修改此表中的任何數據。 它只需要完成在此過程的上下文中編碼的特定任務所需的權限。

這種創建存儲過程的方法可以執行需要提升安全權限的任務,而不需要永久分配這些權限,這將非常有用。

0

我發現db_owner角色最危險的方面是,如果您對某個權限發出拒絕,那麼該角色的成員可以將其授予自己。我剛開始讀這件事,我測試這個

Create role db_ControlDatabase 

grant control to db_ControlDatabase 

deny backup database to db_ControleDatabase 

alter role db_ControlDatabase add member TestUser 

到目前爲止,我已經找到了主題TestUser有而不能添加或刪除固定數據庫角色的成員權限。您應該能夠拒絕任何你需要在這一點上,如備份證書,備份主鍵等

Here是可以拒絕或授予的權限列表: