Dela via


Konfiguration av metadatasynlighet

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics 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_help lagrade procedurer kan möjligen bara returnera en delmängd rader eller NULL.
  • 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_string i sys.servers. En användare som inte har ALTER ANY LINKED SERVER behörighet ser ett NULL vä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 DEFINITION behörighet för objektet.

    • Användaren har inte nekats VIEW DEFINITION behörighet för objektet och har CONTROL, ALTEReller TAKE OWNERSHIP behörighet för objektet. Alla andra användare ser NULL.

  • Definitionskolumnerna som finns i följande katalogvyer:

    • sys.all_sql_modules
    • sys.server_sql_modules
    • sys.default_constraints
    • sys.numbered_procedures
    • sys.sql_modules
    • sys.check_constraints
    • sys.computed_columns
  • Kolumnen ctext i kompatibilitetsvyn syscomments.

  • Utdata från sp_helptext-proceduren.

  • Följande kolumner i informationsschemavyerna:

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

  • Värdet som lagras i kolumnen password_hash i sys.sql_logins. En användare som inte har CONTROL SERVER, eller i SQL Server 2022 (16.x) och senare versioner, ser behörigheten VIEW ANY CRYPTOGRAPHICALLY SECURED DEFINITION ett NULL vä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_units
  • sys.column_type_usages
  • sys.configurations
  • sys.data_spaces
  • sys.database_files
  • sys.destination_data_spaces
  • sys.filegroups
  • sys.messages
  • sys.parameter_type_usages
  • sys.partition_functions
  • sys.partition_range_values
  • sys.partition_schemes
  • sys.partitions
  • sys.schemas
  • sys.sql_dependencies
  • sys.type_assembly_usages