Megosztás a következőn keresztül:


Metaadatok láthatóságának konfigurálása

Vonatkozik a következőkre:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalitikai Platform System (PDW)SQL adatbázis a Microsoft Fabric-ben

A metaadatok láthatósága olyan biztonságos adatokra korlátozódik, amelyek tulajdonosa egy felhasználó, vagy amelyeken a felhasználó engedélyt kapott.

Az alábbi lekérdezés például visszaad egy sort, ha a felhasználó egy engedélyt ad, például SELECT vagy INSERT, a táblán myTable.

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

Ha azonban a felhasználó nem rendelkezik engedéllyel myTable, a lekérdezés üres eredményhalmazt ad vissza.

A metaadatok láthatósági konfigurációjának hatóköre és hatása

A metaadatok láthatósági konfigurációja csak a következő biztonságos eszközökre vonatkozik:

  • Katalógusnézetek
  • Beépített függvényeket feltáró metaadatok
  • Kompatibilitási nézetek
  • Adatbázismotor sp_help tárolt eljárásai
  • Információs sémanézetek
  • Kiterjesztett tulajdonságok

A metaadatok láthatósági konfigurációja nem vonatkozik a következő biztonságos eszközökre:

  • Szállítási rendszertáblák naplózása
  • Adatbázis-karbantartási terv rendszertáblái
  • Replikációs rendszertáblák
  • SQL Server Agent rendszertáblák
  • Rendszertáblák biztonsági mentése
  • Replikációs és SQL Server-ügynök sp_help által tárolt eljárások

A metaadatok korlátozott hozzáférhetősége a következőket jelenti:

  • Előfordulhat, hogy a rendszernézetek lekérdezései csak a sorok egy részhalmazát, vagy néha üres eredményhalmazt ad vissza.
  • A metaadatokat kibocsátó beépített függvények, mint például az OBJECTPROPERTYEX, visszaadhatnak NULL.
  • Az adatbázismotor sp_help tárolt eljárások csak a sorok egy részhalmazát vagy NULLadhatnak vissza.
  • Ennek eredményeképpen a nyilvános metaadatok hozzáférését feltételező alkalmazások megszakadnak.

Az SQL-modulok, például a tárolt eljárások és az eseményindítók a hívó biztonsági környezetében futnak, ezért korlátozott metaadat-hozzáféréssel rendelkeznek. Ha például a következő kódban a tárolt eljárás megpróbálja elérni annak a táblának a metaadatait, myTable amelyen a hívó nem rendelkezik jogosultságokkal, a rendszer üres eredményhalmazt ad vissza. Az SQL Server korábbi kiadásaiban a rendszer egy sort ad vissza.

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

Ha engedélyezni szeretné a hívók számára a metaadatok megtekintését, engedélyt adhat a hívóknak VIEW DEFINITION , vagy az SQL Server 2022 (16.x) és újabb verzióiban, vagy VIEW SECURITY DEFINITIONVIEW PERFORMANCE DEFINITION egy megfelelő hatókörben: objektumszinten, adatbázisszinten vagy kiszolgálószinten. Ezért az előző példában, ha a hívó rendelkezik VIEW DEFINITION engedéllyel myTable, a tárolt eljárás egy sort ad vissza. További információ: GRANT és GRANT adatbázisengedélyek.

A tárolt eljárást úgy is módosíthatja, hogy az a tulajdonos hitelesítő adatai alapján legyen végrehajtva. Ha az eljárás tulajdonosa és a táblatulajdonos ugyanaz a tulajdonos, a tulajdonjogi láncolás érvényes, és az eljárástulajdonos biztonsági környezete lehetővé teszi a myTablemetaadatainak elérését. Ebben a forgatókönyvben a következő kód egy metaadatsort ad vissza a hívónak.

Jegyzet

Az alábbi példa a sys.objects katalógusnézetet használja a sys.sysobjects kompatibilitási nézet helyett.

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

Jegyzet

A EXECUTE AS segítségével ideiglenesen átválthat a hívó biztonsági környezetére. További információ: EXECUTE AS.

A metaadatok láthatósági konfigurációjának előnyei és korlátai

A metaadatok láthatóságának konfigurálása fontos szerepet játszhat az általános biztonsági tervben. Vannak azonban olyan esetek, amikor egy képzett és határozott felhasználó kényszerítheti bizonyos metaadatok közzétételét. Javasoljuk, hogy a metaadat-engedélyeket a számos részletes védelem egyikeként telepítse.

Elméletileg kényszeríthető a metaadatok kibocsátása a hibaüzenetekben a predikátumok kiértékelési sorrendjének módosításával a lekérdezésekben. Az ilyen próba- és hibatámadások lehetősége nem az SQL Serverre jellemző. Ezt a relációs algebra által megengedett asszociatív és ingmutatív transzformációk sugallják. Ezt a kockázatot a hibaüzenetekben visszaadott információk korlátozásával csökkentheti. A metaadatok láthatóságának további korlátozásához indítsa el a kiszolgálót a 3625-ös nyomkövetési jelzővel. Ez a nyomkövetési jelző korlátozza a hibaüzenetekben megjelenő információk mennyiségét. Ez viszont segít megelőzni a kényszerített közzétételeket. A kompromisszum az, hogy a hibaüzenetek tömörek, és lehet, hogy nehéz őket hibakeresési célokra használni. További információ: Database Engine Service indítási beállítások és nyomkövetési jelzők.

A következő metaadatok nem tartoznak kényszerített közzététel hatálya alá:

  • A provider_stringsys.servers oszlopában tárolt érték. Az engedéllyel nem rendelkező ALTER ANY LINKED SERVER felhasználó egy NULL értéket lát ebben az oszlopban.

  • Felhasználó által definiált objektumok forrásdefiníciója, például tárolt eljárás vagy eseményindító. A forráskód csak akkor látható, ha az alábbi feltételek egyike igaz:

    • A felhasználó rendelkezik VIEW DEFINITION engedéllyel az objektumra.

    • A felhasználó nem kapott engedélyt VIEW DEFINITION az objektumra, és rendelkezik CONTROL, ALTERvagy TAKE OWNERSHIP engedéllyel az objektumon. Minden más felhasználó látja NULL.

  • A definícióoszlopok a következő katalógusnézetekben találhatók:

    • sys.all_sql_modules
    • sys.server_sql_modules
    • sys.default_constraints
    • sys.numbered_procedures
    • sys.sql_modules
    • sys.check_constraints
    • sys.computed_columns
  • A ctext oszlop a syscomments kompatibilitási nézetben.

  • A sp_helptext eljárás kimenete.

  • Az információs séma nézeteinek alábbi oszlopai:

    • 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() funkció

  • A password_hashsys.sql_logins oszlopában tárolt érték. Azok a felhasználók, akik nem rendelkeznek CONTROL SERVER, vagy az SQL Server 2022 (16.x) és újabb verzióiban a VIEW ANY CRYPTOGRAPHICALLY SECURED DEFINITION engedéllyel, a NULL értéket látják ebben az oszlopban.

A beépített rendszereljárások és függvények SQL-definíciói nyilvánosan láthatók a sys.system_sql_modules katalógusnézet, a sp_helptext tárolt eljárás és a OBJECT_DEFINITION() függvény segítségével.

Jegyzet

A rendszer által tárolt eljárás sp_helptext nem támogatott az Azure Synapse Analyticsben. Ehelyett használja az sys.sql_modules objektumkatalógus nézetet.

A metaadatok láthatóságának általános alapelvei

A metaadatok láthatóságával kapcsolatban az alábbi általános alapelveket érdemes figyelembe venni:

  • Rögzített szerepkörök implicit engedélyei
  • Engedélyek hatóköre
  • A precedencia DENY
  • Az alkomponens metaadatainak láthatósága

Rögzített szerepkörök és implicit engedélyek

A rögzített szerepkörök által elérhető metaadatok a hozzájuk tartozó implicit engedélyektől függnek.

Engedélyek hatóköre

Az egy hatókörhöz tartozó engedélyek azt jelentik, hogy a metaadatok az adott hatókörben és minden zárt hatókörben láthatók. Egy sémára vonatkozó engedély például azt jelenti, SELECT hogy a jogosult rendelkezik SELECT engedéllyel az adott séma által tartalmazott összes biztonságos adatra. A séma engedélyének SELECT megadása lehetővé teszi a felhasználó számára a séma metaadatainak, valamint a benne található táblák, nézetek, függvények, eljárások, üzenetsorok, szinonimák, típusok és XML-sémagyűjtemények megtekintését. További információkat a hatókörökről az Engedélyhierarchiában (adatbázis-motor)talál.

Jegyzet

Az UNMASK engedély nem befolyásolja a metaadatok láthatóságát: önmagában az UNMASK engedélyezés nem fedi fel a metaadatokat. UNMASK mindig SELECT engedéllyel kell rendelkeznie ahhoz, hogy bármilyen hatása legyen. Példa: az adatbázis hatókörének megadása UNMASK és az egyes táblákon való engedélyezés SELECT eredménye, hogy a felhasználó csak annak az egyéni táblának a metaadatait látja, amelyből kiválasztható, más táblát nem.

A DENY elsőbbsége

DENY általában elsőbbséget élvez más engedélyekkel szemben. Ha például egy adatbázis-felhasználó engedélyt kap EXECUTE egy sémára, de az adott sémában tárolt eljáráshoz megtagadták EXECUTE az engedélyt, a felhasználó nem tekintheti meg a tárolt eljárás metaadatait.

Ezenkívül ha egy felhasználó nem rendelkezik EXECUTE engedéllyel egy sémához, de EXECUTE a sémában tárolt eljáráshoz kapott engedélyt, a felhasználó nem tekintheti meg a tárolt eljárás metaadatait.

Egy másik példa, ha egy felhasználó kapott és megtagadott EXECUTE engedélyt egy tárolt eljáráshoz, amely a különböző szerepkör-tagságokon keresztül lehetséges, elsőbbséget élvez, DENY és a felhasználó nem tudja megtekinteni a tárolt eljárás metaadatait.

Az alkomponens metaadatainak láthatósága

Az alösszetevők, például az indexek, az ellenőrzési korlátozások és az eseményindítók láthatóságát a szülő engedélyei határozzák meg. Ezek az alösszetevők nem rendelkeznek engedélyezhető engedélyekkel. Ha például egy felhasználó engedélyt kapott egy táblára, a felhasználó megtekintheti a táblák, oszlopok, indexek, ellenőrzési korlátozások, eseményindítók és más ilyen alösszetevők metaadatait. Egy másik példa a jog megadására csak egy adott oszlopra egy táblán belül: SELECT ez lehetővé teszi a kedvezményezett számára, hogy megtekintse a teljes tábla metaadatait, beleértve az összes oszlopot is. Ennek egyik módja, hogy az VIEW DEFINITION engedély csak entitásszinten működik (ebben az esetben a tábla), és nem érhető el alhálózati listákhoz (például oszlop- vagy biztonsági kifejezésekhez).

A következő kód ezt a viselkedést mutatja be:

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;

Az adatbázis minden felhasználója számára elérhető metaadatok

Bizonyos metaadatoknak elérhetőnek kell lenniük egy adott adatbázis összes felhasználója számára. A fájlcsoportok például nem rendelkeznek átruházható engedélyekkel; Ezért a felhasználó nem kaphat engedélyt a fájlcsoport metaadatainak megtekintésére. Azonban minden olyan felhasználónak, aki létrehozhat egy táblát, hozzá kell férnie a fájlcsoport metaadataihoz a ON <filegroup> utasítás TEXTIMAGE_ON <filegroup> vagy CREATE TABLE záradékainak használatához.

A függvények által DB_ID()DB_NAME() visszaadott metaadatok minden felhasználó számára láthatók.

Ez azoknak a katalógusnézeteknek a listája, amelyek a nyilvános szerepkör számára láthatók.

  • 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