SQL Server public 角色權限管理

服務器角色public

所有登陸名都屬於public服務器角色,登陸名是不能移除public角色的,且public角色是不能刪除的。這對於我們來說是相當恐怖的事情,因爲權限分配的第一原則即最小權限原則,對於一個不可掌控的權限,我們的心裏是非常忐忑的。那麼public角色具有哪些權限?屬於public角色的成員能做些什麼操作?public權限是否可以收回?本文將帶你解決這些問題。

public 服務器角色有兩個權限:

  • VIEW ANY DATABASE

  • CONNECT ON ENDPOINT

可以通過sys.server_permissions 查看public服務器角色所具有的權限,腳本如下:

SELECT * FROM sys.server_permissions
WHERE grantee_principal_id=2;

數據庫架構暴露出去,是存極大安全隱患的,因爲一旦暴露數據庫架構,黑客們就有了明確的攻擊目標。所以對於大部分登陸名,都要收回其查看數據庫的權限。我們可以通過如下語句收回登陸名查看數據庫的權限:
REVOKE VIEW ANY DATABASE FROM PUBLIC;

收回服務器角色public查看任意數據庫權限,不包括master和tempdb數據庫,即此時所有登陸名仍具有查看master和tempdb的權限

數據庫角色public

每個數據庫的所有用戶都是public角色,用戶同樣不能退出public角色成員。我們也需要了解public數據庫角色具有哪些權限。通過如下腳本,可以查看public具有的權限:

SELECT DB_NAME(grantee_principal_id ) database_name
       ,prin.name database_role_name
       ,class_desc permission_class
       ,state_desc permision_state
       ,permission_name
       ,v.type_desc AS object_type
       ,SCHEMA_NAME(SCHEMA_ID) AS object_schema_name
       ,v.name AS OBJECT_NAME
FROM sys.all_objects AS v
INNER JOIN sys.database_permissions AS prmssn ON prmssn.major_id=v.OBJECT_ID
INNER JOIN sys.database_principals AS prin ON prmssn.minor_id=prin.principal_id
WHERE prin.name='public';

結果如下圖:

上面通過收回服務器角色public的VIEW ANY DATABASE 權限,用戶不能在左側列表查看除master和tempdb以外所有數據庫,但如果我們整個左側列表都不想給所有普通用戶看到的話,可以通過如下腳本收回或賦予左側列表的權限:

--收回左側列表查看權限
DENY SELECT  TO PUBLIC;
--賦予左側列表查看權限
GRANT SELECT TO PUBLIC;

收回public的SELECT權限後,我們發現,點對象資源管理器下任何對象,都會報錯,如上圖。

注意:這個對於sysadmin系統角色的成員無效。

看到這裏,對於沒有開發環境,或者有開發環境,管理不規範,開發環境和生產環境數據庫結構不一致的,或者習慣了使用左側列表查看數據庫結構的開發人員就要跳腳了。根據最小權限原則,開發人員只需要查看其工作相關的內容即可,而這些內容通常開發人員都比較熟悉,如其創建的表、編寫的存儲過程等,我們給相應的賬戶開啓查看定義權限VIEW DEFINITION即可,腳本如下:

use [DB1]
GO
GRANT VIEW DEFINITION TO [loginName2]
GO

這樣我們可以使用sp_help tableName 或者sp_helptext procedureName查看錶結構和存儲過程的內容了:

use DB1
exec sp_help [test]​

use DB1
exec sp_helptext [test1]

這是不是比你使用鼠標點擊查看錶結構和存儲過程更cool呢,希望你能喜歡這種操作。更多精彩,可以搜索關注公衆號MSSQLSERVER哦!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章