Cadeias de propriedade

Quando vários objetos de banco de dados acessam uns aos outros seqüencialmente, essa seqüência é conhecida como uma cadeia. Embora essas cadeias não existam independentemente, quando o SQL Server se desvia de links em uma cadeia, o SQL Server avalia as permissões nos objetos do cliente de forma diferente do que faria se estivesse acessando os objetos separadamente. Estas diferenças têm implicações importantes no gerenciamento de segurança.

A cadeia de propriedade permite o gerenciamento de acesso a vários objetos, como várias tabelas, definindo permissões em um objeto, como uma exibição. A cadeia de propriedade também oferece uma pequena vantagem de desempenho em cenários que permitem ignorar as verificações de permissão.

Como as permissões são verificadas em uma cadeia

Quando um objeto é acessado através de uma cadeia, o SQL Server primeiro compara o proprietário do objeto com o proprietário do objeto de chamada. Este é o link anterior da cadeia. Se os dois objetos tiverem o mesmo proprietário, as permissões no objeto referido não serão avaliadas.

Exemplo de cadeia de propriedade

Na ilustração a seguir, a exibição July2003 é propriedade de Mary. Ela concedeu a Alex permissões na exibição. Ele não tem nenhuma outra permissão nos objetos de banco de dados desta instância. O que acontece quando o Alex seleciona a exibição?

Diagrama de cadeia de propriedade

  1. Alex executa SELECT * na exibição July2003. O SQL Server verifica as permissões na exibição e confirma que Alex tem permissão para selecioná-la.

  2. A exibição July2003 requer informações da exibição SalesXZ. O SQL Server verifica a propriedade da exibição SalesXZ. Como esta exibição tem o mesmo proprietário (Mary) da exibição que a chama, as permissões em SalesXZ não são verificadas. As informações necessárias são retornadas.

  3. A exibição SalesXZ requer informações da exibição InvoicesXZ. O SQL Server verifica a propriedade da exibição InvoicesXZ. Como esta exibição tem o mesmo proprietário do objeto anterior, as permissões em InvoicesXZ não são verificadas. As informações necessárias são retornadas. Neste ponto, todos os itens na seqüência tiveram um proprietário (Mary). Isso é conhecido como uma cadeia de propriedade contínua.

  4. A exibição InvoicesXZ requer informações da exibição AcctAgeXZ. O SQL Server verifica a propriedade da exibição AcctAgeXZ. Como o proprietário desta exibição é diferente do proprietário do objeto anterior (Sam, não Mary), informações completas sobre as permissões nesta exibição são recuperadas. Se a exibição AcctAgeXZ tiver permissões que habilitem o acesso por Alex, informações serão retornadas.

  5. A exibição AcctAgeXZ requer informações da tabela ExpenseXZ. O SQL Server verifica a propriedade da tabela ExpenseXZ. Como o proprietário desta tabela é diferente do proprietário do objeto anterior (Joe, não Sam), informações completas sobre as permissões nesta tabela são recuperadas. Se a tabela ExpenseXZ tiver permissões que habilitem o acesso por Alex, informações serão retornadas.

  6. Quando a exibição July2003 tenta recuperar informações da tabela ProjectionsXZ, primeiro o servidor faz uma verificação para constatar se a cadeia de banco de dados está habilitada entre Database 1 e Database 2. Se a cadeia de banco de dados estiver habilitada, o servidor verificará a propriedade da tabela ProjectionsXZ. Como esta tabela tem o mesmo proprietário da exibição de chamada (Mary), as permissões não serão verificadas nela. As informações solicitadas são retornadas.

Cadeia de propriedades de bancos de dados

O SQL Server pode ser configurado para permitir a cadeia de propriedade entre bancos de dados específicos ou todos os bancos de dados dentro de uma única instância do SQL Server. A cadeia de propriedade de banco de dados é desabilitada por padrão e não deve ser habilitada, a menos que isso seja especificamente necessário.

Ameaças possíveis

A cadeia de propriedade é muito útil no gerenciamento de permissões em um banco de dados, mas não supõe que os proprietários do objeto antecipem todas as conseqüências de cada decisão tomada para conceder permissão de forma segura. Na ilustração anterior, Mary possuía a maioria dos objetos subjacentes da exibição July2003. Como Mary tem o direito de tornar os objetos que pertencem a ela acessíveis a qualquer outro usuário, o SQL Server se comporta como se Mary, sempre que concedesse acesso à primeira exibição em uma cadeia, tivesse tomado uma decisão consciente de compartilhar as exibições e a tabela à qual elas se referem. Na vida real, isso poderia não ser uma suposição válida. Os bancos de dados de produção são muito mais complexos do que o da ilustração e as permissões que regem o acesso a esses bancos de dados raramente são mapeadas perfeitamente para as estruturas administrativas das organizações que os usam.

É necessário entender que os membros de funções de bancos de dados com muitos privilégios podem usar a cadeia de propriedade de banco de dados para acessar objetos nos bancos de dados externos às suas propriedades. Por exemplo, se a cadeia de propriedade de banco de dados estiver habilitada entre o banco de dados A e B, um membro da função de banco de dados fixa db_owner de um desses bancos de dados poderá lograr o caminho para outro banco de dados. O processo é simples: Diane (membro de db_owner no banco de dados A) cria o usuário Stuart no banco de dados A. Stuart já existe como usuário no banco de dados B. Então Diane cria um objeto (de propriedade de Stuart) no banco de dados A que chame qualquer objeto que pertença a Stuart no banco de dados B. Como os objetos que já foram e que estão sendo chamados têm um proprietário comum, as permissões no objeto do banco de dados B não serão verificadas quando Diane acessá-lo através do objeto que ela criou.

Consulte também

Conceitos