Sql-Server

數據庫角色權限是否優先於架構/對象級別權限?

  • July 20, 2022

我對 SQL Server 安全權限有一個有趣的觀察。

我的設置如下。我試圖限制使用者更新特定模式下的表。

問題陳述是為什麼允許使用者通過視圖(不同模式)在表上進行插入,即使插入在視圖定義中的表模式上被明確拒絕?

USE master
GO

CREATE LOGIN Login1
   WITH password = 'Admin@123'
GO

CREATE DATABASE TestDB
GO

USE TestDB
GO

CREATE user Login1
FROM LOGIN Login1
GO

CREATE SCHEMA sch1
GO

CREATE SCHEMA V
GO

CREATE TABLE sch1.table1 (
   id INT
   ,name VARCHAR(5)
   )
GO

CREATE VIEW v.view1
AS
SELECT *
FROM sch1.table1
GO

CREATE VIEW sch1.view2
AS
SELECT *
FROM sch1.table1
GO

--User can update all tables
ALTER ROLE [db_datawriter] ADD MEMBER [Login1] 
GO

--Except tables under this schema
DENY INSERT
   ON SCHEMA::[sch1]
   TO [Login1]
GO



--Open session with Login1
USE TestDB
GO

--Should not work, does not work.
INSERT sch1.table1
SELECT 1, 'A'
--The INSERT permission was denied on the object 'table1', database 'TestDB', schema 'sch1'.


--Should not work, does not work.
INSERT sch1.view2
SELECT 1, 'A'
--The INSERT permission was denied on the object 'view2', database 'TestDB', schema 'sch1'.


-- Works! - even though write is denied on underlying table?
INSERT v.view1
SELECT 1, 'A'
--(1 row affected)

根據文件,我希望通過視圖插入也會失敗。

需要對目標表具有 UPDATE、INSERT 或 DELETE 權限,具體取決於正在執行的操作。

但它之所以有效,是因為有一個名為Ownership chaining的概念。官方教程在這裡

當您有權訪問一個對象(在本例中為 v.view1)並且該對象引用具有相同所有者(sch1.table1)的安全對象時,根本不會檢查權限。

由於兩個對像都沒有明確的所有者:

預設情況下,包含架構的對象歸架構所有者所有

資源

和架構所有者可以在這裡找到

SELECT
   s.name AS schName, dp.name AS ownerUser
FROM sys.schemas AS s 
JOIN sys.database_principals AS dp
   ON dp.principal_id = s.principal_id
WHERE s.name IN (N'v', N'sch1')

在此處輸入圖像描述

您可以通過更改架構v的所有者來打破所有權鏈,如下所示:

ALTER AUTHORIZATION ON SCHEMA::v TO Login1

然後你會得到你期望的拒絕。

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