SQL Server EXECUTE AS trouble

13

Saya kehilangan sesuatu saat mencoba menggunakan prosedur tersimpan saya EXECUTE AS. Prosedur tersimpan adalah membaca data dari source_db, mengumpulkannya dan menyimpan hasilnyatarget_db .

SP itu sendiri ada di target_db. Saya memiliki login khusus dan memetakannya untuk pengguna di kedua source_dbdan target_dbuntuk pemilik sp (jadi ada pengguna app_agentmasuk source_dbdan target_dbmasuk untuk masukapp_agent ).

Jika saya login sebagai app_agent, dan jalankan

EXEC target_db.app_agent_schema.import_data

semuanya bekerja dengan baik. Tetapi jika saya berubah

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

dan coba jalankan, itu melempar

Server utama "app_agent" tidak dapat mengakses database "source_db" di bawah konteks keamanan saat ini.

Saya menggunakan SQL Server 2008.

Bisakah seseorang menunjukkan kesalahan saya?

Terima kasih

Pembaruan Setelah melakukan beberapa penelitian, saya menemukan bahwa ALTER DATABASE target_db SET TRUSTWORTHY ONmenyelesaikan masalah, tetapi itu sepertinya bukan solusi yang tepat bagi saya ...

a1ex07
sumber
1
Saya kira jawabannya adalah dengan menggunakan basis data -tingkat lintas-database rantai kepemilikan pilihan. Saya dapat mereproduksi kesalahan dalam skenario Anda, tetapi tidak ada cukup detail yang diberikan untuk mengetahui apakah saya mereproduksi dengan tepat ... opsi CDOC tidak bekerja untuk saya, tetapi cobalah dan lihat apakah itu berhasil.
Jon Seigel

Jawaban:

24

Ini dijelaskan dalam Memperluas Peniruan Database dengan Menggunakan EXECUTE AS . Konteks EXECUTE AS hanya dipercaya dalam database saat ini dan memungkinkannya untuk tumpah ke database lain adalah eskalasi vektor serangan privilege.

Ada dua solusi, keduanya dijelaskan dalam artikel yang ditautkan di atas:

  • yang mudah adalah untuk menandai dapat dipercaya basis data: ALTER DATABASE [source_db] SET TRUSTWORTHY ON;. Meskipun mudah, juga berbahaya di karena membuat dbodari source_dbsebuah de-facto sysadmin.

  • yang aman adalah menggunakan penandatanganan kode, lihat Memanggil prosedur di database lain untuk contoh. Ini lebih kompleks, tetapi 100% keamanan buletproff.

Remus Rusanu
sumber
0

Pengguna mana yang menjalankan perintah ALTER PROSEDUR? Itu mungkin telah mengatur tingkat akses Pemilik (diri) ke pengguna itu, bukan yang Anda maksudkan.

Langit
sumber
Pengguna yang sama yang membuat prosedur ( app_agent). Jika saya memiliki prosedur yang dibuat oleh app_agenttanpa execute as owner/self, masuk sebagai app_agent, SP dijalankan dengan benar. Jika saya menambahkan EXECUTE AS SELF(lagi, pengguna yang sama), dan masuk bahkan app_agent, saya mendapatkan...is not able to access the database...
a1ex07