Sdílet prostřednictvím


Konfigurace viditelnosti metadat

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

Viditelnost metadat je omezená na zabezpečitelné objekty, které uživatel buď vlastní, nebo ke kterým má udělená nějaká oprávnění.

Následující dotaz například vrátí řádek, pokud uživateli bylo uděleno oprávnění, například SELECT nebo INSERT v tabulce myTable.

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

Pokud však uživatel nemá žádné oprávnění k myTable, dotaz vrátí prázdnou sadu výsledků.

Rozsah a dopad konfigurace viditelnosti metadat

Konfigurace viditelnosti metadat se vztahuje pouze na následující zabezpečitelné položky.

Zobrazení katalogu

Metadata, která zveřejňují předdefinované funkce

Zobrazení kompatibility

Databázový stroj uložené procedury sp_help

Zobrazení schématu informací

Rozšířené vlastnosti

Konfigurace viditelnosti metadat se nevztahuje na následující předměty zabezpečení.

Tabulky systému přesouvání protokolů

Systémové tabulky plánu údržby databáze

Systémové tabulky replikace

Systémové tabulky agenta SQL Serveru

Zálohování systémových tabulek

Replikace a agent SQL Serveru sp_help uložených procedur

Omezená přístupnost metadat znamená následující:

  • Dotazy na systémová zobrazení můžou vracet pouze podmnožinu řádků nebo někdy prázdnou sadu výsledků.

  • Integrované funkce generující metadata, jako je OBJECTPROPERTYEX, mohou vrátit NULL.

  • Databázový stroj sp_help uložených procedur může vracet pouze podmnožinu řádků nebo NULL.

  • V důsledku toho se aplikace, které předpokládají, přístup k veřejným metadatům přeruší.

Moduly SQL, jako jsou uložené procedury a triggery, běží v kontextu zabezpečení volajícího, a proto mají omezenou přístupnost metadat. Například v následujícím kódu se uložená procedura pokusí získat přístup k metadatům pro tabulku myTable, na které volající nemá žádná práva, je vrácena prázdná sada výsledků. V dřívějších verzích SQL Serveru se vrátí řádek.

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

Chcete-li volajícím povolit zobrazení metadat, můžete udělit oprávnění VIEW DEFINITION, nebo od SQL Serveru 2022 také ZOBRAZIT DEFINICI ZABEZPEČENÍ nebo ZOBRAZIT DEFINICI VÝKONU na příslušné úrovni: úroveň objektu, úroveň databáze nebo úroveň serveru. Proto v předchozím příkladu, pokud volající má oprávnění VIEW DEFINITION pro myTable, uložená procedura vrátí řádek. Další informace naleznete v tématu GRANT (Transact-SQL) a GRANT Database Permissions (Transact-SQL).

Uloženou proceduru můžete také upravit tak, aby se spustila pod přihlašovacími údaji vlastníka. Pokud vlastník procedury a vlastník tabulky jsou stejným vlastníkem, použije se řetězení vlastnictví a kontext zabezpečení vlastníka procedury umožňuje přístup k metadatům pro myTable. V tomto scénáři vrátí následující kód volajícímu řádek metadat.

Poznámka

Následující příklad používá zobrazení katalogu sys.objects místo zobrazení sys.sysobjects kompatibility.

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  

Poznámka

Funkci EXECUTE AS můžete použít k dočasnému přepnutí do kontextu zabezpečení volajícího. Více informací viz EXECUTE AS (Transact-SQL).

Výhody a omezení konfigurace viditelnosti metadat

Konfigurace viditelnosti metadat může hrát důležitou roli v celkovém plánu zabezpečení. Existují však případy, kdy zkušený a určený uživatel může vynutit zveřejnění některých metadat. Doporučujeme nasadit oprávnění metadat jako jednu z mnoha hloubkových obran.

Teoreticky je možné vynutit emise metadat v chybových zprávách manipulací s pořadím vyhodnocení predikátu v dotazech. Možnost takových pokusů a chybových útoků není specifická pro SQL Server. Vychází z asociativních a commutativních transformací povolených v relační algebrě. Toto riziko můžete zmírnit omezením informací vrácených v chybových zprávách. Pokud chcete viditelnost metadat tímto způsobem dále omezit, můžete spustit server s příznakem trasování 3625. Tento příznak trasování omezuje množství informací zobrazených v chybových zprávách. To zase pomáhá zabránit vynuceným zveřejněním. Nevýhodou je, že chybové zprávy budou terse a mohou být obtížné použít pro účely ladění. Další informace naleznete v tématech Možnosti spuštění služby databázového stroje a Příznaky trasování (Transact-SQL).

Na vynucené zpřístupnění se nevztahují následující metadata:

  • Hodnota uložená ve sloupci provider_stringsys.servers. Uživatel, který nemá ALTER ANY LINKED SERVER oprávnění, uvidí hodnotu NULL v tomto sloupci.

  • Zdrojová definice uživatelem definovaného objektu, jako je uložená procedura nebo aktivační událost. Zdrojový kód je viditelný pouze v případech, kdy platí jedna z následujících skutečností:

    • Uživatel má oprávnění VIEW DEFINITION k objektu.

    • Uživatel nemá odepřeno oprávnění VIEW DEFINITION k objektu a má oprávnění CONTROL, ALTERnebo TAKE OWNERSHIP k objektu. Všichni ostatní uživatelé uvidí NULL.

  • Sloupce definic nalezené v následujících zobrazeních katalogu:

    • sys.all_sql_modules
    • sys.server_sql_modules
    • sys.default_constraints
    • sys.numbered_procedures
    • sys.sql_modules
    • sys.check_constraints
    • sys.computed_columns
  • Sloupec ctext v zobrazení kompatibility syscomments.

  • Výstup sp_helptext procedury.

  • Následující sloupce v zobrazení schématu informací:

    • 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()

  • Hodnota uložená ve sloupci password_hash sys.sql_logins. Uživatel, který nemá oprávnění CONTROL SERVER nebo počínaje SQL Serverem 2022 oprávnění VIEW ANY CRYPTOGRAPHICALLY SECURED DEFINITION, uvidí NULL hodnotu v tomto sloupci.

Poznámka

Definice SQL předdefinovaných systémových procedur a funkcí jsou veřejně viditelné prostřednictvím zobrazení katalogu sys.system_sql_modules, sp_helptext uložené procedury a funkce OBJECT_DEFINITION().

Poznámka

Služba Azure Synapse Analytics nepodporuje systémovou uloženou proceduru sp_helptext. Místo toho použijte zobrazení katalogu objektů sys.sql_modules.

Obecné principy viditelnosti metadat

Tady jsou některé obecné principy, které je potřeba zvážit v souvislosti s viditelností metadat:

  • Pevné implicitní oprávnění rolí

  • Rozsah oprávnění

  • Přednost DENY

  • Viditelnost dílčích metadat

Pevné role a implicitní oprávnění

Metadata, ke kterým mají pevné role přístup, závisí na odpovídajících implicitních oprávněních.

Rozsah oprávnění

Oprávnění v jednom oboru znamenají možnost zobrazit metadata v daném oboru a ve všech uzavřených oborech. Například oprávnění SELECT u schématu znamená, že příjemce má oprávnění SELECT u všech zabezpečitelných objektů, které toto schéma obsahuje. Udělení oprávnění SELECT schématu proto umožňuje uživateli zobrazit metadata schématu a také všechny tabulky, zobrazení, funkce, procedury, fronty, synonyma, typy a kolekce schémat XML v něm. Další informace o rozsazích naleznete v tématu Hierarchie oprávnění (Databázový stroj).

Poznámka

Oprávnění UNMASK nemá vliv na viditelnost metadat: udělení UNMASK nezveřejní žádná metadata. UNMASK musí být vždy doprovázeno oprávněním SELECT, aby mohl mít jakýkoli účinek. Příklad: Udělení UNMASK v oboru databáze a udělení SELECT u jednotlivých tabulek bude mít výsledek, že uživatel uvidí jenom metadata jednotlivé tabulky, ze které může vybrat, a ne žádné jiné.

Přednost DENY

Odepření má obvykle přednost před jinými oprávněními. Pokud je například uživateli databáze uděleno oprávnění EXECUTE na schéma, ale bylo mu odepřeno oprávnění EXECUTE na uložené proceduře v tomto schématu, uživatel nemůže zobrazit metadata pro tuto uloženou proceduru.

Kromě toho, pokud je uživatel odepřen EXECUTE oprávnění ke schématu, ale byl udělen EXECUTE oprávnění pro uloženou proceduru v daném schématu, uživatel nemůže zobrazit metadata pro tuto uloženou proceduru.

Pokud byl například uživateli uděleno i odepřeno oprávnění EXECUTE na uložené proceduře, což je možné prostřednictvím různých členství v rolích, odepřít má přednost a uživatel nemůže zobrazit metadata uložené procedury.

Viditelnost dílčích metadat

Viditelnost dílčích součástí, jako jsou indexy, omezení kontroly a triggery, jsou určena oprávněními nadřazeného objektu. Tyto dílčí podkomponenty nemají udělená oprávnění. Pokud například uživateli bylo uděleno určité oprávnění k tabulce, může uživatel zobrazit metadata pro tabulky, sloupce, indexy, kontrolní omezení, triggery a další takové dílčí komponenty. Dalším příkladem je udělení SELECT pouze u jednoho sloupce dané tabulky: tím uživateli umožníte zobrazit metadata celé tabulky včetně všech sloupců. Jedním ze způsobů, jak si to představit, je to, že oprávnění VIEW DEFINITION funguje jenom na úrovni entity (v tomto případě tabulka) a není k dispozici pro seznamy dílčích entit (například sloupce nebo výrazy zabezpečení).

Toto chování ukazuje následující kód:

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 the table itself
REVERT;
GO

DROP TABLE t1
DROP USER testUser

Metadata, která jsou přístupná všem uživatelům databáze

Některá metadata musí být přístupná všem uživatelům v konkrétní databázi. Například skupiny souborů nemají udělená oprávnění; uživatel proto nemůže být udělen oprávnění k zobrazení metadat skupiny souborů. Každý uživatel, který může vytvořit tabulku, musí mít přístup k metadatům skupiny souborů, aby mohl používat klauzule ON filegroup nebo TEXTIMAGE_ON filegroup skupiny a příkazu CREATE TABLE.

Metadata vrácená funkcemi DB_ID() a DB_NAME() jsou viditelná pro všechny uživatele.

Toto je seznam zobrazení katalogu, která jsou viditelná pro roli veřejné.

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

systém.zprávy

sys.configurations

sys.type_assembly_usages

sys.column_type_usages

Viz také

GRANT (Transact-SQL)
Odepřít (Transact-SQL)
ODVOLÁNÍ (Transact-SQL)
EXECUTE AS Clause (Transact-SQL)
zobrazení katalogu (Transact-SQL)
Pohledy na kompatibilitu (Transact-SQL)