描述安全性主體
安全性主體是可要求 SQL Server 資源的實體,而且您 (通常) 可以授與權限。 SQL Server 中有幾組安全性主體。 安全性主體存在於伺服器層級或資料庫層級,而且可以是個體或集合。 有些組具有由 SQL Server 系統管理員所控制的成員資格,有些則具有固定的成員資格。
注意
Azure SQL Database 上的系統管理員可以新增新的登入,但無法建立新的伺服器角色。
架構和安全性實體
在查看安全性主體的詳細資料之前,我們必須先瞭解安全性實體和架構的概念。 SQL Server 和 Azure SQL Database 具有三個安全性實體的範圍。 安全性實體是資料庫內的資源,由授權系統會管理其存取權。 例如,資料表是安全性實體。 為了簡化存取控制,SQL Server 包含巢狀階層 (稱為範圍) 內的安全性實體。 這三個範圍是伺服器、資料庫和架構。 架構是資料庫內的物件集合,可讓物件分組為個別的命名空間。
每位使用者都有預設的架構。 如果使用者嘗試在未指定架構名稱的情況下存取物件,例如:SELECT name FROM customers,則會假設該物件是在使用者的預設架構中。 如果預設架構中沒有這類物件,SQL Server 會檢查物件是否位於預先定義的 dbo 架構中。 如果使用者的預設架構或 dbo 架構中沒有指定名稱的物件,則使用者會收到錯誤訊息。 最佳作法是存取物件時指定架構名稱,因此上一個選取項目會類似: SELECT name FROM SalesSchema.customers。 如果使用者尚未獲得預設架構,則其預設架構會設定為 dbo。
根據預設,如果使用者建立物件時未指定任何架構,SQL Server 會嘗試在使用者的預設架構中建立它。 如果使用者未獲授與在預設架構中建立物件的權限,則該物件將無法建立。
登入和使用者
無論使用何種驗證模式,用來存取 SQL 資料庫的登入名稱都會設定為執行個體內的登入。 這些登入是在 SQL Server 的執行個體層級設定,並儲存在 master 資料庫中。 不過,您可以設定包含的使用者,這些使用者會在資料庫層級。 這些使用者可以設定為 SQL Server 驗證使用者和 Windows 驗證使用者或Microsoft Entra 使用者(視您使用的平臺而定)。 若要建立這些使用者,資料庫必須針對部份內含項目加以設定,根據預設是在 Azure SQL Database 或選擇在 SQL Server 中設定。
這些使用者只能存取使用者被設定的資料庫。 為了 Azure SQL Database 的目的,最佳做法是在用戶資料庫範圍內建立使用者,而不是在 master 資料庫中建立使用者。
CREATE USER [dba@contoso.com] FROM EXTERNAL PROVIDER;
GO
CREATE USER 陳述式是在使用者資料庫的內容中執行。 在此範例中,使用者是 Microsoft Entra 使用者,如 FROM EXTERNAL PROVIDER 語法所示。
如果在 SQL Server 的執行個體層級建立登入,則應該在資料庫中建立使用者,並將該使用者對應到以伺服器為基礎的登入,如下列範例所示。
USE [master]
GO
CREATE LOGIN demo WITH PASSWORD = 'Pa55.w.rd'
GO
USE [WideWorldImporters]
GO
CREATE USER demo FROM LOGIN demo
GO
首先會在 master 資料庫中建立登入,然後在 WideWorldImporters 資料庫中建立使用者,以對應至該登入。 登入是用來存取 SQL Server 或 Azure SQL Database,但若要在資料庫內執行任何工作,登入必須對應到使用者名稱。 使用者名稱用於所有授權。
登入和使用者名稱是您必須注意的最重要安全性主體,但以下各節將說明處理授權時的一些其他概念和詞彙。
資料庫角色
您可以想像,對於具有許多使用者的應用程式而言,資料庫安全性可能相當複雜。 為了讓系統管理員和稽核員更容易使用,大部分的資料庫應用程式都使用角色型安全性。 角色實際上是共用一組通用權限的安全性群組。 將權限合併至角色,可讓您為指定的應用程式建立一組角色。 角色的一些範例是系統管理員,這種角色擁有所有資料庫和伺服器的完整存取權、只能讀取資料庫的報告使用者,以及具有存取權以將資料寫入資料庫的應用程式帳戶。 您可以在設計應用程式時定義角色,然後將角色指派給需要存取資料庫的使用者。 角色型存取控制為跨電腦系統的通用架構,也是在 Azure Resource Manager 中管理授權的方式。
SQL Server 和 Azure SQL Database 都包含由 Microsoft 定義的內建角色,也提供建立自訂角色的選項。 您可以在伺服器或資料庫層級建立自訂角色。 但是,您無法直接在資料庫內將物件存取權授予給伺服器角色。 伺服器角色僅適用於 SQL Server 和 Azure SQL 受控執行個體,而非 Azure SQL Database。
在資料庫中,您可以將權限授與給資料庫內存在的使用者。 如果多個使用者都需要相同的許可權,您可以在資料庫中建立資料庫角色,並將所需的權限授與給此角色。 您可以將使用者新增為資料庫角色的成員。 資料庫角色的成員會繼承資料庫角色的許可權。
CREATE USER [DP300User1] WITH PASSWORD = 'Pa55.w.rd'
GO
CREATE USER [DP300User2] WITH PASSWORD = 'Pa55.w.rd'
GO
CREATE ROLE [SalesReader]
GO
ALTER ROLE [SalesReader] ADD MEMBER [DP300User1]
GO
ALTER ROLE [SalesReader] ADD MEMBER [DP300User2]
GO
GRANT SELECT, EXECUTE ON SCHEMA::Sales TO [SalesReader]
GO
在上述範例中,您可以看到建立了兩個使用者,然後建立名為 SalesReader 的角色。 這兩個新使用者被新增到新建立的角色中,最後該角色被授予 SELECT 和 EXECUTE 許可權在 Sales 架構上。 任何處於該角色的使用者都可以從 Sales 架構中的任何物件中選取,並在架構中執行任何預存程式。
應用程式角色
您也可以在 SQL Server 資料庫或 Azure SQL Database 內建立應用程式角色。 不同於資料庫角色,使用者不會成為應用程式角色的成員。 應用程式角色是由用戶啟動,方法是提供應用程式角色的預先設定密碼。 啟用角色之後,套用至應用程式角色的權限會套用至該使用者,直到該角色停用為止。
內建資料庫角色
Microsoft SQL Server 在每個資料庫中包含數個具有預先定義權限的固定資料庫角色。 您可以將使用者新增為一或多個角色的成員。 這些角色會為其成員提供一組預先定義的許可權。 這些角色在 Azure SQL Database 和 SQL Server 內的運作效果相同。
| 資料庫角色 | 定義 |
|---|---|
| db_accessadmin | 允許使用者在資料庫中建立其他使用者。 此角色不會授與任何資料表之架構的存取權,也不會授與資料庫內資料的存取權。 |
| db_backupoperator | 允許使用者在 SQL Server 或 SQL 受控執行個體中備份資料庫。 角色 db_backupoperator 不會授與 Azure SQL Database 中的任何許可權。 |
| db_datareader | 允許使用者從資料庫內的每個資料表和檢視進行讀取。 |
| db_datawriter | 允許使用者從資料庫內的每個資料表和檢視 INSERT、UPDATE 和 DELETE 資料。 |
| db_ddladmin | 允許使用者建立或修改資料庫中的物件。 此角色的成員可以變更任何類型之物件的定義,但此角色的成員不會被授與讀取或寫入資料庫中任何資料的存取權。 |
| db_denydatareader | 角色可用於需要防止從資料庫中任何物件讀取資料的使用者,而這些使用者已透過其他角色或直接授與權限。 |
| db_denydatawriter | 角色可用於需要防止對資料庫中任何物件寫入資料的使用者,而這些使用者已透過其他角色或直接授與權限。 |
| db_securityadmin | 需要能將存取權授與資料庫中其他使用者的使用者。 此角色的成員不會獲授與資料庫內資料的存取權,不過,此角色的成員可以將資料庫中資料表的存取權授與給自己。 此資料庫角色的成員資格應僅限為受信任的使用者。 |
| db_owner | 需要資料庫管理權限的使用者。 依預設,此角色的成員可以在資料庫內執行任何動作。 不過,與具有使用者名稱 dbo 的實際資料庫擁有者不同,db_owner 角色中的使用者可以藉由將他們放在其他資料庫角色中(例如 db_denydatareader),或拒絕他們存取物件,來封鎖其存取數據。 此資料庫角色的成員資格應僅限為受信任的使用者。 |
資料庫內的所有使用者都會自動成為 public 角色的成員。 依據預設,此角色不會被授與任何權限。 您可以將權限授與 public 角色,但您應該仔細考慮這是否真的是您想要做的事。 將權限授與 public 角色會將這些權限授與任何使用者,包括 guest 帳戶 (如果 guest 帳戶已啟用)。
內建的資料庫角色的確符合許多應用程式的需求,但是如果應用程式需要更細微的安全性 (例如,當您只想要授與特定資料表子集的存取權),自訂角色通常是較佳的選擇。
注意
根據預設, db_owner 等角色中的使用者一律可以看到資料庫中的所有數據。 應用程式可以利用 Always Encrypted 之類的加密選項,保護敏感數據不受特殊許可權用戶保護。
針對 Azure SQL Database,則有數個細微差異。 您可以擁有存在於虛擬 master 資料庫的登入、資料庫使用者,甚至是 Microsoft Entra 帳戶的自主資料庫使用者 (建議使用)。 雖然 Azure SQL Database 的伺服器管理員基本上具有 sysadmin 權限,但您可使用伺服器或資料庫層級角色來建立限制更多的管理員。 在虛擬 master 資料庫中,SQL 資料庫有兩個僅在此存在的資料庫層級角色:
| 資料庫角色 | 定義 |
|---|---|
| loginmanager | 允許成員建立資料庫伺服器的登入。 此角色等同於內部部署 Microsoft SQL Server 中的 dbcreator 固定伺服器角色。 |
| dbmanager | 允許成員建立和刪除資料庫伺服器的資料庫。 此角色等同於內部部署 Microsoft SQL Server 中的 securityadmin 固定伺服器角色。 |
固定伺服器層級角色
除了資料庫角色之外,SQL Server 和 Azure SQL 受控實例也提供數個固定的伺服器層級角色。 這些角色會指派整個伺服器範圍的權限。 您可以將伺服器層級主體 (包括 SQL Server 登入、Windows 帳戶和 Windows 群組) 加入至固定伺服器層級角色中。 固定伺服器層級角色的許可權是預先定義的,而且無法新增任何新的伺服器角色。
| 固定伺服器層級角色 | 定義 |
|---|---|
| sysadmin | 允許其成員在伺服器上執行任何活動。 |
| serveradmin | 允許其成員變更整個伺服器的設定 (例如最大伺服器記憶體),而且可以關閉伺服器。 |
| securityadmin | 允許其成員管理登入及其屬性 (例如變更登入的密碼)。 其成員也可以授與及撤銷伺服器和資料庫層級權限。 您應該將此角色視為等同於系統管理員 (sysadmin) 角色。 |
| processadmin | 允許其成員終止在 SQL Server 內執行的程序。 |
| setupadmin | 允許其成員使用 T-SQL 新增和移除連結的伺服器。 |
| bulkadmin | 允許其成員執行 BULK INSERT T-SQL 陳述式。 |
| diskadmin | 允許其成員管理 SQL Server 中的備份裝置。 |
| dbcreator | 允許其成員建立、還原、改變及卸載任何資料庫。 |
| 公共 | 每個 SQL Server 登入都屬於 public 使用者角色。 與其他固定伺服器角色不同的是,public 角色的權限可以被授與、拒絕或撤銷。 |
以下是 Azure SQL Database 中的伺服器層級角色清單:
- ##MS_DatabaseConnector##
- ##MS_DatabaseManager##
- ##MS_DefinitionReader##
- ##MS_LoginManager##
- ##MS_SecurityDefinitionReader##
- ##MS_ServerStateReader##
- ##MS_ServerStateManager##