Cadeias de propriedade
Quando vários objetos de banco de dados acessam uns aos outros sequencialmente, essa sequê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?
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.
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.
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 sequência tiveram um proprietário (Mary). Isso é conhecido como uma cadeia de propriedade contínua.
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.
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.
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 consequê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. Diane então cria um objeto (de propriedade de Stuart) no banco de dados A que chama qualquer objeto de propriedade de Stuart no banco de dados B. Como os objetos de chamada e chamados têm um proprietário comum, as permissões ao objeto no banco de dados B não serão verificadas quando Diane acessá-lo através do objeto que ela criou.