我是否應該向我的 Azure Web 應用程序的 Azure SQL 使用者提供 db_owner 主體角色?
我有一個連接到 Azure SQL 數據庫的 Azure Web 應用程序。讓我們將應用程序稱為 ACME。該應用程序有它自己的角色和名為 ACME 的使用者,我賦予該使用者
db_owner
主要角色。Web App 的身份驗證不是基於 Active Directory,但它使用自己的基於 ASP.NET MVC 的自定義使用者和角色系統資料庫。因此,Web 應用程序創建使用者並管理這些使用者的角色,但這些角色在技術上不是本機 SQL 角色,而是自定義託管的 AspNetUserRoles。很少有一些架構更改,我以 ACME 的身份執行架構升級。最近漏洞評估規則發生了變化,V2130 也發生了變化:它以前預設接受
dbo
,db_owner
但現在如果它不是基線的一部分,它會列出它。去年只有 ACME 被添加到我的基線中。現在我需要決定:
- 我應該撤銷
dbo
的db_owner
權利嗎?這讓我感到很奇怪,因為它是 SQL 的核心部分,預設情況下 SQL 甚至不允許您撤銷dbo
的db_owner
權利。僅當您至少有一個其他使用者擁有此類權利時,這才有可能。就我而言,我有 ACME。- 除了 ACME ,我還應該將其添加
dbo
到我的基線中嗎?db_owner
- 我是否應該將
dbo
as添加db_owner
到我的基線中並限制 ACME 的主體,使其不像db_owner
. 這是為了遵守最低權限的基本安全規則。那麼我應該將 ACME 降級到例如db_ddladmin
. 由於偶爾的架構更改,我正在考慮 DDL 管理員。更一般地說:對於這種常見情況,最安全和最佳實踐(關於使用者權限和原則)可能是什麼?
圖表 A:2020 年 12 月之前的 VA2130 查詢,觀看
principal_name != 'dbo'
:WITH UsersAndRoles (principal_name, sid, type) AS ( SELECT DISTINCT prin.name, prin.sid, prin.type FROM sys.database_principals prin INNER JOIN ( SELECT * FROM sys.database_permissions WHERE type = 'CO' AND state IN ('G', 'W') ) perm ON perm.grantee_principal_id = prin.principal_id WHERE prin.type IN ('S', 'X', 'R', 'E', 'G') UNION ALL SELECT user_name(rls.member_principal_id), prin.sid, prin.type FROM UsersAndRoles cte INNER JOIN sys.database_role_members rls ON user_name(rls.role_principal_id) = cte.principal_name INNER JOIN sys.database_principals prin ON rls.member_principal_id = prin.principal_id WHERE cte.type = 'R' ), Users (database_user, sid) AS ( SELECT principal_name, sid FROM UsersAndRoles WHERE type IN ('S', 'X', 'E', 'G') AND principal_name != 'dbo' ) SELECT DISTINCT database_user AS [User], sid AS [SID] FROM Users WHERE sid != 0x01
圖表 B:2020 年 12 月規則更改後的 VA2130 查詢:
WITH UsersAndRoles (principal_name, sid, type) AS ( SELECT DISTINCT prin.name, prin.sid, prin.type FROM sys.database_principals prin INNER JOIN sys.database_permissions perm ON perm.grantee_principal_id = prin.principal_id WHERE prin.type in ('S', 'X', 'R') UNION ALL SELECT user_name(rls.member_principal_id), prin.sid, prin.type FROM UsersAndRoles cte INNER JOIN sys.database_role_members rls ON user_name(rls.role_principal_id) = cte.principal_name INNER JOIN sys.database_principals prin ON rls.member_principal_id = prin.principal_id WHERE cte.type = 'R' ), Users (database_user, sid) AS ( SELECT principal_name, sid FROM UsersAndRoles WHERE type in ('S', 'X') ) SELECT DISTINCT database_user, sid FROM Users WHERE sid != 0x01
額外說明:我知道我應該從數據庫角色 db_owner 中刪除 dbo 嗎?但是我認為只是添加
dbo
作為基線並繼續前進而不考慮和討論許多開發人員在 ASP.NET MVC 和其他應用程序的情況下擁有的 ACME 使用者有點疏忽。注意:我在查看多個漏洞掃描項目時感到困惑,並意識到 ACME 使用者謝天謝地沒有任何特殊的數據庫角色!
與 VA2108 相關:https ://github.com/MicrosoftDocs/azure-docs/issues/70391
正如您看到我的回答和 Tibor 對我應該從數據庫角色 db_owner 中刪除 dbo 嗎?你不應該太擔心遺留
dbo
使用者。對於您的
ACME
使用者,我同意您應該遵循最低權限安全主體,因此,如果它不需要像 a 那樣廣泛的訪問權限,db_owner
則將其從該角色中刪除並僅添加您的ACME
使用者確實需要的角色或個人權限。因此,我建議您將第三個選項作為您前進的道路。