Delen via


Zichtbaarheidsconfiguratie voor metagegevens

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

De zichtbaarheid van metagegevens is beperkt tot beveiligbare items waarvan een gebruiker eigenaar is of waarvoor de gebruiker een bepaalde machtiging heeft gekregen.

De volgende query retourneert bijvoorbeeld een rij als de gebruiker een machtiging verleent, zoals SELECT of INSERT in de tabel myTable.

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

Als de gebruiker echter geen machtiging myTableheeft, retourneert de query een lege resultatenset.

Bereik en impact van de zichtbaarheidsconfiguratie van metagegevens

De zichtbaarheidsconfiguratie van metagegevens is alleen van toepassing op de volgende beveiligbare onderdelen:

  • Catalogusweergaven
  • Metagegevens met ingebouwde functies
  • Compatibiliteitsweergaven
  • Opgeslagen procedures voor database-engine sp_help
  • Informatieschemaweergaven
  • Uitgebreide eigenschappen

De zichtbaarheidsconfiguratie van metagegevens is niet van toepassing op de volgende beveiligbare onderdelen:

  • Systeemtabellen voor logboekverzending
  • Systeemtabellen voor databaseonderhoudsplannen
  • Replicatiesysteemtabellen
  • Sql Server Agent-systeemtabellen
  • Back-upsysteemtabellen
  • Opgeslagen procedures voor replicatie en SQL Server Agent sp_help

Beperkte toegankelijkheid van metagegevens betekent het volgende:

  • Query's in systeemweergaven retourneren mogelijk alleen een subset rijen of soms een lege resultatenset.
  • Het verzenden van metagegevens, ingebouwde functies zoals OBJECTPROPERTYEX kan retourneren NULL.
  • De opgeslagen procedures van de database-engine sp_help kunnen alleen een subset rijen retourneren, of NULL.
  • Als gevolg hiervan worden toepassingen die uitgaan van toegang tot openbare metagegevens verbroken.

SQL-modules, zoals opgeslagen procedures en triggers, worden uitgevoerd onder de beveiligingscontext van de aanroeper en hebben daarom beperkte toegankelijkheid van metagegevens. In de volgende code wordt bijvoorbeeld een lege resultatenset geretourneerd wanneer de opgeslagen procedure probeert toegang te krijgen tot metagegevens voor de tabel myTable waarvoor de aanroeper geen rechten heeft. In eerdere versies van SQL Server wordt een rij geretourneerd.

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

Als u wilt toestaan dat bellers metagegevens kunnen bekijken, kunt u de bellers machtigen VIEW DEFINITION of in SQL Server 2022 (16.x) en latere versies, VIEW SECURITY DEFINITION of VIEW PERFORMANCE DEFINITION op een geschikt bereik: objectniveau, databaseniveau of serverniveau. Als de aanroeper in het vorige voorbeeld machtigingen heeft VIEW DEFINITIONmyTable, retourneert de opgeslagen procedure daarom een rij. Zie MACHTIGINGEN VERLENEN en VERLENEN voor meer informatie.

U kunt de opgeslagen procedure ook wijzigen, zodat deze wordt uitgevoerd onder de referenties van de eigenaar. Wanneer de eigenaar van de procedure en de eigenaar van de tabel dezelfde eigenaar zijn, is de eigendomsketen van toepassing en is de beveiligingscontext van de eigenaar van de procedure toegang tot de metagegevens mogelijk.myTable In dit scenario retourneert de volgende code een rij met metagegevens naar de aanroeper.

Opmerking

In het volgende voorbeeld wordt de catalogusweergave sys.objects gebruikt in plaats van de compatibiliteitsweergave sys.sysobjects .

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

Opmerking

U kunt EXECUTE AS tijdelijk overschakelen naar de beveiligingscontext van de beller. Zie EXECUTE AS voor meer informatie.

Voordelen en limieten van de zichtbaarheidsconfiguratie van metagegevens

De zichtbaarheidsconfiguratie van metagegevens kan een belangrijke rol spelen in uw algehele beveiligingsplan. Er zijn echter gevallen waarin een ervaren en vastberaden gebruiker de openbaarmaking van bepaalde metagegevens kan afdwingen. We raden u aan metagegevensmachtigingen te implementeren als een van de vele diepgaande verdedigingsrechten.

Het is theoretisch mogelijk om de emissie van metagegevens in foutberichten af te dwingen door de volgorde van predicaatevaluatie in query's te bewerken. De mogelijkheid van dergelijke trial-and-error-aanvallen is niet specifiek voor SQL Server. Het wordt geïmpliceerd door de associatieve en commutatieve transformaties die zijn toegestaan in relationele algebra. U kunt dit risico beperken door de informatie te beperken die wordt geretourneerd in foutberichten. Als u de zichtbaarheid van metagegevens op deze manier verder wilt beperken, kunt u de server starten met traceringsvlag 3625. Deze traceringsvlag beperkt de hoeveelheid informatie die wordt weergegeven in foutberichten. Op zijn beurt helpt dit om gedwongen openbaarmakingen te voorkomen. Het nadeel is dat foutberichten terse zijn en mogelijk moeilijk te gebruiken zijn voor foutopsporingsdoeleinden. Zie opstartopties en traceringsvlagmen voor Database Engine Service voor meer informatie.

De volgende metagegevens zijn niet onderworpen aan geforceerde openbaarmaking:

  • De waarde die is opgeslagen in de provider_string kolom van sys.servers. Een gebruiker die geen machtiging heeft ALTER ANY LINKED SERVER , ziet een NULL waarde in deze kolom.

  • Brondefinitie van een door de gebruiker gedefinieerd object, zoals een opgeslagen procedure of trigger. De broncode is alleen zichtbaar wanneer aan een van de volgende voorwaarden wordt voldaan:

    • De gebruiker heeft VIEW DEFINITION machtigingen voor het object.

    • De gebruiker is niet geweigerd VIEW DEFINITION voor het object en heeft CONTROLALTER, of TAKE OWNERSHIP machtigingen voor het object. Alle andere gebruikers zien NULL.

  • De definitiekolommen in de volgende catalogusweergaven:

    • sys.all_sql_modules
    • sys.server_sql_modules
    • sys.default_constraints
    • sys.numbered_procedures
    • sys.sql_modules
    • sys.check_constraints
    • sys.computed_columns
  • De ctext kolom in de syscomments compatibiliteitsweergave.

  • De uitvoer van de sp_helptext procedure.

  • De volgende kolommen in de informatieschemaweergaven:

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

  • De waarde die is opgeslagen in de password_hash kolom van sys.sql_logins. Een gebruiker die geen of in SQL Server 2022 (16.x) en latere versies heeft CONTROL SERVER, ziet de VIEW ANY CRYPTOGRAPHICALLY SECURED DEFINITION machtiging een NULL waarde in deze kolom.

De SQL-definities van ingebouwde systeemprocedures en -functies zijn openbaar zichtbaar via de sys.system_sql_modules catalogusweergave, de sp_helptext opgeslagen procedure en de OBJECT_DEFINITION() functie.

Opmerking

De opgeslagen systeemprocedure sp_helptext wordt niet ondersteund in Azure Synapse Analytics. Gebruik in plaats daarvan de weergave sys.sql_modules objectcatalogus.

Algemene principes van zichtbaarheid van metagegevens

Hier volgen enkele algemene principes die u moet overwegen met betrekking tot zichtbaarheid van metagegevens:

  • Impliciete rollenmachtigingen opgelost
  • Bereik van machtigingen
  • Prioriteit van DENY
  • Zichtbaarheid van metagegevens van subonderdelen

Vaste rollen en impliciete machtigingen

Metagegevens die toegankelijk zijn voor vaste rollen, zijn afhankelijk van de bijbehorende impliciete machtigingen.

Bereik van machtigingen

Machtigingen voor één bereik impliceren de mogelijkheid om metagegevens in dat bereik en in alle ingesloten bereiken te zien. De machtiging voor een schema impliceert bijvoorbeeld SELECT dat de grantee machtigingen heeft SELECT voor alle beveiligbare objecten die zijn opgenomen in dat schema. Door het verlenen van SELECT machtigingen voor een schema kan een gebruiker daarom de metagegevens van het schema zien en ook alle tabellen, weergaven, functies, procedures, wachtrijen, synoniemen, typen en XML-schemaverzamelingen erin. Zie Machtigingenhiërarchie (database-engine) voor meer informatie over bereiken.

Opmerking

De UNMASK machtiging heeft geen invloed op zichtbaarheid van metagegevens: alleen verlenen UNMASK geeft geen metagegevens weer. UNMASK moet altijd vergezeld gaan van een SELECT machtiging om enig effect te hebben. Voorbeeld: het verlenen UNMASK van databasebereik en het verlenen van een SELECT afzonderlijke tabel heeft het resultaat dat de gebruiker alleen de metagegevens van de afzonderlijke tabel kan zien waaruit ze kunnen selecteren, niet andere.

Prioriteit van DENY

DENY heeft doorgaans voorrang op andere machtigingen. Als een databasegebruiker bijvoorbeeld toestemming krijgt EXECUTE voor een schema, maar de machtiging is geweigerd EXECUTE voor een opgeslagen procedure in dat schema, kan de gebruiker de metagegevens voor die opgeslagen procedure niet bekijken.

Bovendien kan de gebruiker de metagegevens voor die opgeslagen procedure niet bekijken als een gebruiker is geweigerd EXECUTE voor een schema, maar is gemachtigd EXECUTE voor een opgeslagen procedure in dat schema.

Als een gebruiker bijvoorbeeld toestemming heeft gekregen en geweigerd EXECUTE voor een opgeslagen procedure, wat mogelijk is via uw verschillende rollidmaatschappen, DENY heeft voorrang en kan de gebruiker de metagegevens van de opgeslagen procedure niet bekijken.

Zichtbaarheid van metagegevens van subonderdelen

De zichtbaarheid van subonderdelen, zoals indexen, controlebeperkingen en triggers, wordt bepaald door machtigingen voor het bovenliggende item. Deze subonderdelen hebben geen toekenningsmachtigingen. Als een gebruiker bijvoorbeeld een machtiging voor een tabel heeft gekregen, kan de gebruiker de metagegevens voor de tabellen, kolommen, indexen bekijken, beperkingen, triggers en andere subonderdelen controleren. Een ander voorbeeld is het verlenen SELECT van alleen een afzonderlijke kolom van een bepaalde tabel: hiermee kan de toekenning de metagegevens van de hele tabel bekijken, inclusief alle kolommen. Een manier om dit te bedenken, is dat de VIEW DEFINITION machtiging alleen werkt op entiteitsniveau (de tabel in dit geval) en niet beschikbaar is voor subentiteitslijsten (zoals kolom- of beveiligingsexpressies).

De volgende code laat dit gedrag zien:

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;

Metagegevens die toegankelijk zijn voor alle databasegebruikers

Sommige metagegevens moeten toegankelijk zijn voor alle gebruikers in een specifieke database. Bestandsgroepen hebben bijvoorbeeld geen verleende machtigingen; Daarom kan een gebruiker geen machtiging krijgen om de metagegevens van een bestandsgroep weer te geven. Elke gebruiker die een tabel kan maken, moet echter toegang hebben tot metagegevens van de bestandsgroep om de ON <filegroup> of TEXTIMAGE_ON <filegroup> componenten van de CREATE TABLE instructie te kunnen gebruiken.

De metagegevens die door de DB_ID() en DB_NAME() functies worden geretourneerd, zijn zichtbaar voor alle gebruikers.

Dit is een lijst met de catalogusweergaven die zichtbaar zijn voor de openbare rol.

  • 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