Configuración de visibilidad de los metadatosMetadata Visibility Configuration

SE APLICA A: síSQL Server síAzure SQL Database síAzure Synapse Analytics (SQL DW) síAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) yesParallel Data Warehouse

La visibilidad de los metadatos se limita a los elementos protegibles que son propiedad de un usuario o sobre los que el usuario tienen algún permiso.The visibility of metadata is limited to securables that a user either owns or on which the user has been granted some permission. Por ejemplo, la siguiente consulta devuelve una fila si se ha concedido al usuario un permiso como SELECT o INSERT sobre la tabla 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 = N'myTable';  
GO  

Sin embargo, si el usuario no dispone de ningún permiso sobre myTable, la consulta devuelve un conjunto de resultados vacío.However, if the user does not have any permission on myTable, the query returns an empty result set.

Ámbito e impacto de la configuración de visibilidad de los metadatosScope and Impact of Metadata Visibility Configuration

La configuración de visibilidad de los metadatos solo se aplica a los siguientes elementos protegibles:Metadata visibility configuration only applies to the following securables.

Vistas de catálogoCatalog views Procedimientos almacenados sp_help de Motor de base de datosDatabase EngineMotor de base de datosDatabase Engine sp_help stored procedures
Funciones integradas que exponen metadatosMetadata exposing built-in functions Vistas de esquema de informaciónInformation schema views
Vistas de compatibilidadCompatibility views Propiedades extendidasExtended properties

La configuración de visibilidad de los metadatos no se aplica a los siguientes elementos protegibles:Metadata visibility configuration does not apply to the following securables.

Tablas de sistema de trasvase de registrosLog shipping system tables SQL ServerSQL Server Tablas de sistema del AgenteAgent system tables
Tablas de sistema de planes de mantenimiento de bases de datosDatabase maintenance plan system tables Tablas de sistema de copia de seguridadBackup system tables
Tablas de sistema de replicaciónReplication system tables Procedimientos almacenados SQL ServerSQL Server sp_help de replicación y del AgenteReplication and SQL ServerSQL Server Agent sp_help stored procedures

Una accesibilidad limitada a los metadatos significa lo siguiente:Limited metadata accessibility means the following:

  • Las aplicaciones que asuman un acceso public a los metadatos se interrumpirán.Applications that assume public metadata access will break.

  • Las consultas que se realicen en vistas del sistema puede que solo devuelvan un subconjunto de filas o, en ocasiones, un conjunto de resultados vacío.Queries on system views might only return a subset of rows, or sometimes an empty result set.

  • Las funciones integradas que emiten metadatos, como OBJECTPROPERTYEX, pueden devolver NULL.Metadata-emitting, built-in functions such as OBJECTPROPERTYEX may return NULL.

  • Los procedimientos almacenados Motor de base de datosDatabase Engine sp_help pueden devolver únicamente un subconjunto de filas, o NULL.The Motor de base de datosDatabase Engine sp_help stored procedures might return only a subset of rows, or NULL.

Los módulos SQL, como procedimientos almacenados y desencadenadores, se ejecutan en el contexto de seguridad del autor de la llamada y, por tanto, tienen un acceso limitado a los metadatos.SQL modules, such as stored procedures and triggers, run under the security context of the caller and, therefore, have limited metadata accessibility. Por ejemplo, en el siguiente código, cuando el procedimiento almacenado intenta obtener acceso a los metadatos de la tabla myTable sobre la que el autor de la llamada no tienen ningún derecho, se devuelve un conjunto de resultados vacío.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. En versiones anteriores de SQL ServerSQL Serverse devuelve una fila.In earlier releases of SQL ServerSQL Server, a row is returned.

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

Para permitir que los autores de la llamada vean los metadatos, puede concederles un permiso VIEW DEFINITION en un ámbito adecuado: nivel de objeto, base de datos o servidor.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. Por lo tanto, en el ejemplo anterior, si el autor de la llamada dispone de permiso VIEW DEFINITION sobre myTable, el procedimiento almacenado devuelve una fila.Therefore, in the previous example, if the caller has VIEW DEFINITION permission on myTable, the stored procedure returns a row. Para obtener más información, vea GRANT (Transact-SQL) y GRANT (permisos de base de datos de Transact-SQL).For more information, see GRANT (Transact-SQL) and GRANT Database Permissions (Transact-SQL).

También puede modificar el procedimiento almacenado para que se ejecute bajo las credenciales del propietario.You can also modify the stored procedure so that it executes under the credentials of the owner. Cuando el propietario del procedimiento y el propietario de la tabla son el mismo, se aplica el encadenamiento de propiedad, y el contexto de seguridad del propietario del procedimiento permite el acceso a los metadatos de 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. En un escenario de este tipo, el siguiente código devuelve una fila de metadatos al autor de la llamada.Under this scenario, the following code returns a row of metadata to the caller.

Nota

En el siguiente ejemplo se usa la vista de catálogo sys.objects en lugar de la vista de compatibilidad 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, object_id  
FROM sys.objects   
WHERE name = N'myTable'   
END;  
GO  

Nota

Puede utilizar EXECUTE AS para cambiar temporalmente al contexto de seguridad del autor de la llamada.You can use EXECUTE AS to temporarily switch to the security context of the caller. Para obtener más información, vea EXECUTE AS (Transact-SQL).For more information, see EXECUTE AS (Transact-SQL).

Beneficios y límites de la configuración de visibilidad de los metadatosBenefits and Limits of Metadata Visibility Configuration

La configuración de visibilidad de los metadatos puede desempeñar un rol importante en el plan de seguridad global.Metadata visibility configuration can play an important role in your overall security plan. Sin embargo, hay casos en los que un usuario con conocimientos y determinación puede forzar la divulgación de algunos metadatos.However, there are cases in which a skilled and determined user can force the disclosure of some metadata. Es recomendable implementar permisos sobre los metadatos como una de las distintas medidas de defensa más completa.We recommend that you deploy metadata permissions as one of many defenses-in-depth.

Teóricamente, es posible forzar la emisión de metadatos en los mensajes de error mediante la manipulación del orden de evaluación de predicados en las consultas.It is theoretically possible to force the emission of metadata in error messages by manipulating the order of predicate evaluation in queries. La posibilidad de estos ataques de prueba y error no es específica de SQL ServerSQL Server.The possibility of such trial-and-error attacks is not specific to SQL ServerSQL Server. Es una implicación de las transformaciones asociativas y conmutativas que admite el álgebra relacional.It is implied by the associative and commutative transformations permitted in relational algebra. Puede mitigar este riesgo mediante la limitación de la información que se devuelve en los mensajes de error.You can mitigate this risk by limiting the information returned in error messages. Para restringir más la visibilidad de metadatos de esta manera, puede iniciar el servidor con la marca de seguimiento 3625.To further restrict the visibility of metadata in this way, you can start the server with trace flag 3625. Esta marca de seguimiento limita la cantidad de información que se muestra en los mensajes de error.This trace flag limits the amount of information shown in error messages. A su vez, ayuda a evitar divulgaciones forzadas.In turn, this helps to prevent forced disclosures. La contrapartida es que los mensajes de error se simplificarán y puede resultar difícil su uso para fines de depuración.The tradeoff is that error messages will be terse and might be difficult to use for debugging purposes. Para obtener más información, vea Opciones de inicio del servicio de motor de base de datos y Marcas de seguimiento (Transact-SQL).For more information, see Database Engine Service Startup Options and Trace Flags (Transact-SQL).

Los metadatos que se muestran a continuación no están sujetos a una divulgación forzada:The following metadata is not subject to forced disclosure:

  • El valor almacenado en la columna provider_string de sys.servers.The value stored in the provider_string column of sys.servers. Un usuario que no disponga de permiso ALTER ANY LINKED SERVER verá un valor NULL en esta columna.A user that does not have ALTER ANY LINKED SERVER permission will see a NULL value in this column.

  • La definición de origen de un objeto especificado por el usuario, como un procedimiento almacenado o desencadenador.Source definition of a user-defined object such as a stored procedure or trigger. El código fuente solo es visible cuando una de las siguientes afirmaciones es cierta:The source code is visible only when one of the following is true:

    • El usuario dispone de permiso VIEW DEFINITION sobre el objeto.The user has VIEW DEFINITION permission on the object.

    • No se ha denegado al usuario el permiso VIEW DEFINITION sobre el objeto y dispone de permiso CONTROL, ALTER o TAKE OWNERSHIP sobre el objeto.The user has not been denied VIEW DEFINITION permission on the object and has CONTROL, ALTER, or TAKE OWNERSHIP permission on the object. El resto de usuarios verán NULL.All other users will see NULL.

  • Las columnas de definición de las siguientes vistas de catálogo: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
  • La columna ctext de la vista de compatibilidad syscomments .The ctext column in the syscomments compatibility view.

  • El resultado del procedimiento sp_helptext .The output of the sp_helptext procedure.

  • Las siguientes columnas de las vistas de esquema de información: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
  • La función OBJECT_DEFINITION()OBJECT_DEFINITION() function

  • El valor almacenado en la columna password_hash de sys.sql_logins.The value stored in the password_hash column of sys.sql_logins. Un usuario que no tenga un permiso CONTROL SERVER verá un valor NULL en esta columna.A user that does not have CONTROL SERVER permission will see a NULL value in this column.

Nota

Las definiciones SQL de procedimientos y funciones del sistema integrados son visibles de forma pública a través de la vista de catálogo sys.system_sql_modules , el procedimiento almacenado sp_helptext y la función 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.

Principios generales de visibilidad de los metadatosGeneral Principles of Metadata Visibility

A continuación, se muestran algunos de los principios generales que hay que tener en cuenta de cara a la visibilidad de los metadatos:The following are some general principles to consider regarding metadata visibility:

  • Permisos implícitos de roles fijosFixed roles implicit permissions

  • Ámbito de los permisosScope of permissions

  • Prioridad de DENYPrecedence of DENY

  • Visibilidad de los metadatos de subcomponentesVisibility of subcomponent metadata

Roles fijos y permisos implícitosFixed Roles and Implicit Permissions

Los metadatos a los que pueden obtener acceso los roles fijos dependen de sus permisos implícitos correspondientes.Metadata that can be accessed by fixed roles depends upon their corresponding implicit permissions.

Ámbito de los permisosScope of Permissions

Los permisos de un ámbito implican la posibilidad de ver los metadatos en dicho ámbito y en todos los ámbitos incluidos en el mismo.Permissions at one scope imply the ability to see metadata at that scope and at all enclosed scopes. Por ejemplo, el permiso SELECT sobre un esquema implica que el receptor dispone del permiso SELECT sobre todos los elementos protegibles incluidos en dicho esquema.For example, SELECT permission on a schema implies that the grantee has SELECT permission on all securables that are contained by that schema. Por tanto, la concesión del permiso SELECT sobre un esquema permite al usuario ver los metadatos del esquema y todas las tablas, vistas, funciones, procedimientos, colas, sinónimos, tipos y colecciones de esquemas XML que estén incluidos en el mismo.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. Para obtener más información sobre ámbitos, vea Jerarquía de permisos (motor de base de datos).For more information about scopes, see Permissions Hierarchy (Database Engine).

Prioridad de DENYPrecedence of DENY

Normalmente, DENY tiene prioridad sobre otros permisos.DENY typically takes precedence over other permissions. Por ejemplo, si se concede a un usuario de la base de datos el permiso EXECUTE sobre un esquema, pero se le deniega el permiso EXECUTE sobre un procedimiento almacenado de dicho esquema, el usuario no podrá ver los metadatos de dicho procedimiento almacenado.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.

Además, si a un usuario se le deniega el permiso EXECUTE sobre un esquema pero se le concede el permiso EXECUTE sobre un procedimiento almacenado de dicho esquema, el usuario no podrá ver los metadatos de dicho procedimiento almacenado.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.

Otro ejemplo sería que a un usuario se le concediese y denegase a la vez el permiso EXECUTE sobre un procedimiento almacenado (esto es posible a través de la pertenencia a distintos roles); en este caso, DENY tendría prioridad y el usuario no podría ver los metadatos del procedimiento almacenado.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.

Visibilidad de los metadatos de subcomponentesVisibility of Subcomponent Metadata

La visibilidad de subcomponentes, como índices, restricciones CHECK y desencadenadores, viene determinada por los permisos del elemento principal.The visibility of subcomponents, such as indexes, check constraints, and triggers is determined by permissions on the parent. Estos subcomponentes no disponen de permisos que puedan concederse.These subcomponents do not have grantable permissions. Por ejemplo, si a un usuario se le concede algún permiso sobre una tabla, el usuario podrá ver los metadatos de las tablas, columnas, índices, restricciones CHECK, desencadenadores y otros subcomponentes de este tipo.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.

Metadatos a los que pueden obtener acceso todos los usuarios de la base de datosMetadata That Is Accessible to All Database Users

Algunos metadatos están disponibles para todos los usuarios de una base de datos específica.Some metadata must be accessible to all users in a specific database. Por ejemplo, los grupos de archivos no disponen de permisos que puedan concederse; por lo tanto, no se puede conceder permiso a un usuario para ver los metadatos de un grupo de archivos.For example, filegroups do not have conferrable permissions; therefore, a user cannot be granted permission to view the metadata of a filegroup. Pero cualquier usuario que pueda crear una tabla deberá poder acceder a los metadatos de un grupo de archivos para usar las cláusulas ON filegroup o TEXTIMAGE_ON filegroup de la instrucción 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.

Los metadatos devueltos por las funciones DB_ID() y DB_NAME() se encuentran visibles para todos los usuarios.The metadata that is returned by the DB_ID() and DB_NAME() functions is visible to all users.

En la siguiente tabla se muestran las vistas de catálogo que se encuentran visibles para el rol public .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

Consulte tambiénSee Also

GRANT (Transact-SQL) GRANT (Transact-SQL)
DENY (Transact-SQL) DENY (Transact-SQL)
REVOKE (Transact-SQL) REVOKE (Transact-SQL)
EXECUTE AS (cláusula de Transact-SQL) EXECUTE AS Clause (Transact-SQL)
Vistas de catálogo (Transact-SQL) Catalog Views (Transact-SQL)
Vistas de compatibilidad (Transact-SQL)Compatibility Views (Transact-SQL)