2013年7月11日 星期四

Users and DatabaseRoles

資料庫層級的安全性原則,包含:

  • Database Users
  • fixed database roles
  • flexible database roles

Database Users

  • Database users represent the identity of a SQL Server login when connected to a database.
  • Each Database Users maps to a SQL Server login
  • 一個 Users 雖然對應到單一個 Logins ,但是沒有限制二者要用相同的名稱。若一個 Login 允許連線到不同資料庫,你也可以分別在不同的資料庫設定不同的 User 名稱。
  • You can assign database-level permissions directly to database users.
  • It is bestpractice to assign database-level permissions to database-level roles and then add database users to those roles

  • CREATE USER :將使用者加入目前資料庫中。
  • DROP USER :將使用者自目前資料庫中刪除。
  • ALTER USER :重新命名資料庫使用者或變更其預設結構描述。
  • sp_change_users_login :現有的資料庫使用者對應至 SQL Server 登入。 未來的 Microsoft SQL Server 版本將移除這項功能。請避免在新的開發工作中使用這項功能。 請改用 ALTER USER
use [mydb]
GO

--新增一個資料庫使用者(user1),對應到登入(login 1)
CREATE USER "user1" FOR LOGIN "login1";
GO

--修改資料庫使用者(user1),對應到登入(login 1)
ALTER USER "user1" WITH LOGIN "login1";
GO

Database Roles

Database Role 是屬於 Database-level 的物件,可用來方便權限的管理,只要設定好 Database Role 權限後再將使用者加入即可。

SQL Server 中有兩種資料庫層級角色類型:一是由資料庫預先定義的「固定資料庫角色」(Fixed Database Role) 以及您可以建立的「彈性資料庫角色」(Flexible Database Role)。

Fixed Database-Level Roles

固定資料庫角色義於資料庫層級,並存在每個資料庫中。下表顯示固定資料庫層級角色和其功能。

資料庫層級角色名稱說明
db_ownerdb_owner 成員可以在資料庫上執行所有的組態和維護活動,也可以卸除資料庫。
db_securityadmindb_securityadmin 成員可以修改角色成員資格及管理權限。 將主體加入這個角色可能會產生不必要的權限擴大。
db_accessadmindb_accessadmin 成員可以針對 Windows 登入、Windows 群組及 SQL Server 登入加入或移除資料庫的存取權。
db_backupoperatordb_backupoperator 成員可以備份資料庫。
db_ddladmindb_ddladmin 成員可在資料庫中執行任何「資料定義語言」(DDL) 的命令。
db_datawriterdb_datawriter 成員可以加入、刪除或變更所有使用者資料表中的資料。
db_datareaderdb_datareader 成員可以從所有使用者資料表讀取所有資料。
db_denydatawriterdb_denydatawriter 成員不能加入、修改或刪除資料庫中使用者資料表的任何資料。
db_denydatareaderdb_denydatareader 成員不能讀取資料庫中使用者資料表的任何資料。

將使用者加入固定資料庫角色

使用 sp_addrolemember 預存程式

USE [AdventureWorks2012];
GO
EXEC sp_addrolemember 'db_datawriter', "contoso\domain_user_b";
GO

Flexible Database-Level Roles

當「固定資料庫角色」不能滿足需求時,也可以自行定義「彈性資料庫角色」。 你可以使用 CREATE ROLE 指令建立彈性資料庫角色。

CREATE ROLE role_name [ AUTHORIZATION owner_name ]

AUTHORIZATION 子句用來指派這個角色的擁有者,若未指定任何使用者,該角色的擁有者為執行 CREATE ROLE 的使用者。

建立角色之後,再使用 GRANT 指令授與各種權限,或者使用 sp_addrolemember 預存程序將使用者加入該角色中。

--建立角色,並設定角色的owner
CREATE ROLE TableCreator AUTHORIZATION "vito";

--授與 CREATE TABLE 權限
GRANT CREATE TABLE TO TableCreator;

--加入使用者
EXEC sp_addrolemember 'TableCreator', "vito";

與使用者和角色相關的檢視(View)

以下幾個是與使用者或角色相關的系統檢視:

查詢 db role 的相關成員

SELECT 
	PrincipalType = P1.type_desc,
	DatabaseRole = P1.name,
	PrincipalName = P2.name
FROM sys.database_role_members M
	INNER JOIN sys.database_principals P1 ON M.member_principal_id = P1.principal_id
	INNER JOIN sys.database_principals P2 ON M.role_principal_id = P2.principal_id 

查詢使用者對資料庫的相關權限

select Prin.principal_id, Prin.name, Prin.type_desc,Prin.authentication_type_desc,
Perm.state_desc, Perm.permission_name
FROM sys.database_principals Prin
INNER JOIN sys.database_permissions AS Perm on Prin.principal_id = Perm.grantee_principal_id
WHERE Prin.name='vito'

查詢使用者對資料庫物件的相關權限

select Prin.principal_id, Prin.name, Prin.type_desc, Prin.authentication_type_desc,
Perm.state_desc, Perm.permission_name , s.name + '.' + o.name AS ObjectName
FROM sys.database_principals Prin
INNER JOIN sys.database_permissions AS Perm on Prin.principal_id = Perm.grantee_principal_id
INNER JOIN sys.objects AS o ON Perm.major_id = o.object_id
INNER JOIN sys.schemas AS s ON o.schema_id = s.schema_id
WHERE Prin.name=N'vito'

Application Roles

「應用程式角色」可以用於將權限指派給應用程式,也就是只允許特定應用程式來連接存取資料,而不是透過資料庫角色或使用者。

  • 「應用程式角色」屬資料庫層級物件。
  • 「應用程式角色」的權限同 guest 使用者,所以應用程式角色將無法存取任何已停用 guest 的資料庫。
  • 要啟用「應用程式角色」功能,可使用 sp_setapprole (需要有密碼)。

更多內容可參考:

Contained Users

Contained Users 是 Contained Database 中的使用者主體,更多內容可參考這篇

沒有留言:

張貼留言