Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Synligheten för metadata är begränsad till skyddsbara data som en användare antingen äger eller som användaren har beviljats viss behörighet för.
Följande fråga returnerar till exempel en rad om användaren beviljar en behörighet, till exempel SELECT eller INSERT i tabellen myTable.
SELECT name, object_id
FROM sys.tables
WHERE name = N'myTable';
GO
Men om användaren inte har någon behörighet för myTablereturnerar frågan en tom resultatuppsättning.
Omfång och påverkan av konfiguration av metadatasynlighet
Konfiguration av metadatasynlighet gäller endast för följande skyddsbara objekt:
- Katalogvyer
- Metadata som exponerar inbyggda funktioner
- Kompatibilitetsvyer
- Lagrade procedurer för databasmotor
sp_help - Informationsschemavyer
- Utökade egenskaper
Konfigurationen av metadatasynlighet gäller inte för följande skyddsbara värden:
- Systemtabeller för loggöverföring
- Systemtabeller för databasunderhållsplan
- Systemtabeller för replikering
- SQL Server Agent-systemtabeller
- Säkerhetskopiera systemtabeller
- Lagrade procedurer för replikering och SQL Server Agent
sp_help
Begränsad metadatatillgänglighet innebär följande:
- Frågor om systemvyer kanske bara returnerar en delmängd rader, eller ibland en tom resultatuppsättning.
- Metadataemitterande inbyggda funktioner som OBJECTPROPERTYEX kan returnera
NULL. - Databasmotorn
sp_helplagrade procedurer kan möjligen bara returnera en delmängd rader ellerNULL. - Därför bryts program som förutsätter åtkomst till offentliga metadata.
SQL-moduler, till exempel lagrade procedurer och utlösare, körs under anroparens säkerhetskontext och har därför begränsad metadatatillgänglighet. I följande kod returneras till exempel en tom resultatuppsättning när den lagrade proceduren försöker komma åt metadata för tabellen myTable där anroparen inte har några rättigheter. I tidigare versioner av SQL Server returneras en rad.
CREATE PROCEDURE assumes_caller_can_access_metadata
BEGIN
SELECT name, object_id
FROM sys.objects
WHERE name = N'myTable';
END;
GO
Om du vill tillåta anropare att visa metadata kan du ge anroparna VIEW DEFINITION behörighet, eller i SQL Server 2022 (16.x) och senare versioner, antingen VIEW SECURITY DEFINITION eller VIEW PERFORMANCE DEFINITION på lämplig omfattning: objektnivå, databasnivå eller servernivå. Om anroparen därför har VIEW DEFINITION behörighet myTablei föregående exempel returnerar den lagrade proceduren en rad. Mer information finns i BEVILJA och BEVILJA databasbehörigheter.
Du kan också ändra den lagrade proceduren så att den körs under ägarens autentiseringsuppgifter. När procedurägaren och tabellägaren är samma ägare gäller ägarskapslänkning och säkerhetskontexten för procedurens ägare ger åtkomst till metadata för myTable. I det här scenariot returnerar följande kod en rad metadata till anroparen.
Not
I följande exempel används sys.objects katalogvy i stället för sys.sysobjects kompatibilitetsvy.
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
Not
Du kan använda EXECUTE AS för att tillfälligt växla till anroparens säkerhetskontext. Mer information finns i KÖR SOM.
Fördelar och gränser för konfiguration av metadatasynlighet
Konfiguration av metadatasynlighet kan spela en viktig roll i din övergripande säkerhetsplan. Det finns dock fall där en kompetent och bestämd användare kan tvinga fram avslöjande av vissa metadata. Vi rekommenderar att du distribuerar metadatabehörigheter som ett av många djupgående skydd.
Det är teoretiskt möjligt att framtvinga utsläpp av metadata i felmeddelanden genom att ändra ordningen på predikatutvärdering i frågor. Risken för sådana utvärderings- och felattacker är inte specifik för SQL Server. Det är underförstått av de associativa och kommutativa transformeringar som tillåts i relationsalgebra. Du kan minska den här risken genom att begränsa den information som returneras i felmeddelanden. Om du vill begränsa synligheten för metadata ytterligare på det här sättet kan du starta servern med spårningsflagga 3625. Den här spårningsflaggan begränsar mängden information som visas i felmeddelanden. Detta bidrar i sin tur till att förhindra framtvingade avslöjanden. Kompromissen är att felmeddelanden är terse och kan vara svåra att använda i felsökningssyfte. Mer information finns i Startalternativ för databasmotortjänsten och spårningsflaggor.
Följande metadata är inte föremål för påtvingat avslöjande:
Värdet som lagras i kolumnen
provider_stringisys.servers. En användare som inte harALTER ANY LINKED SERVERbehörighet ser ettNULLvärde i den här kolumnen.Källdefinition för ett användardefinierat objekt, till exempel en lagrad procedur eller utlösare. Källkoden visas bara när något av följande villkor är sant:
Användaren har
VIEW DEFINITIONbehörighet för objektet.Användaren har inte nekats
VIEW DEFINITIONbehörighet för objektet och harCONTROL,ALTERellerTAKE OWNERSHIPbehörighet för objektet. Alla andra användare serNULL.
Definitionskolumnerna som finns i följande katalogvyer:
sys.all_sql_modulessys.server_sql_modulessys.default_constraintssys.numbered_proceduressys.sql_modulessys.check_constraintssys.computed_columns
Kolumnen
ctexti kompatibilitetsvynsyscomments.Utdata från
sp_helptext-proceduren.Följande kolumner i informationsschemavyerna:
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()funktionVärdet som lagras i kolumnen
password_hashisys.sql_logins. En användare som inte harCONTROL SERVER, eller i SQL Server 2022 (16.x) och senare versioner, ser behörighetenVIEW ANY CRYPTOGRAPHICALLY SECURED DEFINITIONettNULLvärde i den här kolumnen.
SQL-definitionerna av inbyggda systemprocedurer och funktioner visas offentligt via sys.system_sql_modules katalogvyn, den sp_helptext lagrade proceduren och OBJECT_DEFINITION() funktionen.
Not
Den system lagrade proceduren sp_helptext stöds inte i Azure Synapse Analytics. Använd i stället sys.sql_modules objektkatalogvyn.
Allmänna principer för synlighet av metadata
Följande är några allmänna principer att tänka på när det gäller metadatasynlighet:
- Implicita behörigheter för fasta roller
- Behörigheternas omfattning
- Prioritet för
DENY - Synlighet för underkomponentmetadata
Fasta roller och implicita behörigheter
Metadata som kan nås av fasta roller beror på deras motsvarande implicita behörigheter.
Behörigheternas omfattning
Behörigheter i ett omfång innebär möjligheten att se metadata i det omfånget och alla inneslutna omfång. Behörighet för ett schema innebär till exempel SELECT att beviljaren har SELECT behörighet för alla skyddsbara objekt som ingår i schemat. Genom att SELECT bevilja behörighet för ett schema kan en användare därför se metadata för schemat och även alla tabeller, vyer, funktioner, procedurer, köer, synonymer, typer och XML-schemasamlingar i det. Mer information om omfång finns i Behörighetshierarki (databasmotor).
Not
Behörigheten UNMASK påverkar inte metadatasynlighet: att UNMASK bevilja ensamt avslöjar inga metadata.
UNMASK måste alltid åtföljas av en SELECT behörighet att ha någon effekt. Exempel: Beviljande av UNMASK databasomfång och beviljande SELECT i en enskild tabell leder till att användaren bara kan se metadata för den enskilda tabell som de kan välja från, inte några andra.
Prioritet för DENY
DENY har vanligtvis företräde framför andra behörigheter. Om en databasanvändare till exempel beviljas EXECUTE behörighet för ett schema men har nekats EXECUTE behörighet för en lagrad procedur i schemat kan användaren inte visa metadata för den lagrade proceduren.
Om en användare nekas EXECUTE behörighet för ett schema men har beviljats EXECUTE behörighet för en lagrad procedur i schemat kan användaren inte visa metadata för den lagrade proceduren.
Om en användare till exempel har beviljats och nekats EXECUTE behörighet för en lagrad procedur, vilket är möjligt genom dina olika rollmedlemskap, DENY har företräde och användaren inte kan visa metadata för den lagrade proceduren.
Synlighet för underkomponentmetadata
Synligheten för underkomponenter, till exempel index, kontrollbegränsningar och utlösare, bestäms av behörigheter för den överordnade. Dessa underkomponenter har inte behörigheter som kan beviljas. Om en användare till exempel har beviljats viss behörighet i en tabell kan användaren visa metadata för tabeller, kolumner, index, kontrollbegränsningar, utlösare och andra sådana underkomponenter. Ett annat exempel är att SELECT endast bevilja en enskild kolumn i en viss tabell: detta gör att beviljare kan visa metadata för hela tabellen, inklusive alla kolumner. Ett sätt att tänka på det är att behörigheten VIEW DEFINITION endast fungerar på entitetsnivå (tabellen i det här fallet) och inte är tillgänglig för underdelslistor (till exempel kolumn- eller säkerhetsuttryck).
Följande kod visar det här beteendet:
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 som är tillgängliga för alla databasanvändare
Vissa metadata måste vara tillgängliga för alla användare i en specifik databas. Filgrupper har till exempel inte delegeringsbara behörigheter. Därför kan en användare inte beviljas behörighet att visa metadata för en filgrupp. Alla användare som kan skapa en tabell måste dock kunna komma åt filgruppsmetadata för att använda instruktionens ON <filegroup>TEXTIMAGE_ON <filegroup> eller CREATE TABLE -satser.
Metadata som returneras av DB_ID() funktionerna och DB_NAME() är synliga för alla användare.
Det här är en lista över de katalogvyer som är synliga för den offentliga rollen.
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