中繼資料可見性組態

適用于:SQL ServerAzure SQL資料庫Azure SQL 受控執行個體Azure SynapseAnalytics AnalyticsPlatform System (PDW)

中繼資料的可見性會限制在使用者所擁有的安全性實體,或已授與使用者某些權限的安全性實體。

例如,如果授與使用者資料表 myTable的 SELECT 或 INSERT 權限,則下列查詢會傳回一個資料列。

SELECT name, object_id  
FROM sys.tables  
WHERE name = N'myTable';  
GO  

但是,如果使用者對 myTable沒有任何權限,則查詢會傳回空的結果集。

中繼資料可見性組態的範圍和影響

中繼資料可見性組態僅適用於下列安全性實體。

目錄檢視

公開內建函數的中繼資料

相容性檢視

Database Engine sp_help 預存程式

資訊結構描述檢視

擴充屬性

中繼資料可見性組態不適用於下列安全性實體。

「記錄傳送」系統資料表

資料庫維護計畫系統資料表

「複寫」系統資料表

SQL Server Agent系統資料表

「備份」系統資料表

複寫和SQL Server Agent sp_help預存程式

中繼資料存取範圍有限制的意義如下:

  • 對系統檢視查詢可能只會傳回資料列的子集,或有時候傳回空的結果集。

  • 中繼資料發出、內建的函式,例如 OBJECTPROPERTYEX 可能會傳回 NULL

  • Database Engine sp_help 預存程式可能只傳回資料列的子集,或 NULL

  • 因此,假設 公用 中繼資料存取的應用程式會中斷。

SQL 模組 (例如預存程序和觸發程序) 會在呼叫者的安全性內容下執行,因此在中繼資料的存取上受到限制。 例如,在下列的程式碼中,當預存程序嘗試存取資料表 myTable 的中繼資料而呼叫者對此資料表沒有任何權限時,將會傳回空的結果集。 在舊版的 SQL Server 中,會傳回資料列。

CREATE PROCEDURE assumes_caller_can_access_metadata  
BEGIN  
SELECT name, object_id   
FROM sys.objects   
WHERE name = N'myTable';  
END;  
GO  

若要允許呼叫端檢視中繼資料,您可以授與呼叫端 VIEW DEFINITION 許可權,或從 2022 年 SQL Server 2022 年檢視 SECUIRITY DEFINITION 或 VIEW PERFORMANCE DEFINITION 開始的適當範圍:物件層級、資料庫層級或伺服器層級。 因此,在上個範例中,如果呼叫者具有 myTable的 VIEW DEFINITION 權限,預存程序就會傳回一個資料列。 如需詳細資訊,請參閱 GRANT (Transact-SQL) GRANT 資料庫許可權 (Transact-SQL)

您也可以修改預存程序,使其在擁有者的認證下執行。 若程序擁有者和資料表擁有者是相同的擁有者,就會套用擁有權鏈結,且程序擁有者的安全性內容就可以存取 myTable的中繼資料。 在這種狀況下,下列程式碼會將中繼資料的資料列傳回給呼叫者。

注意

下列範例使用 sys.objects 目錄檢視,而非 sys.sysobjects 相容性檢視。

CREATE PROCEDURE does_not_assume_caller_can_access_metadata  
WITH EXECUTE AS OWNER  
AS  
BEGIN  
SELECT name, object_id  
FROM sys.objects   
WHERE name = N'myTable'   
END;  
GO  

注意

您可以使用 EXECUTE AS,暫時切換到呼叫者的安全性內容。 如需詳細資訊,請參閱 EXECUTE AS (Transact-SQL)

中繼資料可見性組態的優點和限制

中繼資料可見性組態在整體安全性計畫中扮演著重要的角色。 但在某些情況中,技術純熟又執意操作的使用者還是能夠強制洩漏某些中繼資料。 我們建議您將中繼資料權限部署為全面防禦中的一環。

強制發出錯誤訊息中的中繼資料,理論上是可行的,做法是在查詢中操縱述詞評估的順序。 這類試用和錯誤攻擊的可能性並非專屬於SQL Server。 它由關聯式代數所允許的關聯式和交換式轉換所暗示。 您可以限制錯誤訊息所傳回的資訊來減輕此風險。 若要以此方式進一步限制中繼資料的可見性,您可以用追蹤旗標 3625 來啟動伺服器。 此追蹤旗標限制錯誤訊息所顯示的資訊量。 而這有助於防止強制洩漏。 代價是錯誤訊息會簡單一些,用於偵錯時可能會比較困難。 如需詳細資訊,請參閱 Database Engine 服務啟動選項追蹤旗標 (Transact-SQL)

下列的中繼資料不會被強制洩漏:

  • 儲存在 資料行中的 provider_stringsys.servers 值。 沒有 ALTER ANY LINKED SERVER 許可權的使用者會看到 NULL 此資料行中的值。

  • 使用者自訂物件 (例如預存程序或觸發程序) 的來源定義。 只有下列任一狀況屬實時,才能看見原始程式碼:

    • 使用者具有 物件的 VIEW DEFINITION 許可權。

    • 使用者尚未拒絕物件的 VIEW DEFINITION 許可權,而且物件的 CONTROLALTERTAKE OWNERSHIP 許可權。 所有其他使用者都會看到 NULL

  • 下列目錄檢視中的定義資料行:

    • sys.all_sql_modules
    • sys.server_sql_modules
    • sys.default_constraints
    • sys.numbered_procedures
    • sys.sql_modules
    • sys.check_constraints
    • sys.computed_columns
  • ctext相容性檢視中的資料 syscomments 行。

  • 程式的輸出 sp_helptext

  • 資訊結構描述檢視中的下列資料行:

    • INFORMATION_SCHEMA.CHECK_CONSTRAINTS.CHECK_CLAUSE
    • INFORMATION_SCHEMA.DOMAINS.DOMAIN_DEFAULT
    • INFORMATION_SCHEMA.ROUTINES.ROUTINE_DEFINITION
    • INFORMATION_SCHEMA.COLUMNS.COLUMN_DEFAULT
    • INFORMATION_SCHEMA.ROUTINE_COLUMNS.COLUMN_DEFAULT
    • INFORMATION_SCHEMA.VIEWS.VIEW_DEFINITION
  • OBJECT_DEFINITION() 函數

  • 儲存在 的 password_hash 資料行 sys.sql_logins 中的值。 沒有CONTROL SERVER或從 SQL Server 2022 開始的使用者,VIEW ANY CRYPTOGRAPHICALLY SECURED DEFINITION許可權將會在此資料行中看到 NULL 值。

注意

內建系統程式和函式的 SQL 定義可透過 sys.system_sql_modules 目錄檢視、 sp_helptext 預存程式和 OBJECT_DEFINITION () 函式公開顯示。

注意

Azure Synapse Analytics 不支援系統預存程式 sp_helptext 。 請改用 sys.sql_modules 物件目錄檢視。

中繼資料可見性的一般原則

下列是幾個關於中繼資料可見性的一般考量原則:

  • 固定角色的隱含權限

  • 權限範圍

  • DENY 的優先順序

  • 子元件中繼資料的可見性

固定角色和隱含權限

固定角色可以存取的中繼資料取決於其對應的隱含權限。

權限範圍

在某個範圍的權限意味著,查看該範圍及所有包含範圍之中繼資料的能力。 例如,架構的 SELECT 許可權表示被授與者擁有該架構所包含之所有安全性實體的 SELECT 許可權。 因此,授與 架構的 SELECT 許可權可讓使用者查看架構的中繼資料,以及其中的所有資料表、檢視、函式、程式、佇列、同義字、類型和 XML 架構集合。 如需範圍的詳細資訊,請參閱 許可權階層 (Database Engine)

注意

UNMASK許可權不會影響中繼資料可見度:單獨授與UNMASK將不會揭露任何中繼資料。 UNMASK 一律必須伴隨 SELECT 許可權,才能有任何作用。 範例:在資料庫範圍上授與 UNMASK ,並在個別資料表上授與 SELECT 的結果,使用者只能看到個別資料表的中繼資料,而無法看到其他資料表的中繼資料。

DENY 的優先順序

DENY 通常會優先于其他許可權。 例如,如果資料庫使用者被授與架構的 EXECUTE 許可權,但已經拒絕該架構中預存程式的 EXECUTE 許可權,使用者就無法檢視該預存程式的中繼資料。

此外,如果使用者拒絕架構的 EXECUTE 許可權,但已授與該架構中預存程式的 EXECUTE 許可權,使用者就無法檢視該預存程式的中繼資料。

例如,如果使用者已授與和拒絕預存程式的 EXECUTE 許可權,這可透過您的各種角色成員資格,DENY 會優先使用 而且使用者無法檢視預存程式的中繼資料。

子元件中繼資料的可見性

子元件 (例如索引、檢查條件約束和觸發程序) 的可見性是由其父元件上的權限來決定。 這些子元件不具有可授與的權限。 例如,如果某個使用者被授與了某個資料表的部分權限,該使用者就能檢視資料表、資料行、索引、檢查條件約束、觸發程序和其他子元件的中繼資料。 另一個範例是在指定資料表的個別資料行上授與 SELECT :這可讓被授與者檢視整個資料表的中繼資料,包括所有資料行。 其中一種方法是 VIEW DEFINITION 許可權只能在實體層級 (資料表上運作,在此案例中為) ,不適用於子實體清單 (,例如資料行或安全性運算式) 。

下列程式碼示範此行為:

CREATE TABLE t1
(
    c1 int,
    c2 varchar
 );
GO
CREATE USER testUser WITHOUT LOGIN;
GO

EXECUTE AS USER='testUser';
SELECT OBJECT_SCHEMA_NAME(object_id), OBJECT_NAME(object_id), name FROM sys.columns;
SELECT * FROM sys.tables
-- this returns no data, as the user has no permissions
REVERT;
GO

-- granting SELECT on only 1 column of the table:
GRANT SELECT ON t1(c1) TO testUser;
GO
EXECUTE AS USER='testUser';
SELECT OBJECT_SCHEMA_NAME(object_id), OBJECT_NAME(object_id), name FROM sys.columns;
SELECT * FROM sys.tables
-- this returns metadata for all columns of the table and thge table itself
REVERT;
GO

DROP TABLE t1
DROP USER testUser

所有資料庫使用者都可以存取的中繼資料

在特定資料庫中,某些中繼資料必須可由所有使用者存取。 例如,檔案群組不具可授與的權限,所以使用者無法被授與權限來檢視檔案群組的中繼資料。 但是,任何可以建立資料表的使用者,必定能夠存取檔案群組中繼資料,以使用 CREATE TABLE 陳述式中的 ON filegroup 或 TEXTIMAGE_ON filegroup 子句。

DB_ID() 和 DB_NAME() 函數傳回的中繼資料,所有使用者都可以看到。

以下是 public 角色可見的目錄檢視清單。

sys.partition_functions

sys.partition_schemes

sys.filegroups

sys.database_files

sys.partitions

sys.schemas

sys.sql_dependencies

sys.parameter_type_usages

sys.partition_range_values

sys.data_spaces

sys.destination_data_spaces

sys.allocation_units

sys.messages

sys.configurations

sys.type_assembly_usages

sys.column_type_usages

另請參閱

GRANT (Transact-SQL)
DENY (Transact-SQL)
REVOKE (Transact-SQL)
EXECUTE AS 子句 (Transact-SQL)
目錄檢視 (Transact-SQL)
相容性檢視 (Transact-SQL)