Udostępnij za pośrednictwem


Konfiguracja widoczności metadanych

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

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 otrzymał uprawnienie, takie 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 żadnych uprawnień do myTable, 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

Silnik bazy danych sp_help procedury składowane

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

Replikacja i program SQL Server Agent sp_help procedur składowanych

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ć 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ą, że dostęp publicznych metadanych zostanie przerwany.

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ć dzwoniącym wyświetlanie metadanych, możesz przyznać im uprawnienia VIEW DEFINITION lub, począwszy od SQL Server 2022, opcjonalnie także VIEW SECURITY DEFINITION lub VIEW PERFORMANCE DEFINITION na odpowiednim poziomie: obiektu, bazy danych lub serwera. W związku z tym, w poprzednim przykładzie, jeśli wywołujący ma uprawnienia VIEW DEFINITION w myTable, procedura składowana zwraca wiersz. Aby uzyskać więcej informacji, zobacz GRANT (Transact-SQL) i GRANT Database Permissions (Transact-SQL).

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ć funkcji EXECUTE AS, aby tymczasowo przełączyć się do kontekstu zabezpieczeń obiektu wywołującego. Aby uzyskać więcej informacji, zobacz EXECUTE AS (Transact-SQL).

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żna wymusić emisję metadanych w komunikatach o błędach, manipulując 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 będą zwięzłe i mogą być trudne do wykorzystania w celach debugowania. Aby uzyskać więcej informacji, zobacz Opcje uruchamiania usługi aparatu bazy danych i flagi śledzenia (Transact-SQL).

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

  • Wartość przechowywana w kolumnie provider_stringsys.servers. Użytkownik, który nie ma uprawnień ALTER ANY LINKED SERVER, zobaczy wartość NULL 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 uprawnienie VIEW DEFINITION dla obiektu.

    • Użytkownikowi nie odmówiono uprawnień VIEW DEFINITION do obiektu i ma uprawnienia CONTROL, ALTERlub TAKE OWNERSHIP do obiektu. Wszyscy inni użytkownicy zobaczą 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_hash sys.sql_logins. Użytkownik, który nie ma uprawnienia CONTROL SERVER lub, począwszy od SQL Server 2022, uprawnienia VIEW ANY CRYPTOGRAPHICALLY SECURED DEFINITION, zobaczy wartość NULL w tej kolumnie.

Notatka

Definicje SQL wbudowanych procedur systemowych i funkcji są publicznie widoczne w widoku wykazu sys.system_sql_modules, procedurze składowanej sp_helptext i funkcji OBJECT_DEFINITION().

Notatka

Systemowa procedura składowana sp_helptext 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 odmowy

  • Widoczność metadanych podskładu

Stałe role i niejawne uprawnienia

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 SELECT w schemacie oznacza, że nabywca ma uprawnienie SELECT do wszystkich zabezpieczanych elementów zawartych w tym schemacie. Przyznanie uprawnień SELECT schematu 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 wpłynie na widoczność metadanych: przyznanie samego UNMASK nie ujawni żadnych metadanych. UNMASK zawsze musi towarzyszyć uprawnienie SELECT, aby mieć jakikolwiek wpływ. Przykład: udzielenie UNMASK w zakresie bazy danych i przyznanie SELECT na pojedynczej tabeli będzie skutkować tym, że użytkownik może zobaczyć tylko metadane tej pojedynczej tabeli, z której mogą wybierać, a nie innych.

Pierwszeństwo odmowy

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

Ponadto, jeśli użytkownikowi odmówiono uprawnień EXECUTE do schematu, ale przyznano mu uprawnienia EXECUTE 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 mu uprawnienia EXECUTE dla procedury składowanej, co jest możliwe za pośrednictwem różnych członkostw w rolach, DENY ma pierwszeństwo, 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 wyzwalacze, jest określana przez uprawnienia dotyczące 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 dla pojedynczej kolumny danej tabeli: pozwoli to użytkownikowi wyświetlić metadane całej tabeli, w tym wszystkie kolumny. Jednym ze sposobów myślenia o tym jest to, że uprawnienie VIEW DEFINITION działa tylko na poziomie jednostki (tabela w tym przypadku) i nie jest dostępne dla list jednostek podrzędnych (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, aby użyć grupy plików ON lub TEXTIMAGE_ON filegroup klauzul instrukcji CREATE TABLE.

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

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

sys.partition_functions

sys.partition_schemes

sys.filegroups

sys.database_files

sys.partitions

sys.schemas

sys.sql_dependencies

sys.parameter_type_usages

sys.partition_range_values

sys.data_spaces

sys.destination_data_spaces

sys.allocation_units

sys.messages

sys.configurations

sys.type_assembly_usages

sys.column_type_usages

Zobacz też

GRANT (Transact-SQL)
DENY (Transact-SQL)
ODWOŁAJ (Transact-SQL)
EXECUTE AS, klauzula (Transact-SQL)
Widoki Katalogu (Transact-SQL)
widoki zgodności (Transact-SQL)