Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
databáze SQL v Microsoft Fabric
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í.
Například následující dotaz vrátí řádek, pokud uživatel udělí 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í 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
- Uložené procedury databázového stroje
sp_help - Zobrazení schématu informací
- Rozšířené vlastnosti
Konfigurace viditelnosti metadat se nevztahuje na následující položky 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
- Uložené procedury replikace a agenta
sp_helpSQL Serveru
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, které generují metadata, jako je OBJECTPROPERTYEX, mohou vracet
NULL. - Databázový stroj
sp_helpuložených procedur může vracet pouze podmnožinu řádků neboNULL. - V důsledku toho aplikace, které předpokládají, že přístup k veřejným metadatům se 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 volajícím VIEW DEFINITION udělit oprávnění, nebo v SQL Serveru 2022 (16.x) a novějších verzích, a to buď VIEW SECURITY DEFINITION nebo VIEW PERFORMANCE DEFINITION v příslušném oboru: na úrovni objektu, na úrovni databáze nebo na úrovni serveru. Proto v předchozím příkladu, pokud volající má VIEW DEFINITION oprávnění k myTable, uložená procedura vrátí řádek. Další informace naleznete v tématu GRANT a Oprávnění databáze GRANT.
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
Můžete použít EXECUTE AS k dočasnému přepnutí do kontextu zabezpečení volajícího. Další informace naleznete v tématu EXECUTE AS.
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. Vyplývá to 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 jsou terse a může být obtížné je použít pro účely ladění. Další informace naleznete v tématu Možnosti spuštění služby databázového systému a trasovací příznaky.
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 SERVERoprávnění, uvidíNULLhodnotu 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 podmínek:
Uživatel má
VIEW DEFINITIONk objektu oprávnění.Uživatel nebyl odepřen
VIEW DEFINITIONoprávnění k objektu a máCONTROLALTER, neboTAKE OWNERSHIPoprávnění k objektu. Všichni ostatní uživatelé vidíNULL.
Sloupce definic nalezené v následujících zobrazeních katalogu:
sys.all_sql_modulessys.server_sql_modulessys.default_constraintssys.numbered_proceduressys.sql_modulessys.check_constraintssys.computed_columns
Sloupec
ctextv zobrazení kompatibilitysyscomments.Výstup
sp_helptextprocedury.Následující sloupce v zobrazení schématu informací:
INFORMATION_SCHEMA.CHECK_CONSTRAINTS.CHECK_CLAUSEINFORMATION_SCHEMA.DOMAINS.DOMAIN_DEFAULTINFORMATION_SCHEMA.ROUTINES.ROUTINE_DEFINITIONINFORMATION_SCHEMA.COLUMNS.COLUMN_DEFAULTINFORMATION_SCHEMA.ROUTINE_COLUMNS.COLUMN_DEFAULTINFORMATION_SCHEMA.VIEWS.VIEW_DEFINITION
OBJECT_DEFINITION()funkceHodnota uložená ve sloupci
password_hashsys.sql_logins. Uživatel, který nemáCONTROL SERVER, nebo v SQL Serveru 2022 (16.x) a novějších verzích oprávněníVIEW ANY CRYPTOGRAPHICALLY SECURED DEFINITION, vidíNULLhodnotu v tomto sloupci.
Definice SQL předdefinovaných systémových procedur a funkcí jsou veřejně viditelné prostřednictvím sys.system_sql_modules zobrazení katalogu, sp_helptext uložené procedury a OBJECT_DEFINITION() funkce.
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ě stanovené 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í ke schématu znamená, SELECT že příjemce SELECT má oprávnění ke všem zabezpečitelným objektům obsaženým v tomto schématu. Udělení SELECT oprávnění 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 samotného nezveřejňuje žádná metadata.
UNMASK vždy musí být doprovázeno oprávněním SELECT , aby se to projevilo. Příklad: Udělení UNMASK oboru databáze a udělení SELECT pro jednotlivé tabulky má výsledek, že uživatel může zobrazit pouze metadata jednotlivých tabulek, ze kterých může vybrat, a ne žádné jiné.
Přednost DENY
DENY obvykle má přednost před jinými oprávněními. Pokud je například uživateli databáze uděleno EXECUTE oprávnění ke schématu, ale bylo mu EXECUTE odepřeno oprávnění k uložené proceduře v tomto schématu, uživatel nemůže zobrazit metadata pro tuto uloženou proceduru.
Pokud je navíc uživateli odepřeno EXECUTE oprávnění ke schématu, ale bylo mu uděleno EXECUTE oprávnění k uložené proceduře v daném schématu, uživatel nemůže zobrazit metadata pro tuto uloženou proceduru.
Pokud je uživateli uděleno a odepřeno EXECUTE oprávnění k uložené proceduře, což je možné prostřednictvím různých členství v rolích, DENY 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 na jednotlivý sloupec dané tabulky: toto umožňuje příjemci zobrazit metadata celé tabulky, včetně všech sloupců. Jedním ze způsobů, jak si to představit, je, že VIEW DEFINITION oprávnění funguje jenom na úrovni entity (v tomto případě tabulka) a není k dispozici pro seznamy podsítě (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žít ON <filegroup>TEXTIMAGE_ON <filegroup> položky CREATE TABLE příkazu.
Metadata vrácené funkcemi DB_ID() a DB_NAME() je viditelné pro všechny uživatele.
Toto je seznam zobrazení katalogu, která jsou viditelná pro roli veřejné.
sys.allocation_unitssys.column_type_usagessys.configurationssys.data_spacessys.database_filessys.destination_data_spacessys.filegroupssys.messagessys.parameter_type_usagessys.partition_functionssys.partition_range_valuessys.partition_schemessys.partitionssys.schemassys.sql_dependenciessys.type_assembly_usages