Problema do SQL Server EXECUTE AS

13

Estou faltando alguma coisa ao tentar usar o meu procedimento armazenado EXECUTE AS. O procedimento armazenado está lendo dados source_db, agrega-os e armazena o resultado target_db.

O SP está em target_db. Eu tenho um login dedicado e mapeio-o para usuários do proprietário source_dbe target_dbdo sp (para que exista um usuário app_agentdentro source_dbe dentro target_dbdo login app_agent).

Se eu app_agentefetuar login como e executar

EXEC target_db.app_agent_schema.import_data

tudo funciona bem. Mas se eu mudar

ALTER PROCEDURE app_agent_schema.import_data WITH EXECUTE AS OWNER` (or `AS SELF`) 

e tente executá-lo, ele lança

O principal do servidor "app_agent" não pode acessar o banco de dados "source_db" no contexto de segurança atual.

Estou usando o SQL Server 2008.

Alguém poderia apontar o meu erro?

obrigado

Atualizar Depois de fazer algumas pesquisas, descobri que ALTER DATABASE target_db SET TRUSTWORTHY ONresolve o problema, mas isso não parece a solução certa para mim ...

a1ex07
fonte
1
Acho que a resposta está usando a opção de cadeia de propriedade entre bancos de dados em nível de banco de dados . Consegui reproduzir o erro no seu cenário, mas não há detalhes suficientes para saber se eu o reproduzi exatamente ... a opção CDOC não funcionou para mim, mas experimente e verifique se isso ocorre.
Jon Seigel

Respostas:

24

Isso é explicado em Estendendo a representação do banco de dados usando EXECUTE AS . O contexto EXECUTE AS é confiável apenas no banco de dados atual e permitir que ele se espalhe para outros bancos de dados é uma escalada do vetor de ataque de privilégio.

Existem duas soluções, ambas descritas no artigo vinculado acima:

  • o mais fácil é para marcar o TRUSTWORTHY banco de dados: ALTER DATABASE [source_db] SET TRUSTWORTHY ON;. Apesar de fácil, é também perigoso, pois faz o dbode source_dbum de-facto sysadmin.

  • o mais seguro é usar assinatura de código, consulte Chamar um procedimento em outro banco de dados, por exemplo. Isso é mais complexo, mas é 100% de segurança contra descargas.

Remus Rusanu
fonte
0

Qual usuário executa o comando ALTER PROCEDURE? Pode ter definido o nível de acesso do proprietário para esse usuário, não o que você pretendia.

Céu
fonte
O mesmo usuário que criou o procedimento ( app_agent). Se eu tiver um procedimento criado por app_agentsem execute as owner/self, efetue login como app_agent, o SP será executado corretamente. Se eu adicionar EXECUTE AS SELF(novamente, o mesmo usuário), e entrar, mesmo quando app_agent, recebo...is not able to access the database...
a1ex07