資料庫許可權分配探討
上週, 有位朋友給我提出了這樣的需求:區分使用者訪問資料庫的許可權。順便總結了下有如下要求:
- 某個使用者查詢所有資料庫的許可權
- 某個使用者只有備份資料庫的許可權
- 給一個使用者只能檢視指定資料庫的許可權
- 給一個使用者只有某個表的許可權
要進行以上任務,首先我們先了解下資料庫的許可權相關的內容
主體
“主體” 是可以請求 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'[email protected]'
使用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'[email protected]' -----賦予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上面的資訊。
許可權管理非常複雜,以上只是做了簡單的介紹。需要更加詳細的內容,需要自己去研究。在technet上可以找到更加詳細的資訊。