Me falta algo al intentar utilizar mi procedimiento almacenado EXECUTE AS
. El procedimiento almacenado lee datos source_db
, los agrega y almacena los resultados target_db
.
El sp en sí está adentro target_db
. Tengo un inicio de sesión dedicado y lo asigno a los usuarios en ambos source_db
y target_db
para el propietario de sp (por lo que hay un usuario app_agent
en source_db
y target_db
para iniciar sesión app_agent
).
Si inicio sesión como app_agent
y ejecuto
EXEC target_db.app_agent_schema.import_data
Todo funciona bien. Pero si cambio
ALTER PROCEDURE app_agent_schema.import_data WITH EXECUTE AS OWNER` (or `AS SELF`)
e intenta ejecutarlo, arroja
El servidor principal "app_agent" no puede acceder a la base de datos "source_db" en el contexto de seguridad actual.
Estoy usando SQL Server 2008.
¿Alguien podría señalar mi error?
Gracias
Actualización
Después de investigar un poco, descubrí que ALTER DATABASE target_db SET TRUSTWORTHY ON
resuelve el problema, pero eso no me parece la solución correcta ...
fuente
Respuestas:
Esto se explica en Ampliación de la suplantación de bases de datos mediante EXECUTE AS . El contexto EJECUTAR COMO solo se confía en la base de datos actual y permitir que se extienda a otras bases de datos es una escalada del vector de ataque de privilegios.
Hay dos soluciones, ambas descritas en el artículo vinculado anteriormente:
la fácil es para marcar el CONFIABLE base de datos:
ALTER DATABASE [source_db] SET TRUSTWORTHY ON;
. Aunque es fácil, también es peligroso, ya que hace que ladbo
desource_db
un de-factosysadmin
.el seguro es usar la firma de código, consulte Llamar a un procedimiento en otra base de datos para ver un ejemplo. Esto es más complejo, pero es 100% seguro de seguridad.
fuente
¿Qué usuario ejecuta el comando ALTER PROCEDURE? Es posible que haya establecido el nivel de acceso Propietario (propio) para ese usuario, no el que usted pretendía.
fuente
app_agent
). Si tengo un procedimiento creado porapp_agent
sinexecute as owner/self
, inicie sesión comoapp_agent
, SP se ejecuta correctamente. Si agregoEXECUTE AS SELF
(de nuevo, el mismo usuario) e inicio sesión incluso comoapp_agent
, obtengo...is not able to access the database...