1. 程式人生 > >SQL Server 安全篇——SQL Server 安全模型(3)——資料庫級別安全性

SQL Server 安全篇——SQL Server 安全模型(3)——資料庫級別安全性

在資料庫層面,以授權到安全主體來實現安全性。 相對於伺服器級別,資料庫級別稱為資料庫使用者和資料庫角色。

使用者:

通常情況下,資料庫使用者是從例項層面建立的登入名來實現。相同例項下,一個登入名可以對映到多個數據庫使用者中,並且可以單獨授權到資料庫層面。從SQL 2012開始,也可以建立沒有登入名的使用者(包含資料庫)

帶有登入名的使用者:

通過SSMS或者T-SQL來建立使用者,一般需要關聯到一個被配置好許可權的例項層面登入。常用的選項有:
  • DEFAULT_SCHEMA:使用者的預設架構,將在後續介紹。
  • ALLOW_ENCRYPTED_VALUE_MODIFICATIONS:允許在大容量複製(bulk copy)中使用資料加密。在後續章節介紹。
比如下面例子:在AdventureWorks2016CTP3中建立一個使用者Danni,關聯到使用者Danni登入,並且預設架構為Sales:
USE AdventureWorks2016CTP3 
GO 
CREATE USER Danni FOR LOGIN Danni  WITH DEFAULT_SCHEMA =  Sales  ; 
雖然沒有強制規定必須與登入名一模一樣,但是作為良好的管理來說應該保持一致,如果不指定預設架構,則預設為dbo。

不需要登入名的使用者:

建立不帶登入名的使用者時,使用者要麼對映到Windows安全主體,要麼使用SQL Server身份驗證, 如果使用身份驗證,前提條件是資料庫必須已經配置為包含資料庫,具體內容可見:
包含的資料庫
這種情況下可用選項有:
  • DEFAULT_SCHEMA/ALLOW_ENCRYPTED_VALUE_MODIFICATIONS:同上。
  • DEFAULT_LANGUAGE:使用者使用的預設語言。
  • SID:僅對SQL Server身份驗證有效,指定使用者關聯的SID,多個庫的同一個使用者使用相同的SID,特別適合在災難恢復和AlwaysON環境。
例子:建立一個叫做Phil使用者,使用者來自於Windows安全主體(域名\登入名:cartersecuresafe\phil),預設架構dbo。
USE AdventureWorks2016CTP3 
GO 
CREATE USER [cartersecuresafe\phil]  WITH DEFAULT_SCHEMA=dbo ; 


資料庫角色:

跟伺服器角色類似,資料庫也有內建角色,這些角色也具有預定好的一系列許可權。也稱為固定資料庫角色(fixed database roles)。固定資料庫角色跟伺服器角色一樣,只能增刪使用者,不能修改許可權。
固定資料庫角色
角色 描述
db_accessadmin 成員可在資料庫中增刪資料庫使用者。
db_backupoperator 預設為了備份所用,對第三方工具不可用,第三方工具一般需要sysadmin許可權。
db_datareader 成員可以執行select命令在所有的表,可以使用DENY來禁用某些表的SELECT,因為DENY總覆蓋GRANT。
db_datawriter 成員可以執行DML語句到庫的任何一個表。同理可以使用DENY來控制。
db_denydatareader 與db_datareader相反,拒絕對庫的所有select許可權。
db_denydatawriter 與db_datawriter相反。
db_ddladmin 可以執行DDL命令,相對少用。
db_owner 庫的所有者,擁有庫的所有許可權。
db_securityadmin 可以對使用者,針對安全物件進行GRANT 、DENY、REVOKE,也可以修改除db_onwer之外的所有成員。

除了固定資料庫角色之外,也可以在資料庫層面建立使用者自定義角色。比如下面案例,可以建立一個SalesRole角色,屬於dbo並只有Danni使用者,對Sales架構的表有增刪改查許可權:
USE AdventureWorks2016CTP3 
GO 
--建立角色
CREATE ROLE SalesRole AUTHORIZATION dbo ; 
GO 
--對角色授權
GRANT DELETE ON SCHEMA::Sales TO SalesRole ; 
GRANT INSERT ON SCHEMA::Sales TO SalesRole ; 
GRANT SELECT ON SCHEMA::Sales TO SalesRole ; 
GRANT UPDATE ON SCHEMA::Sales TO SalesRole ; 
--新增成員
ALTER ROLE SalesRole ADD MEMBER  Danni  ; 


小結:

SQL Server實際的安全層級相當複雜。基於角色的安全性可以簡化管理工作。另外充分合理地使用兩種授權:Windows身份驗證和SQL Server身份驗證。能夠更好地降低安全風險,另外建議優先使用Windows身份驗證。 SQL Server資料庫引擎通常使用登入來實現例項級別的身份驗證。一般登入名在資料庫層會有使用者對應,但是在包含資料庫中則不需要非要有登入名。 下一篇會介紹SQL Server審計。