Udostępnij za pomocą


Konfiguracja widoczności metadanych

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL Database w Microsoft Fabric

Widoczność metadanych jest ograniczona do obiektów zabezpieczeń, których użytkownik jest właścicielem lub do których użytkownik otrzymał pewne uprawnienia.

Na przykład następujące zapytanie zwraca wiersz, jeśli użytkownik udziela uprawnień, takich jak SELECT lub INSERT w tabeli myTable.

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

Jeśli jednak użytkownik nie ma uprawnień do myTableelementu , zapytanie zwraca pusty zestaw wyników.

Zakres i wpływ konfiguracji widoczności metadanych

Konfiguracja widoczności metadanych ma zastosowanie tylko do następujących zabezpieczanych elementów:

  • Widoki wykazu
  • Metadane uwidaczniające wbudowane funkcje
  • Widoki zgodności
  • Procedury składowane aparatu sp_help bazy danych
  • Widoki schematu informacji
  • Właściwości rozszerzone

Konfiguracja widoczności metadanych nie ma zastosowania do następujących zabezpieczanych elementów:

  • Tabele systemu wysyłania dzienników
  • Tabele systemu planu konserwacji bazy danych
  • Tabele systemowe replikacji
  • Tabele systemowe agenta programu SQL Server
  • Tworzenie kopii zapasowych tabel systemowych
  • Procedury składowane replikacji i agenta sp_help programu SQL Server

Ograniczona dostępność metadanych oznacza następujące kwestie:

  • Zapytania dotyczące widoków systemowych mogą zwracać tylko podzbiór wierszy lub czasami pusty zestaw wyników.
  • Funkcje wbudowane emitujące metadane, takie jak OBJECTPROPERTYEX, mogą zwracać wartość NULL.
  • Silnik bazy danych sp_help, procedury składowane mogą zwracać tylko podzbiór wierszy lub NULL.
  • W związku z tym aplikacje, które zakładają przerwy w dostępie do publicznych metadanych.

Moduły SQL, takie jak procedury składowane i wyzwalacze, są uruchamiane w kontekście zabezpieczeń obiektu wywołującego i dlatego mają ograniczoną dostępność metadanych. Na przykład w poniższym kodzie, gdy procedura składowana próbuje uzyskać dostęp do metadanych tabeli myTable, na której obiekt wywołujący nie ma żadnych praw, zwracany jest pusty zestaw wyników. We wcześniejszych wersjach programu SQL Server zwracany jest wiersz.

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

Aby umożliwić obiektom wywołującym wyświetlanie metadanych, możesz przyznać obiektom wywołującym VIEW DEFINITION uprawnienie lub w programie SQL Server 2022 (16.x) i nowszych wersjach, VIEW SECURITY DEFINITION albo VIEW PERFORMANCE DEFINITION w odpowiednim zakresie: na poziomie obiektu, na poziomie bazy danych lub na poziomie serwera. W związku z tym w poprzednim przykładzie, jeśli obiekt wywołujący ma VIEW DEFINITION uprawnienie, myTableprocedura składowana zwraca wiersz. Aby uzyskać więcej informacji, zobacz GRANT and GRANT Database Permissions (UDZIELANIE i UDZIELANIE uprawnień bazy danych).

Można również zmodyfikować procedurę składowaną, tak aby była wykonywana z uprawnieniami właściciela. Gdy właściciel procedury i właściciel tabeli są tym samym właścicielem, ma zastosowanie łańcuch własności, a kontekst zabezpieczeń właściciela procedury umożliwia dostęp do metadanych dla myTable. W tym scenariuszu poniższy kod zwraca wiersz metadanych do obiektu wywołującego.

Notatka

W poniższym przykładzie użyto widoku katalogu sys.objects zamiast widoku zgodności 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

Notatka

Możesz użyć EXECUTE AS polecenia , aby tymczasowo przełączyć się do kontekstu zabezpieczeń obiektu wywołującego. Aby uzyskać więcej informacji, zobacz WYKONYWANIE JAKO.

Korzyści i limity konfiguracji widoczności metadanych

Konfiguracja widoczności metadanych może odgrywać ważną rolę w ogólnym planie zabezpieczeń. Istnieją jednak przypadki, w których wykwalifikowany i zdeterminowany użytkownik może wymusić ujawnienie niektórych metadanych. Zalecamy wdrożenie uprawnień metadanych jako jednej z wielu funkcji ochrony w głębi systemu.

Teoretycznie możliwe jest wymuszenie emisji metadanych w komunikatach o błędach przez manipulowanie kolejnością oceny predykatu w zapytaniach. Możliwość takich ataków próbnych i błędów nie jest specyficzna dla programu SQL Server. Jest to implikowane przez przekształcenia kojarzące i zmutacyjne dozwolone w algebra relacyjnej. To ryzyko można ograniczyć, ograniczając informacje zwracane w komunikatach o błędach. Aby jeszcze bardziej ograniczyć widoczność metadanych w ten sposób, możesz uruchomić serwer z flagą śledzenia 3625. Ta flaga śledzenia ogranicza ilość informacji wyświetlanych w komunikatach o błędach. Z kolei pomaga to zapobiec wymuszonym ujawnieniu. Kompromis polega na tym, że komunikaty o błędach są przekazywane i mogą być trudne do użycia w celach debugowania. Aby uzyskać więcej informacji, zobacz Opcje uruchamiania usługi aparatu bazy danych i flagi śledzenia.

Następujące metadane nie podlegają wymuszonym ujawnieniu:

  • Wartość przechowywana w kolumnie provider_stringsys.servers. Użytkownik, który nie ma ALTER ANY LINKED SERVER uprawnień, widzi NULL wartość w tej kolumnie.

  • Definicja źródłowa obiektu zdefiniowanego przez użytkownika, takiego jak procedura składowana lub wyzwalacz. Kod źródłowy jest widoczny tylko wtedy, gdy spełniony jest jeden z następujących warunków:

    • Użytkownik ma VIEW DEFINITION uprawnienia do obiektu.

    • Użytkownik nie otrzymał uprawnień do VIEW DEFINITION obiektu i ma CONTROLuprawnienia , ALTERlub TAKE OWNERSHIP w obiekcie . Wszyscy inni użytkownicy widzą wartość NULL.

  • Kolumny definicji znalezione w następujących widokach wykazu:

    • sys.all_sql_modules
    • sys.server_sql_modules
    • sys.default_constraints
    • sys.numbered_procedures
    • sys.sql_modules
    • sys.check_constraints
    • sys.computed_columns
  • Kolumna ctext w widoku zgodności syscomments.

  • Dane wyjściowe procedury sp_helptext.

  • Następujące kolumny w widokach schematu informacji:

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

  • Wartość przechowywana w kolumnie password_hashsys.sql_logins. Użytkownik, który nie ma CONTROL SERVERelementu lub w programie SQL Server 2022 (16.x) i nowszych wersjach, VIEW ANY CRYPTOGRAPHICALLY SECURED DEFINITION uprawnienie widzi NULL wartość w tej kolumnie.

Definicje SQL wbudowanych procedur systemowych i funkcji są publicznie widoczne za pośrednictwem sys.system_sql_modules widoku wykazu, sp_helptext procedury składowanej i OBJECT_DEFINITION() funkcji.

Notatka

Procedura sp_helptext składowana systemu nie jest obsługiwana w usłudze Azure Synapse Analytics. Zamiast tego użyj widoku wykazu obiektów sys.sql_modules.

Ogólne zasady widoczności metadanych

Poniżej przedstawiono niektóre ogólne zasady, które należy wziąć pod uwagę w odniesieniu do widoczności metadanych:

  • Naprawione domyślne uprawnienia ról
  • Zakres uprawnień
  • Pierwszeństwo DENY
  • Widoczność metadanych podskładu

Naprawiono role i uprawnienia niejawne

Metadane, do których można uzyskać dostęp za pomocą stałych ról, zależą od odpowiednich niejawnych uprawnień.

Zakres uprawnień

Uprawnienia w jednym zakresie oznaczają możliwość wyświetlania metadanych w tym zakresie i we wszystkich ujętach zakresach. Na przykład uprawnienie do schematu oznacza, SELECT że grante SELECT ma uprawnienia do wszystkich zabezpieczanych elementów zawartych w tym schemacie. Udzielenie uprawnień do schematu SELECT umożliwia użytkownikowi wyświetlanie metadanych schematu, a także wszystkich tabel, widoków, funkcji, procedur, kolejek, synonimów, typów i kolekcji schematów XML. Aby uzyskać więcej informacji na temat zakresów, zobacz Hierarchia uprawnień (aparat bazy danych).

Notatka

Uprawnienie UNMASK nie ma wpływu na widoczność metadanych: przyznanie UNMASK samemu nie ujawnia żadnych metadanych. UNMASK zawsze musi towarzyszyć SELECT uprawnienie, aby mieć jakikolwiek efekt. Przykład: przyznanie zakresu bazy danych i przyznanie UNMASKSELECT dla pojedynczej tabeli ma wynik, że użytkownik może zobaczyć tylko metadane poszczególnych tabel, z których mogą wybrać, a nie inne.

Pierwszeństwo odmowy

DENY zwykle ma pierwszeństwo przed innymi uprawnieniami. Jeśli na przykład użytkownik bazy danych ma uprawnienie EXECUTE do schematu, ale odmówiono mu uprawnień do procedury składowanej w tym schemacie, użytkownik nie może wyświetlić metadanych dla tej procedury składowanej EXECUTE .

Ponadto jeśli użytkownik nie EXECUTE ma uprawnień do schematu, ale otrzymał EXECUTE uprawnienie do procedury składowanej w tym schemacie, użytkownik nie może wyświetlić metadanych dla tej procedury składowanej.

W innym przykładzie, jeśli użytkownik otrzymał i odmówiono uprawnień do procedury składowanej EXECUTE , która jest możliwa za pośrednictwem różnych członkostw w rolach, ma pierwszeństwo, DENY a użytkownik nie może wyświetlić metadanych procedury składowanej.

Widoczność metadanych podskładu

Widoczność podskładników, takich jak indeksy, ograniczenia sprawdzania i wyzwalaczy, są określane przez uprawnienia do elementu nadrzędnego. Te podskładniki nie mają uprawnień możliwych do udzielenia. Jeśli na przykład użytkownik otrzymał jakieś uprawnienia do tabeli, użytkownik może wyświetlić metadane tabel, kolumn, indeksów, ograniczeń, wyzwalaczy i innych takich podskładników. Innym przykładem jest przyznanie SELECT tylko pojedynczej kolumnie danej tabeli: umożliwia to użytkownikowi wyświetlanie metadanych całej tabeli, w tym wszystkich kolumn. Jednym ze sposobów myślenia o tym jest to, że VIEW DEFINITION uprawnienie działa tylko na poziomie jednostki (tabela w tym przypadku) i nie jest dostępne dla list subentity (takich jak kolumny lub wyrażenia zabezpieczeń).

Poniższy kod demonstruje to zachowanie:

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;

Metadane dostępne dla wszystkich użytkowników bazy danych

Niektóre metadane muszą być dostępne dla wszystkich użytkowników w określonej bazie danych. Na przykład grupy plików nie mają przyznanych uprawnień; w związku z tym nie można udzielić użytkownikowi uprawnień do wyświetlania metadanych grupy plików. Jednak każdy użytkownik, który może utworzyć tabelę, musi mieć dostęp do metadanych grupy plików w celu użycia ON <filegroup> klauzul lub TEXTIMAGE_ON <filegroup> instrukcji CREATE TABLE .

Metadane zwracane przez DB_ID() funkcje i DB_NAME() są widoczne dla wszystkich użytkowników.

Jest to lista widoków wykazu, które są widoczne dla roli publicznej.

  • 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