Security

我是否應該向我的 Azure Web 應用程序的 Azure SQL 使用者提供 db_owner 主體角色?

  • February 12, 2021

我有一個連接到 Azure SQL 數據庫的 Azure Web 應用程序。讓我們將應用程序稱為 ACME。該應用程序有它自己的角色和名為 ACME 的使用者,我賦予該使用者db_owner主要角色。Web App 的身份驗證不是基於 Active Directory,但它使用自己的基於 ASP.NET MVC 的自定義使用者和角色系統資料庫。因此,Web 應用程序創建使用者並管理這些使用者的角色,但這些角色在技術上不是本機 SQL 角色,而是自定義託管的 AspNetUserRoles。很少有一些架構更改,我以 ACME 的身份執行架構升級。

最近漏洞評估規則發生了變化,V2130 也發生了變化:它以前預設接受dbodb_owner但現在如果它不是基線的一部分,它會列出它。去年只有 ACME 被添加到我的基線中。現在我需要決定:

  1. 我應該撤銷dbodb_owner權利嗎?這讓我感到很奇怪,因為它是 SQL 的核心部分,預設情況下 SQL 甚至不允許您撤銷dbodb_owner權利。僅當您至少有一個其他使用者擁有此類權利時,這才有可能。就我而言,我有 ACME。
  2. 除了 ACME ,我還應該將其添加dbo到我的基線中嗎?db_owner
  3. 我是否應該將dboas添加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使用者確實需要的角色或個人權限。

因此,我建議您將第三個選項作為您前進的道路。

引用自:https://dba.stackexchange.com/questions/285137