Security 13:SQL Server 默認的角色和用戶


SQL Server在服務器級別和數據庫級別都有默認的安全主體(Principal),用戶經常遇到的有sa 登錄,dbo 用戶,guest 用戶和public角色,public 角色分為服務器級別和數據庫級別。

一,sa 登錄

sa login 是服務器級別的特殊安全主體,登錄名是sa,是服務器級別的SQL LOGIN。默認情況下,在安裝SQL Server實例時,sa login就被創建了。從SQL Server 2005開始,sa login的默認數據庫是master,並且是sysadmin角色的成員,因此sa login擁有服務器的最高權限,並且權限不能被限制。雖然sa login不能被刪除,但是可以禁用。一旦sa被禁用,任何人都無法使用sa login來管理SQL Server實例。

二,數據庫級別的特殊用戶

在數據庫級別,SQL Server在每個數據庫中都預先創建了兩個特殊的用戶:dboguest,在每個數據庫中都有這兩個用戶(User):

  • dbodatabase owner的簡稱):是WINDOWS_USER,數據庫的所有者(Owner),每個數據庫都有一個dbo用戶,SQL Server把固定服務器角色 sysadmin 的成員、sa login和數據庫的owner都映射到數據庫用戶 dbo上。
  • guest:賓客,是SQL_USER,對於任何沒有映射到數據庫用戶的有效登陸(Login),SQL Server使用guest賬戶登陸數據庫。在登陸數據庫之前,需要分配權限給guest, 一般給guest查看(select)數據庫對象的權限,默認情況下,guest是沒有登錄數據庫的權限。

1,dbo 用戶

dbo是數據庫所有者(database owner)的簡寫,dbo用戶存在於每一個數據庫中,是數據庫中權限最大的user,sa login,sysadmin角色的所有成員和數據庫的Owner,都會以dbo身份登錄到數據庫 。

dbo用戶擁有數據庫的所有權限,權限不能被限制,不能被刪除,也不能被禁用。dbo 用戶並不完全等價於db_owner 角色,通常情況下,db_owner角色的成員就是數據庫的所有者(Database Owner)。

2,guest 用戶

每個數據庫都包含一個guest用戶,當一個login有權限登錄SQL Server實例后,如果沒有在數據庫中映射響應的user賬戶,那么該login使用guest用戶連接到數據庫,同時繼承guest用戶的權限,以guest的身份來訪問數據庫。

guest用戶默認存在每個數據庫中,默認情況下,guest用戶是禁用的,可以通過命令啟用guest用戶。

GRANT CONNECT TO GUEST

一旦啟用guest用戶,所有可以登陸到SQL Server的Login,都可以使用guest身份來訪問數據庫,並擁有guest用戶的權限,可以通過命令禁用guest用戶。guest用戶不會被刪除,但是可以通過回收 CONNECT 權限來禁用。

REVOKE CONNECT FROM GUEST;

注意:只能在 master 和 tempdb 以外的數據庫中執行禁用GUEST帳號的操作,這是因為許多用戶都需要以GUEST身份訪問master 和 tempdb系統數據庫,GUEST用戶在master 和 tempdb數據庫的權限被嚴格限制。

3,dbo和db_owner的區別

dbo是一個user,能夠對一個數據庫執行任何操作。sa login,sysadmin角色的所有成員和數據庫的Owner,都會以dbo身份登錄到數據庫 。由於dbo user是dbo schema的owner,因此dbo user創建的數據庫對象的owner都是dbo。

db_owner是一個角色,它的成員不是dbo。如果一個用戶是db_owner角色的成員,該角色具有操作數據庫的所有權限,甚至包括刪除數據庫。

三,public 角色

public是一個服務器級別的角色,同時也是一個數據庫級別的角色,注意,public角色的權限不是固定的,因此public 不屬於固定角色(fixed role),在 sys.server_permissions 和 sys.database_principals的 字段 is_fixed_role 是 0。

  • 對於服務器級別的public角色,每一個login 都屬於public 角色,當一個login沒有被授予特定的權限時,那么該login會繼承public的權限。
  • 對於數據庫級別的public角色,每一個user都屬於public 角色,當一個user沒有被授予特定的權限時,那么該user會繼承public的權限。

public角色特殊之處在於:角色的權限可以被修改。當一個login 或user沒有被授予特定安全對象上的權限時,該login或user會繼承public角色的權限。public 角色不能被刪除,但是可以對public角色的權限進行授予(Grant)、拒絕(Deny)和回收(Revoke)。

默認情況下,有一些權限會被授予到public角色上,比如, VIEW ANY DATABASE 用於查看SQL Server實例上的所有數據庫。

當對public角色進行權限管理時,一定要慎重,因為這會影響所有的login或user。通常情況下,不要把對public設置deny權限,這是由於deny語句的優先級最高,deny權限會覆蓋所有的grant權限。

 

每個 SQL Server 的登錄(Login)均屬於 public 服務器角色,所有的數據庫用戶(User) 都屬於public數據庫角色。用戶不能刪除public角色,但是,可以授予或收回public角色的權限。默認情況下,public角色被分配很多權限,大部分權限都跟數據庫中的日常操作有關。默認情況下,

  • 數據庫級別的public 角色擁有的權限:查看特定系統表
  • 服務器級別的public 角色擁有的權限:查看數據庫(VIEW ANY DATABASE),鏈接服務器(CONNECT)

當一個對象對所有用戶或登錄可用時,只需把權限分配給 public 角色即可。默認情況下,所有的數據庫用戶都屬於public角色,因此,授予或回收public角色的權限,將會影響所有的用戶。

 

 

 

參考文檔:

Principals (Database Engine)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM