Eu tenho dois bancos de dados, ambos de propriedade do sa
. Todos os objetos em ambos os bancos de dados estão no esquema dbo
.
Eu tenho um usuário bob
em dbSafe
que precisa selecionar em uma exibição que une tabelas de dbSafe
e dbRestricted
. Não quero conceder bob
permissão direta a essas tabelas em dbRestricted
, pois elas contêm colunas que não quero bob
ver.
Eu concedi bob
SELECT
permissão na exibição e SET DB_CHAINING ON
nos dois bancos de dados, mas ainda estou recebendo um erro:
O servidor principal "bob" não pode acessar o banco de dados "dbRestricted" no contexto de segurança atual.
Estou entendendo mal o que o encadeamento entre bancos de dados faz ?
Se o objeto de origem no banco de dados de origem e os objetos de destino nos bancos de dados de destino forem de propriedade da mesma conta de logon, o SQL Server não verificará as permissões nos objetos de destino.
O encadeamento de banco de dados pode funcionar neste cenário, com o proprietário sa
e o esquema do banco de dados dbo
? Ou tem que ser uma conta de login explícita/esquema não padrão?
A resposta aceita para essa pergunta sugere a criação de uma visualização dbRestricted
e a atribuição de permissão direta a bob
, isso funcionaria neste caso? E se adicionar uma visualização a esse banco de dados não for uma opção para mim (devido a restrições de desenvolvedor/fornecedor)? Não é para isso que serve o encadeamento entre bancos de dados?
Você precisa criar um usuário para bob em
dbRestricted
. Você não precisa conceder acesso bob à tabela emdbRestricted
.Este exemplo verificável minimamente completo mostra isso em ação:
Se removermos o encadeamento de propriedade entre bancos de dados, veremos que isso falha:
Use isso para limpar depois:
Se, em vez de uma exibição, seu usuário
bob
puder selecionar uma função com valor de tabela (TVF) de várias instruções ou executar um procedimento armazenado, isso poderá ser feito com mais segurança (ou seja, sem habilitar o encadeamento de propriedade entre bancos de dados em qualquer banco de dados, e sem criar um usuário parabob
emdbRestricted
).O principal problema com o Cross-DB Ownership Chaining é que você só pode restringi-lo não criando um usuário equivalente
dbRestricted
(ou seja, emulando a situação que o levou a postar esta pergunta). Mas qualquer usuário em ambos os bancos de dados agora poderá ter objetos neste banco de dados de acesso a objetos emdbRestricted
. Assumindo que a maioria (se não todos) os objetos estão nodbo
Schema, ou um Schema de propriedade dedbo
, então isso é praticamente tudo. E, mesmo que essa View seja o único objeto a ser acessadodbRestricted
hoje, você não pode impedir que outras pessoas adicionem objetos a esse banco de dados no futuro que acessem objetos emdbRestricted
.Em vez de criar duas possíveis falhas de segurança em seu sistema, você pode usar a assinatura de módulo para atingir esse objetivo com a maior segurança possível. Eu tenho um código de exemplo mostrando como na resposta a seguir, também aqui no DBA.SE:
Acessar a exibição com base na tabela em outro banco de dados sem conta nesse outro banco de dados