共計 3956 個字符,預計需要花費 10 分鐘才能閱讀完成。
本篇文章為大家展示了如何進行數據庫權限分配的探討,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
首先我們先了解下數據庫的權限相關的內容
主體
“主體”是可以請求 SQL Server 資源的實體。與 SQLServer 授權模型的其他組件一樣,主體也可以按層次結構排列。 主體的影響范圍取決于主體定義的范圍 (Windows、服務器或數據庫) 以及主體是否不可分或是一個集合。 例如,Windows 登錄名就是一個不可分主體,而 Windows 組則是一個集合主體。每個主體都具有一個安全標識符(SID)。
Windows 級別的主體
Windows 域登錄名
Windows 本地登錄名
SQL Server- 級的主體
SQL Server 登錄名
服務器角色
數據庫級的主體
數據庫用戶
數據庫角色
應用程序角色
SQLServer sa 登錄名
SQL Server sa 登錄名是服務器級的主體。默認情況下,該登錄名是在安裝實例時創建的。
public 數據庫角色
每個數據庫用戶都屬于 public 數據庫角色。 當尚未對某個用戶授予或拒絕對安全對象的特定權限時,則該用戶將繼承授予該安全對象的 public 角色的權限。
INFORMATION_SCHEMA 和 sys
每個數據庫都包含兩個實體:
INFORMATION_SCHEMA 和 sys,它們都作為用戶出現在目錄視圖中。這兩個實體是 SQL Server 所必需的。 它們不是主體,不能修改或刪除它們。
基于證書的 SQL Server 登錄名
名稱由雙井號 (##)括起來的服務器主體僅供內部系統使用。下列主體是在安裝 SQL Server 時從證書創建的,不應刪除。
##MS_SQLResourceSigningCertificate##
##MS_SQLReplicationSigningCertificate##
##MS_SQLAuthenticatorCertificate##
##MS_AgentSigningCertificate##
##MS_PolicyEventProcessingLogin##
##MS_PolicySigningCertificate##
##MS_PolicyTsqlExecutionLogin##
guest 用戶
每個數據庫包括一個 guest。 授予 guest 用戶的權限由對數據庫具有訪問權限,但在數據庫中沒有用戶帳戶的用戶繼承。不能刪除 guest 用戶,但可通過撤消該用戶的 CONNECT 權限將其禁用。 可以通過在 master 或 tempdb 以外的任何數據庫中執行 REVOKE CONNECTFROM GUEST 來撤消 CONNECT 權限。
客戶端和數據庫服務器
根據定義,客戶端和數據庫服務器是安全主體,可以得到保護。在建立安全的網絡連接前,這些實體之間可以互相進行身份驗證。SQLServer 支持 Kerberos 身份驗證協議,該協議定義客戶端與網絡身份驗證服務交互的方式。
創建數據庫用戶
SQL2016 中支持 11 種用戶類型:
用戶基于登錄名在 master 這是最常見的用戶類型。
基于登錄名基于的 Windows Active Directory 帳戶的用戶
CREATE USER [Contoso\Fritz];
基于 Windows 組的登錄名的用戶。CREATE USER [Contoso\Sales];
基于使用 SQLServer 身份驗證的登錄名的用戶。CREATE USER Mary;
在數據庫進行身份驗證的用戶建議以幫助使你的數據庫可移植性。
始終允許在 SQL Database。中包含的數據庫中只允許存在 SQL Server。
基于無登錄名的 Windows 用戶的用戶
CREATEUSER [Contoso\Fritz];
基于無登錄名的 Windows 組的用戶。CREATE USER [Contoso\Sales];
中的用戶 SQLDatabase 或 SQL 數據倉庫 基于 Azure Active Directory 的用戶。CREATE USER [Contoso\Fritz] FROMEXTERNAL PROVIDER;
擁有密碼的包含數據庫用戶。(在中不可用 SQL 數據倉庫。)CREATE USER Mary WITHPASSWORD = ********
基于 Windows 主體通過 Windows 組登錄名進行連接的用戶
基于無登錄名但可通過 Windows 組中的成員身份連接到數據庫引擎的 Windows 用戶的用戶
CREATE USER [Contoso\Fritz];
基于無登錄名但可通過其他 Windows 組中的成員身份連接到數據庫引擎的 Windows 組的用戶。CREATE USER [Contoso\Fritz];
無法進行身份驗證的用戶 這些用戶無法登錄到 SQL Server 或 SQL Database。
沒有登錄名的用戶。不能登錄,但可以被授予權限
CREATE USER CustomAppWITHOUT LOGIN;
基于證書的用戶。不能登錄,但可以被授予權限,也可以對模塊進行簽名。CREATE USERTestProcess FOR CERTIFICATE CarnationProduction50;
基于非對稱密鑰的用戶。不能登錄,但可以被授予權限,也可以對模塊進行簽名。CREATE User TestProcessFROM ASYMMETRIC KEY PacificSales09;
下面的圖片顯示了創建數據庫用戶需要的選項的含義:
創建用戶可以使用界面完成:
也可以使用 T -SQL 來進行創建
— 創建登錄名:Test 密碼是:123456 .
CREATELOGIN Test
WITH PASSWORD = 123456
GO
上面說完了用戶,下面說下數據庫的角色和權限
服務器級別的權限
SQL Server 提供服務器級角色以幫助你管理服務器上的權限。這些角色是可組合其他主體的安全主體。服務器級角色的權限作用域為服務器范圍。 (“角色”類似于 Windows 操作系統中的“組”。)
SQL Server 提供了九種固定服務器角色。無法更改授予固定服務器角色的權限。從 SQL Server 2012 開始,您可以創建用戶定義的服務器角色,并將服務器級權限添加到用戶定義的服務器角色。
你可以將服務器級主體 (SQL Server 登錄名、Windows 帳戶和 Windows 組) 添加到服務器級角色。 固定服務器角色的每個成員都可以將其他登錄名添加到該同一角色。用戶定義的服務器角色的成員則無法將其他服務器主體添加到角色。
下表顯示了服務器級的固定角色及其權限
下表顯示了固定數據庫角色及其能夠執行的操作。所有數據庫中都有這些角色。無法更改分配給固定數據庫角色的權限
無法更改分配給固定數據庫角色的權限。下圖顯示了分配給固定數據庫角色的權限:
SQL 2016 有一些數據庫的特殊權限
msdb 角色
msdb 數據庫中包含下表顯示的特殊用途的角色。
使用 R Services
SQL Server(從 SQL Server vNext 開始)
安裝 R Services 時,其他數據庫角色可用于管理包
下面講如何實現文章前面說的需求:
給某個用戶查詢所有數據庫的權限
給某個用戶只有備份數據庫的權限
給一個用戶只有指定數據庫的權限
給一個用戶只有某個表的權限
給某個用戶查詢所有數據庫的權限
創建一個用戶
USE [master] GO CREATE LOGIN [Test1]WITH PASSWORD=N password@123
使用 Test1 連接數據庫實例
可以看到數據庫列表,但是無法訪問數據庫,
賦予 test1 對 FinaceDemo 的讀取權限
USE [FinaceDemo] GO CREATE USER [Test1] FOR LOGIN [Test1] ALTER ROLE [db_datareader] ADD MEMBER [Test1] GO
這樣就可以給 test1 用戶對 finacedemo 的讀取權限
但是 test1 沒有寫入權限
這樣就可以單獨對 test1 賦予數據庫的讀取權限進行查看操作。
給某個用戶只有備份數據庫的權限
Test1 對于 finacedemo 無備份權限
賦予備份權限
ALTER ROLE [db_backupoperator] ADD MEMBER [Test1]
給一個用戶只有指定數據庫的權限
我們需要 Test1 只能看到 FinanceDemo,其他所有數據庫都不能看到
執行下面腳本
USE [master] Deny VIEW any DATABASE TO Test1; go
運行后的效果
Test1 連接后看不到任何數據庫
執行:
ALTER AUTHORIZATIONON DATABASE::FinanceDemo TO test1
完成后結果:
Test1 能查看到賦予權限的數據庫
給一個用戶只有某個表的權限
創建測試用戶 test3
USE [master] GO CREATE LOGIN [Test3] WITH PASSWORD=N password@123 —– 賦予 test2 可以登錄 testDB USE [testdb] GO CREATE USER [Test3] FOR LOGIN [Test3] GO
賦予 test3 對于 t2 表的 update 和 select 權限 grant update on dbo.t2to test3 grant select on dbo.t2to test3 use testDB 查看 test3 用戶獲得的權限 exec sp_helprotect @username= test3
可以看到用戶 test3 擁有了 t2 的 select 和 update 權限
執行 select * from t2
執行插入操作失敗。
權限管理非常復雜,以上只是做了簡單的介紹。需要更加詳細的內容,需要自己去研究。在 technet 上可以找到更加詳細的信息。
上述內容就是如何進行數據庫權限分配的探討,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注丸趣 TV 行業資訊頻道。