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 lubNULL
.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_string
sys.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ścisyscomments
.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
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.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)