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ů neboNULL
.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_string
sys.servers
. Uživatel, který nemá ALTER ANY LINKED SERVER oprávnění, uvidí hodnotuNULL
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í kompatibilitysyscomments
.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
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)
EXECUTE AS Clause (Transact-SQL)
zobrazení katalogu (Transact-SQL)
Pohledy na kompatibilitu (Transact-SQL)