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_db
dan target_db
untuk pemilik sp (jadi ada pengguna app_agent
masuk source_db
dan target_db
masuk 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 ON
menyelesaikan masalah, tetapi itu sepertinya bukan solusi yang tepat bagi saya ...
sumber
Jawaban:
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 membuatdbo
darisource_db
sebuah de-factosysadmin
.yang aman adalah menggunakan penandatanganan kode, lihat Memanggil prosedur di database lain untuk contoh. Ini lebih kompleks, tetapi 100% keamanan buletproff.
sumber
Pengguna mana yang menjalankan perintah ALTER PROSEDUR? Itu mungkin telah mengatur tingkat akses Pemilik (diri) ke pengguna itu, bukan yang Anda maksudkan.
sumber
app_agent
). Jika saya memiliki prosedur yang dibuat olehapp_agent
tanpaexecute as owner/self
, masuk sebagaiapp_agent
, SP dijalankan dengan benar. Jika saya menambahkanEXECUTE AS SELF
(lagi, pengguna yang sama), dan masuk bahkanapp_agent
, saya mendapatkan...is not able to access the database...