Problemi con SQL Server EXECUTE AS


13

Mi manca qualcosa durante il tentativo di utilizzare la mia stored procedure EXECUTE AS. La procedura memorizzata sta leggendo i dati source_db, li aggrega e memorizza i risultati target_db.

Lo sp stesso è dentro target_db. Ho un accesso dedicato e sulla mappa per gli utenti sia in source_dbe target_dbper il proprietario di sp (per cui v'è un utente app_agentin source_dbe target_dbper il loginapp_agent ).

Se accedo come app_agent, ed eseguo

EXEC target_db.app_agent_schema.import_data

tutto funziona bene. Ma se cambio

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

e prova a eseguirlo, lancia

L'entità server "app_agent" non è in grado di accedere al database "source_db" nel contesto di sicurezza corrente.

Sto usando SQL Server 2008.

Qualcuno potrebbe segnalare il mio errore?

Grazie

Aggiornamento Dopo aver fatto qualche ricerca, ho scoperto che ALTER DATABASE target_db SET TRUSTWORTHY ONrisolve il problema, ma non sembra la soluzione giusta per me ...


1
Penso che la risposta stia utilizzando l' opzione della catena di proprietà tra database a livello di database . Sono stato in grado di riprodurre l'errore nel tuo scenario, ma non ci sono abbastanza dettagli forniti per sapere se l'ho riprodotto esattamente ... L'opzione CDOC non ha funzionato per me, ma provalo e vedi se lo fa.
Jon Seigel,

Risposte:


24

Questo è spiegato in Estensione della rappresentazione del database utilizzando EXECUTE AS . Il contesto EXECUTE AS è attendibile solo nel database corrente e consentire che si riversi su altri database è un'escalation del vettore di attacco privilegio.

Esistono due soluzioni, entrambe descritte nell'articolo collegato sopra:

  • la facile uno è quello di contrassegnare il TRUSTWORTHY database: ALTER DATABASE [source_db] SET TRUSTWORTHY ON;. Sebbene facile, è anche pericoloso in quanto rende dbodi fatto source_dbun de factosysadmin .

  • quello sicuro è usare la firma del codice, vedere Chiamare una procedura in un altro database per un esempio. Questo è più complesso, ma è una sicurezza al 100%.


0

Quale utente esegue il comando ALTER PROCEDURE? Potrebbe aver impostato il livello di accesso del proprietario (auto) a quell'utente, non quello desiderato.


Lo stesso utente che ha creato procedure ( app_agent). Se ho una procedura creata da app_agentsenza execute as owner/self, accedi come app_agent, SP viene eseguito correttamente. Se aggiungo EXECUTE AS SELF(di nuovo, lo stesso utente) e app_agent...is not able to access the database...
accedo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.