Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
A visibilidade dos metadados é limitada a objetos seguráveis que um usuário possui ou nos quais o usuário recebeu alguma permissão. Por exemplo, a consulta a seguir retornará uma linha se o usuário tiver recebido uma permissão, como SELECT ou INSERT na tabela myTable.
SELECT name, object_id
FROM sys.tables
WHERE name = 'myTable';
GO
No entanto, se o usuário não tiver nenhuma permissão em myTable, a consulta retornará um conjunto de resultados vazio.
Escopo e impacto da configuração de visibilidade de metadados
A configuração de visibilidade de metadados só se aplica aos recursos de segurança a seguir.
| Exibições de catálogo | Procedimentos armazenados sp_help do Mecanismo de Banco de Dados |
| Metadados expondo funções internas | Visualizações do esquema de informações |
| Exibições de compatibilidade | Propriedades estendidas |
A configuração de visibilidade de metadados não se aplica aos elementos protegíveis a seguir.
| Tabelas do sistema de envio de logs | Tabelas do sistema do SQL Server Agent |
| Tabelas do sistema de plano de manutenção de banco de dados | Tabelas do sistema de backup |
| Tabelas do sistema de replicação | Replicação e os procedimentos armazenados do SQL Server Agent sp_help |
A acessibilidade de metadados limitada significa o seguinte:
Aplicativos que pressupõem acesso a metadados públicos irão falhar.
Consultas em exibições do sistema podem retornar apenas um subconjunto de linhas ou, às vezes, um conjunto de resultados vazio.
Funções internas que emitem metadados, como OBJECTPROPERTYEX, podem retornar NULL.
Os procedimentos armazenados do Mecanismo de Banco de Dados sp_help podem retornar apenas um subconjunto de linhas ou NULL.
Os módulos SQL, como procedimentos armazenados e gatilhos, são executados no contexto de segurança do chamador e, portanto, têm acessibilidade limitada de metadados. Por exemplo, no código a seguir, quando o procedimento armazenado tenta acessar metadados para a tabela myTable na qual o chamador não tem direitos, um conjunto de resultados vazio é retornado. Em versões anteriores do SQL Server, uma linha é retornada.
CREATE PROCEDURE assumes_caller_can_access_metadata
BEGIN
SELECT name, id
FROM sysobjects
WHERE name = 'myTable';
END;
GO
Para permitir que os chamadores exibam metadados, você pode conceder aos chamadores a permissão VIEW DEFINITION em um escopo apropriado: nível de objeto, nível de banco de dados ou servidor. Portanto, no exemplo anterior, se o chamador tiver a permissão VIEW DEFINITION ativada myTable, o procedimento armazenado retornará uma linha. Para obter mais informações, consulte GRANT (Transact-SQL) e GRANT Database Permissions (Transact-SQL).
Você também pode modificar o procedimento armazenado para que ele seja executado sob as credenciais do proprietário. Quando o proprietário do procedimento e o proprietário da tabela são o mesmo proprietário, o encadeamento de propriedade se aplica e o contexto de segurança do proprietário do procedimento permite o acesso aos metadados para myTable. Nesse cenário, o código a seguir retorna uma linha de metadados para o chamador.
Observação
O exemplo a seguir usa a exibição de catálogo sys.objects em vez da exibição de compatibilidade sys.sysobjects .
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
Observação
Você pode usar EXECUTE AS para alternar temporariamente para o contexto de segurança do chamador. Para obter mais informações, consulte EXECUTE AS (Transact-SQL).
Benefícios e limites da configuração de visibilidade de metadados
A configuração de visibilidade de metadados pode desempenhar um papel importante em seu plano de segurança geral. No entanto, há casos em que um usuário qualificado e determinado pode forçar a divulgação de alguns metadados. Recomendamos que você implante permissões de metadados como uma das muitas defesas detalhadas.
Teoricamente, é possível forçar a emissão de metadados em mensagens de erro manipulando a ordem da avaliação do predicado em consultas. A possibilidade de ataques de tentativa e erro não é específica para o SQL Server. Ela é implícita pelas transformações associativas e commutativas permitidas na álgebra relacional. Você pode atenuar esse risco limitando as informações retornadas em mensagens de erro. Para restringir ainda mais a visibilidade dos metadados dessa maneira, você pode iniciar o servidor com o sinalizador de rastreamento 3625. Esse sinalizador de rastreamento limita a quantidade de informações mostradas em mensagens de erro. Por sua vez, isso ajuda a evitar divulgações forçadas. A desvantagem é que as mensagens de erro serão concisas e podem ser difíceis de usar para fins de depuração. Para obter mais informações, consulte Opções de Inicialização do Mecanismo de Banco de Dados e Sinalizadores de Rastreamento (Transact-SQL).
Os seguintes metadados não estão sujeitos à divulgação forçada:
O valor armazenado na coluna provider_string de sys.servers. Um usuário que não tem a permissão ALTER ANY LINKED SERVER verá um valor NULL nesta coluna.
Definição de origem de um objeto definido pelo usuário, como um procedimento armazenado ou gatilho. O código-fonte só fica visível quando um dos seguintes é verdadeiro:
O usuário tem a permissão VIEW DEFINITION no objeto.
A permissão VIEW DEFINITION não foi negada ao usuário no objeto, e ele tem permissão CONTROL, ALTER ou TAKE OWNERSHIP no objeto. Todos os outros usuários verão NULL.
As colunas de definição encontradas nas seguintes exibições de catálogo:
sys.all_sql_modules sys.sql_modules sys.server_sql_modules sys.check_constraints sys.default_constraints sys.computed_columns sys.numbered_procedures A coluna ctexto na visão de compatibilidade syscomments.
A saída do procedimento sp_helptext .
As seguintes colunas nas exibições de esquema de informações:
INFORMATION_SCHEMA.RESTRIÇÕES_DE_VERIFICAÇÃO.CLÁUSULA_DE_VERIFICAÇÃO INFORMATION_SCHEMA.COLUMNS.COLUMN_DEFAULT INFORMATION_SCHEMA. DOMÍNIOS. DOMAIN_DEFAULT INFORMATION_SCHEMA.ROUTINE_COLUMNS.COLUMN_DEFAULT INFORMATION_SCHEMA.ROUTINAS.DEFINICAO_ROTINA INFORMATION_SCHEMA. MODOS DE EXIBIÇÃO. VIEW_DEFINITION função OBJECT_DEFINITION()
O valor armazenado na coluna password_hash de sys.sql_logins. Um usuário que não tem a permissão CONTROL SERVER verá um valor NULL nesta coluna.
Observação
As definições sql de procedimentos e funções internas do sistema são publicamente visíveis por meio da exibição do catálogo sys.system_sql_modules , do procedimento armazenado sp_helptext e da função OBJECT_DEFINITION().
Princípios gerais de visibilidade de metadados
Veja a seguir alguns princípios gerais a serem considerados em relação à visibilidade dos metadados:
Permissões implícitas de funções fixas
Escopo de permissões
Precedência de Negação
Visibilidade dos metadados de subcomponente
Funções fixas e permissões implícitas
Os metadados que podem ser acessados por funções fixas dependem de suas permissões implícitas correspondentes.
Escopo de permissões
As permissões em um escopo implicam a capacidade de ver metadados nesse escopo e em todos os escopos fechados. Por exemplo, a permissão SELECT em um esquema implica que o concessionário tem permissão SELECT em todos os objetos de segurança contidos nesse esquema. A concessão da permissão SELECT em um esquema, portanto, permite que um usuário veja os metadados do esquema e também todas as tabelas, exibições, funções, procedimentos, filas, sinônimos, tipos e coleções de esquema XML dentro dele. Para obter mais informações sobre escopos, consulte Hierarquia de Permissões (Mecanismo de Banco de Dados).
Precedência de DENY
DENY normalmente tem precedência sobre outras permissões. Por exemplo, se um usuário de banco de dados receber permissão EXECUTE em um esquema, mas tiver sido negada a permissão EXECUTE em um procedimento armazenado nesse esquema, o usuário não poderá exibir os metadados desse procedimento armazenado.
Além disso, se um usuário tiver a permissão EXECUTE negada em um esquema, mas tiver recebido permissão EXECUTE em um procedimento armazenado nesse esquema, o usuário não poderá exibir os metadados desse procedimento armazenado.
Por outro exemplo, se um usuário tiver recebido e negado a permissão EXECUTE em um procedimento armazenado, o que é possível por meio de suas várias associações de função, DENY terá precedência e o usuário não poderá exibir os metadados do procedimento armazenado.
Visibilidade dos metadados de subcomponente
A visibilidade de subcomponentes, como índices, restrições de verificação e gatilhos, é determinada por permissões no objeto pai. Esses subcomponentes não têm permissões que podem ser concedidas. Por exemplo, se um usuário tiver recebido alguma permissão em uma tabela, o usuário poderá exibir os metadados das tabelas, colunas, índices, restrições de verificação, gatilhos e outros subcomponentes.
Metadados acessíveis a todos os usuários do banco de dados
Alguns metadados devem estar acessíveis a todos os usuários em um banco de dados específico. Por exemplo, grupos de arquivos não têm permissões de conferência; portanto, um usuário não pode receber permissão para exibir os metadados de um grupo de arquivos. No entanto, qualquer usuário que possa criar uma tabela deve ser capaz de acessar metadados de grupos de arquivos para usar as cláusulas ON grupo de arquivos ou TEXTIMAGE_ON grupo de arquivos na instrução CREATE TABLE.
Os metadados retornados pelas funções DB_ID() e DB_NAME() são visíveis para todos os usuários.
A tabela a seguir lista as exibições de catálogo visíveis para a função pública .
| sys.partition_functions | sys.partition_range_values |
| sys.partition_schemes | sys.data_spaces |
| sys.filegroups | sys.destination_data_spaces |
| sys.database_files | sys.allocation_units |
| sys.partitions | sys.messages |
| sys.schemas | sys.configurations |
| sys.sql_dependencies | sys.type_assembly_usages |
| sys.parameter_type_usages | sys.column_type_usages |
Consulte Também
GRANT (Transact-SQL)
DENY (Transact-SQL)
REVOKE (Transact-SQL)
Cláusula EXECUTE AS (Transact-SQL)
Exibições do Catálogo (Transact-SQL)
Exibições de compatibilidade (Transact-SQL)