Criei a view no banco de dados1 com base em tabelas no banco de dados2. Eu dei SELECT
permissão a um usuário que tem acesso apenas ao banco de dados1. O usuário não pode fazer com que essa visualização funcione porque não possui uma conta no banco de dados2. Como posso resolver este problema? Não quero criar uma conta no banco de dados2.
10
TRUSTWORTHY ON
ou fazer com que o aplicativo efetue login comosa
. O encadeamento de propriedade do DB eTRUSTWORTHY
existe principalmente devido a ser a única solução no momento. Mas agora, mesmo que não seja um grande risco, o DB Chaining é certamente um risco desnecessário, pois a assinatura do módulo não é tão difícil. E se alguém confiar no encadeamento de banco de dados e depois usar o SQL dinâmico, é mais provável que ele definaTRUSTWORTHY ON
para corrigi-lo, enquanto que com a assinatura do módulo não teria quebrado.DB_CHAINING
não é mais arriscado do que o encadeamento de propriedade dentro do banco de dados quando os objetos deveriam estar no mesmo banco de dados.DB_CHAINING
é bastante arriscado.Respostas:
Isso é fácil de ser feito de uma maneira muito segura, usando a assinatura do módulo. Isso será semelhante às duas respostas a seguir, também aqui no DBA.StackExchange, que dão exemplos de como fazer isso:
Segurança de procedimento armazenado com execução como, consultas entre bancos de dados e assinatura de módulo
Permissões em gatilhos ao usar certificados entre bancos de dados
A diferença para essa pergunta em particular é que ela lida com uma Visualização e as Visualizações não podem ser assinadas. Portanto, você precisará alterar a Visualização em uma função com valor de tabela (TVF) de múltiplas instruções, pois elas podem ser assinadas e podem ser acessadas como uma Visualização (bem, para
SELECT
acesso).O código de exemplo a seguir mostra exatamente o que está sendo solicitado na pergunta, pois o Login / Usuário "RestrictedUser" só tem acesso ao "DatabaseA" e ainda pode obter dados do "DatabaseB". Isso funciona apenas selecionando esse TVF e apenas devido ao fato de ter sido assinado.
Para realizar esse tipo de acesso ao banco de dados enquanto ainda estiver usando uma Visualização, e sem conceder permissões adicionais ao Usuário, seria necessário ativar o Encadeamento de Propriedade entre Bancos de Dados. Isso é muito menos seguro porque é completamente aberto para todos os objetos entre os dois bancos de dados (não pode ser restrito a determinados objetos e / ou usuários). A assinatura do módulo permite que apenas este
SELECT
TVF tenha acesso entre bancos de dados (o usuário não tem permissão, o TVF) e os usuários que não podem do TVF não têm acesso ao "Banco de DadosB".Todas as etapas acima recriam a situação atual: o usuário tem acesso ao banco de dados A, tem permissão para interagir com um objeto no banco de dados A, mas recebe um erro devido a esse objeto no banco de dados A acessando algo no banco de dados B onde o usuário não tem acesso.
Os passos abaixo configuram o canto do módulo. Faz o seguinte:
SELECT
permissão à Tabela no Banco de DadosB ao Usuário Baseado em CertificadoConfiguração de assinatura do módulo:
SE O ACESSO PRECISA SER ATRAVÉS DE UMA VISTA, por qualquer motivo, você pode simplesmente criar uma Visualização que selecione a partir do TVF mostrado acima. E, nessa situação, o
SELECT
acesso não precisa ser concedido ao TVF, apenas ao View, conforme demonstrado abaixo:E agora para testá-lo:
Para mais informações sobre a assinatura do módulo, visite: https://ModuleSigning.Info/
fonte
ALTER CERTIFICATE ... DROP PRIVATE KEY
, a chave privada desaparecerá se você não fizer o backup primeiro em um arquivo usando BACKUP CERTIFICATE . Mas, a chave pública ainda está dentrosys.certificates
. E a chave pública não precisa da senha. Somente o uso da chave privada para assinar um módulo requer a senha (que é a mesma nos servidores, diferente da proteção via chave mestra).