Estou perdendo algo ao tentar fazer meu procedimento armazenado usar arquivos EXECUTE AS
. O procedimento armazenado está lendo dados de source_db
, agrega-os e armazena o resultado em target_db
.
O sp em si está em target_db
. Eu tenho um login dedicado e o mapeio para usuários em ambos source_db
e target_db
para o proprietário do sp (portanto, há um usuário app_agent
in source_db
e in target_db
para login app_agent
).
Se eu fizer login como app_agent
, 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 servidor principal "app_agent" não pode acessar o banco de dados "source_db" no contexto de segurança atual.
Estou usando o SQLServer 2008.
Alguém poderia apontar meu erro?
Obrigado
Atualização
Depois de fazer algumas pesquisas, descobri que ALTER DATABASE target_db SET TRUSTWORTHY ON
resolve o problema, mas não me parece a solução certa...
Isso é explicado em Estendendo a personificaçã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 é marcar o banco de dados TRUSTWORTHY:
ALTER DATABASE [source_db] SET TRUSTWORTHY ON;
. Apesar de fácil, também é perigoso na medida em que faz odbo
desource_db
-factosysadmin
.o seguro é usar assinatura de código, consulte Chamar um procedimento em outro banco de dados para obter um exemplo. Isso é mais complexo, mas é 100% de segurança buletproff.
Qual usuário executa o comando ALTER PROCEDURE? Ele pode ter definido o nível de acesso Proprietário (próprio) para esse usuário, não aquele que você pretendia.