Настройка видимости метаданныхMetadata Visibility Configuration

Видимость метаданных ограничивается защищаемыми объектами, которыми пользователь владеет или на которые пользователю предоставлено разрешение.The visibility of metadata is limited to securables that a user either owns or on which the user has been granted some permission. Например, следующий запрос возвращает строку, если пользователю было предоставлено разрешение SELECT или INSERT на таблицу myTable.For example, the following query returns a row if the user has been granted a permission such as SELECT or INSERT on the table myTable.

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

Однако если пользователь не имеет никаких разрешений на myTable, запрос возвращает пустой результирующий набор.However, if the user does not have any permission on myTable, the query returns an empty result set.

Область и влияние настроек видимости метаданныхScope and Impact of Metadata Visibility Configuration

Настройка видимости метаданных применяется только к следующим защищаемым объектам:Metadata visibility configuration only applies to the following securables.

Представления каталогаCatalog views Хранимые процедуры компонента Database EngineDatabase Engine sp_help Документация МайкрософтDatabase EngineDatabase Engine sp_help stored procedures
Метаданные, предоставляющие встроенные функцииMetadata exposing built-in functions Представления информационной схемыInformation schema views
представлений совместимости;Compatibility views Расширенные свойстваExtended properties

Настройка видимости метаданных не применяется к следующим защищаемым объектам:Metadata visibility configuration does not apply to the following securables.

Системные таблицы доставки журналовLog shipping system tables SQL ServerSQL Server Системные таблицы агентаAgent system tables
Системные таблицы плана обслуживания базы данныхDatabase maintenance plan system tables Системные таблицы резервных копийBackup system tables
Системные таблицы репликацииReplication system tables Репликация и хранимые процедуры SQL ServerSQL Server sp_help агентаReplication and SQL ServerSQL Server Agent sp_help stored procedures

Ограниченная возможность доступа к метаданным означает следующее.Limited metadata accessibility means the following:

  • Приложения, предполагающие общий доступ к метаданным, разорвутся.Applications that assume public metadata access will break.

  • Запросы на системные представления смогут вернуть только подмножество строк или иногда пустой результирующий набор.Queries on system views might only return a subset of rows, or sometimes an empty result set.

  • Встроенные функции по формированию метаданных, например OBJECTPROPERTYEX, могут вернуть значение NULL.Metadata-emitting, built-in functions such as OBJECTPROPERTYEX may return NULL.

  • Хранимые процедуры Database EngineDatabase Engine sp_help могут возвращать только подмножество строк или значение NULL.The Database EngineDatabase Engine sp_help stored procedures might return only a subset of rows, or NULL.

SQL модули, например хранимые процедуры и триггеры, выполняются в контексте безопасности участника и поэтому имеют ограниченный доступ к метаданным.SQL modules, such as stored procedures and triggers, run under the security context of the caller and, therefore, have limited metadata accessibility. Например, в следующем коде, когда хранимая процедура пытается получить доступ к метаданным для таблицы myTable , на который участник не имеет прав, возвращается пустой результирующий набор.For example, in the following code, when the stored procedure tries to access metadata for the table myTable on which the caller has no rights, an empty result set is returned. В ранних версиях SQL ServerSQL Serverвозвращается строка.In earlier releases of SQL ServerSQL Server, a row is returned.

CREATE PROCEDURE assumes_caller_can_access_metadata  
BEGIN  
SELECT name, id   
FROM sysobjects   
WHERE name = 'myTable';  
END;  
GO  

Чтобы позволить участникам просмотреть метаданные, можно предоставить им разрешение VIEW DEFINITION на соответствующую область: уровень объекта, уровень базы данных или уровень сервера.To allow callers to view metadata, you can grant the callers VIEW DEFINITION permission at an appropriate scope: object level, database level or server level. Таким образом, если в предыдущем примере участник имеет разрешение VIEW DEFINITION на таблицу myTable, хранимая процедура возвращает строку.Therefore, in the previous example, if the caller has VIEW DEFINITION permission on myTable, the stored procedure returns a row. Дополнительные сведения см. в статьях GRANT (Transact-SQL) и GRANT Database Permissions (Transact-SQL).For more information, see GRANT (Transact-SQL) and GRANT Database Permissions (Transact-SQL).

Также можно изменить хранимую процедуру таким образом, что она будет выполняться под учетными данными владельца.You can also modify the stored procedure so that it executes under the credentials of the owner. Если владелец процедуры и владелец таблицы один и тот же, применяются цепочки владения, и контекст безопасности владельца процедуры открывает доступ к метаданным таблицы myTable.When the procedure owner and the table owner are the same owner, ownership chaining applies, and the security context of the procedure owner enables access to the metadata for myTable. Под таким сценарием следующий код возвращает строку метаданных участнику.Under this scenario, the following code returns a row of metadata to the caller.

Примечание

В следующем примере использования представление каталога sys.objects применяется вместо представления совместимости sys.sysobjects .The following example uses the sys.objects catalog view instead of the sys.sysobjects compatibility view.

CREATE PROCEDURE does_not_assume_caller_can_access_metadata  
WITH EXECUTE AS OWNER  
AS  
BEGIN  
SELECT name, id  
FROM sys.objects   
WHERE name = 'myTable'   
END;  
GO  

Примечание

Можно использовать EXECUTE AS, чтобы временно переключиться на контекст безопасности участника.You can use EXECUTE AS to temporarily switch to the security context of the caller. Дополнительные сведения см. в разделе EXECUTE AS (Transact-SQL).For more information, see EXECUTE AS (Transact-SQL).

Преимущества и ограничения настроек видимости метаданныхBenefits and Limits of Metadata Visibility Configuration

Настройка видимости метаданных может играть очень важную роль в общем плане безопасности.Metadata visibility configuration can play an important role in your overall security plan. Однако иногда даже опытный пользователь может форсировать раскрытие некоторых метаданных.However, there are cases in which a skilled and determined user can force the disclosure of some metadata. Рекомендуется развертывание разрешений метаданных как одной из многих глубоко эшелонированных защит.We recommend that you deploy metadata permissions as one of many defenses-in-depth.

Теоретически возможно принудительно вызвать выброс метаданных в сообщениях об ошибках, манипулируя порядком оценки предикатов в запросах.It is theoretically possible to force the emission of metadata in error messages by manipulating the order of predicate evaluation in queries. Возможность таких атак методом проб и ошибок относится не только к SQL ServerSQL Server.The possibility of such trial-and-error attacks is not specific to SQL ServerSQL Server. Это подразумевается ассоциативными и коммуникативными преобразованиями, разрешенными в реляционной алгебре.It is implied by the associative and commutative transformations permitted in relational algebra. Можно снизить эту угрозу ограничением объема сведений, возвращаемых в сообщениях об ошибках.You can mitigate this risk by limiting the information returned in error messages. Также, чтобы ограничить видимость метаданных таким образом, можно запустить сервер с флагом трассировки 3625.To further restrict the visibility of metadata in this way, you can start the server with trace flag 3625. Этот флаг трассировки ограничивает объем сведений, отображаемых в сообщениях об ошибках.This trace flag limits the amount of information shown in error messages. В свою очередь, это помогает предотвратить форсированное раскрытие.In turn, this helps to prevent forced disclosures. Компромисс заключается в том, что сообщения об ошибках будут в сжатом виде и могут вызвать сложности при использовании для отладки.The tradeoff is that error messages will be terse and might be difficult to use for debugging purposes. Дополнительные сведения см. в разделах Параметры запуска службы Database Engine и Флаги трассировки (Transact-SQL).For more information, see Database Engine Service Startup Options and Trace Flags (Transact-SQL).

Следующие метаданные не подвергаются форсированному раскрытию.The following metadata is not subject to forced disclosure:

  • Значение, хранимое в столбце provider_string объекта sys.servers.The value stored in the provider_string column of sys.servers. Пользователь, не имеющий разрешения ALTER ANY LINKED SERVER, в данном столбце получит значение NULL.A user that does not have ALTER ANY LINKED SERVER permission will see a NULL value in this column.

  • Определение источника пользовательского объекта, например хранимой процедуры или триггера.Source definition of a user-defined object such as a stored procedure or trigger. Код источника видим только в том случае, когда выполняется одно из следующих условий.The source code is visible only when one of the following is true:

    • Пользователь имеет разрешение VIEW DEFINITION на объект.The user has VIEW DEFINITION permission on the object.

    • Пользователю не было запрещено получение разрешения VIEW DEFINITION на объект и он имеет разрешения CONTROL, ALTER или TAKE OWNERSHIP.The user has not been denied VIEW DEFINITION permission on the object and has CONTROL, ALTER, or TAKE OWNERSHIP permission on the object. Все остальные пользователи получат значение NULL.All other users will see NULL.

  • Столбцы определений, найденные в следующих представлениях каталога:The definition columns found in the following catalog views:

    sys.all_sql_modulessys.all_sql_modules sys.sql_modulessys.sql_modules
    sys.server_sql_modulessys.server_sql_modules sys.check_constraintssys.check_constraints
    sys.default_constraintssys.default_constraints sys.computed_columnssys.computed_columns
    sys.numbered_proceduressys.numbered_procedures
  • Столбец ctext в представлении совместимости syscomments .The ctext column in the syscomments compatibility view.

  • Выходные данные процедуры sp_helptext .The output of the sp_helptext procedure.

  • Следующие столбцы в представлениях информационной схемы:The following columns in the information schema views:

    INFORMATION_SCHEMA.CHECK_CONSTRAINTS.CHECK_CLAUSEINFORMATION_SCHEMA.CHECK_CONSTRAINTS.CHECK_CLAUSE INFORMATION_SCHEMA.COLUMNS.COLUMN_DEFAULTINFORMATION_SCHEMA.COLUMNS.COLUMN_DEFAULT
    INFORMATION_SCHEMA.DOMAINS.DOMAIN_DEFAULTINFORMATION_SCHEMA.DOMAINS.DOMAIN_DEFAULT INFORMATION_SCHEMA.ROUTINE_COLUMNS.COLUMN_DEFAULTINFORMATION_SCHEMA.ROUTINE_COLUMNS.COLUMN_DEFAULT
    INFORMATION_SCHEMA.ROUTINES.ROUTINE_DEFINITIONINFORMATION_SCHEMA.ROUTINES.ROUTINE_DEFINITION INFORMATION_SCHEMA.VIEWS.VIEW_DEFINITIONINFORMATION_SCHEMA.VIEWS.VIEW_DEFINITION
  • Функция OBJECT_DEFINITION().OBJECT_DEFINITION() function

  • Значение, хранимое в столбце password_hash объекта sys.sql_logins.The value stored in the password_hash column of sys.sql_logins. Пользователь, не имеющий разрешения CONTROL SERVER, в данном столбце получит значение NULL.A user that does not have CONTROL SERVER permission will see a NULL value in this column.

Примечание

Определения SQL встроенных системных процедур и функций видимы для всех пользователей через представление каталога sys.system_sql_modules , хранимую процедуру sp_helptext и функцию OBJECT_DEFINITION().The SQL definitions of built-in system procedures and functions are publicly visible through the sys.system_sql_modules catalog view, the sp_helptext stored procedure, and the OBJECT_DEFINITION() function.

Общие принципы видимости метаданныхGeneral Principles of Metadata Visibility

Ниже представлены некоторые общие принципы, относящиеся к видимости метаданных.The following are some general principles to consider regarding metadata visibility:

  • Неявные разрешения предопределенных ролей.Fixed roles implicit permissions

  • Область разрешений.Scope of permissions

  • Приоритет инструкции DENYPrecedence of DENY

  • Видимость метаданных вспомогательных компонентов.Visibility of subcomponent metadata

Предопределенные роли и неявные разрешенияFixed Roles and Implicit Permissions

Доступ предопределенных ролей к метаданным зависит от соответствующих неявных разрешений.Metadata that can be accessed by fixed roles depends upon their corresponding implicit permissions.

Область разрешений.Scope of Permissions

Разрешения на одну область дают возможность видеть метаданные в этой области и на всех включенных областях.Permissions at one scope imply the ability to see metadata at that scope and at all enclosed scopes. Например, разрешение SELECT на схему предполагает, что участник разрешения имеет разрешение SELECT на все защищаемые объекты, содержащиеся в этой схеме.For example, SELECT permission on a schema implies that the grantee has SELECT permission on all securables that are contained by that schema. Таким образом, предоставление разрешения SELECT на схему позволяет пользователю видеть метаданные схемы, а также все находящиеся в ней таблицы, представления, функции, процедуры, очереди, синонимы, типы и коллекции XML-схем.The granting of SELECT permission on a schema therefore enables a user to see the metadata of the schema and also all tables, views, functions, procedures, queues, synonyms, types, and XML schema collections within it. Дополнительные сведения об областях см. в разделе Иерархия разрешений (компонент Database Engine).For more information about scopes, see Permissions Hierarchy (Database Engine).

Приоритет инструкции DENYPrecedence of DENY

Инструкция DENY обычно является приоритетной по отношению к другим разрешениям.DENY typically takes precedence over other permissions. Например, если пользователю базы данных на схему было предоставлено разрешение EXECUTE, но это разрешение было запрещено на хранимую процедуру схемы, он не сможет просмотреть метаданные для этой хранимой процедуры.For example, if a database user is granted EXECUTE permission on a schema but has been denied EXECUTE permission on a stored procedure in that schema, the user cannot view the metadata for that stored procedure.

К тому же, если пользователю было запрещено разрешение EXECUTE на схему, но была предоставлена инструкция EXECUTE на хранимую процедуру данной схемы, он также не сможет просмотреть метаданные для этой хранимой процедуры.Additionally, if a user is denied EXECUTE permission on a schema but has been granted EXECUTE permission on a stored procedure in that schema, the user cannot view the metadata for that stored procedure.

Другой пример: если пользователю разрешение EXECUTE на хранимую процедуру было и предоставлено, и запрещено, что возможно благодаря членству в различных ролях, то преимущество имеет инструкция DENY, и пользователь не сможет просмотреть метаданные хранимой процедуры.For another example, if a user has been granted and denied EXECUTE permission on a stored procedure, which is possible through your various role memberships, DENY takes precedence and the user cannot view the metadata of the stored procedure.

Видимость метаданных вспомогательных компонентов.Visibility of Subcomponent Metadata

Видимость вспомогательных компонентов, таких как индексы, проверочные ограничения и триггеры, определяется разрешениями на родительский объект.The visibility of subcomponents, such as indexes, check constraints, and triggers is determined by permissions on the parent. Эти вспомогательные компоненты не имеют предоставляемых разрешений.These subcomponents do not have grantable permissions. Например, если пользователю предоставлено какое-то разрешение на таблицу, он может просмотреть метаданные для столбцов таблицы, индексов, проверочных ограничений, триггеров и других подобных вспомогательных компонентов.For example, if a user has been granted some permission on a table, the user can view the metadata for the tables, columns, indexes, check constraints, triggers, and other such subcomponents.

Метаданные, доступные для всех пользователей базы данныхMetadata That Is Accessible to All Database Users

Некоторые метаданные должны быть доступны для всех пользователей в указанной базе данных.Some metadata must be accessible to all users in a specific database. Например, файловые группы не имеют присвоенных разрешений; поэтому пользователю не может быть предоставлено разрешение на просмотр метаданных файловой группы.For example, filegroups do not have conferrable permissions; therefore, a user cannot be granted permission to view the metadata of a filegroup. Однако любой пользователь, который может создать таблицу, должен иметь доступ к метаданным файловой группы, чтобы использовать предложения ON filegroup или TEXTIMAGE_ON filegroup инструкции CREATE TABLE.However, any user that can create a table must be able to access filegroup metadata to use the ON filegroup or TEXTIMAGE_ON filegroup clauses of the CREATE TABLE statement.

Метаданные, возвращаемые функциями DB_ID() и DB_NAME(), видимы всем пользователям.The metadata that is returned by the DB_ID() and DB_NAME() functions is visible to all users.

В следующей таблице приведены представления каталога, видимые для общей роли.The following table lists the catalog views that are visible to the public role.

sys.partition_functionssys.partition_functions sys.partition_range_valuessys.partition_range_values
sys.partition_schemessys.partition_schemes sys.data_spacessys.data_spaces
sys.filegroupssys.filegroups sys.destination_data_spacessys.destination_data_spaces
sys.database_filessys.database_files sys.allocation_unitssys.allocation_units
sys.partitionssys.partitions sys.messagessys.messages
sys.schemassys.schemas sys.configurationssys.configurations
sys.sql_dependenciessys.sql_dependencies sys.type_assembly_usagessys.type_assembly_usages
sys.parameter_type_usagessys.parameter_type_usages sys.column_type_usagessys.column_type_usages

См. такжеSee Also

GRANT (Transact-SQL) GRANT (Transact-SQL)
DENY (Transact-SQL) DENY (Transact-SQL)
REVOKE (Transact-SQL) REVOKE (Transact-SQL)
Предложение EXECUTE AS (Transact-SQL) EXECUTE AS Clause (Transact-SQL)
Представления каталога (Transact-SQL) Catalog Views (Transact-SQL)
Представления совместимости (Transact-SQL)Compatibility Views (Transact-SQL)