Je manque quelque chose en essayant d'utiliser ma procédure stockée EXECUTE AS
. La procédure stockée lit les données source_db
, les agrège et stocke le résultat target_db
.
Le sp lui-même est dedans target_db
. J'ai une connexion dédiée et la mappe aux utilisateurs à la fois source_db
et target_db
pour le propriétaire de sp (donc il y a un utilisateur app_agent
dans source_db
et target_db
pour la connexion app_agent
).
Si je me connecte en tant que app_agent
et que j'exécute
EXEC target_db.app_agent_schema.import_data
tout fonctionne bien. Mais si je change
ALTER PROCEDURE app_agent_schema.import_data WITH EXECUTE AS OWNER` (or `AS SELF`)
et essayez de l'exécuter, il lance
Le principal du serveur "app_agent" n'est pas en mesure d'accéder à la base de données "source_db" dans le contexte de sécurité actuel.
J'utilise SQL Server 2008.
Quelqu'un pourrait-il signaler mon erreur?
Merci
Mise à jour
Après avoir fait quelques recherches, j'ai trouvé que cela ALTER DATABASE target_db SET TRUSTWORTHY ON
résout le problème, mais cela ne semble pas être la bonne solution pour moi ...
la source
Réponses:
Ceci est expliqué dans Extension de l'emprunt d'identité de base de données en utilisant EXECUTE AS . Le contexte EXECUTE AS n'est approuvé que dans la base de données actuelle et lui permettre de se propager à d'autres bases de données est une escalade du vecteur d'attaque de privilège.
Il existe deux solutions, toutes deux décrites dans l'article lié ci-dessus:
le plus facile est de marquer la base de données FIABLE:
ALTER DATABASE [source_db] SET TRUSTWORTHY ON;
. Bien que facile, est aussi dangereuse car elle rend ladbo
d'source_db
un de factosysadmin
.le plus sûr est d'utiliser la signature de code, voir Appeler une procédure dans une autre base de données pour un exemple. C'est plus complexe, mais c'est une sécurité 100% buletproff.
la source
Quel utilisateur exécute la commande ALTER PROCEDURE? Il peut avoir défini le niveau d'accès Propriétaire (auto) à cet utilisateur, pas celui que vous vouliez.
la source
app_agent
). Si j'ai une procédure créée parapp_agent
sansexecute as owner/self
, connectez-vous en tant queapp_agent
, SP s'exécute correctement. Si j'ajouteEXECUTE AS SELF
(encore une fois, le même utilisateur) et queapp_agent
je me connecte même en tant que , je reçois...is not able to access the database...