Masalah dengan Izin Basis Data untuk sp_send_mail

8

Saya mencoba mengirim email basis data tetapi saya dapat EXECUTE permission denied on the object 'sp_send_dbmail' database 'msdb', schema 'dbo'.. Kode yang saya jalankan adalah sebagai berikut:

SELECT SUSER_NAME(), USER_NAME();
Create USER kyle_temp FOR LOGIN Foo
EXECUTE AS USER = 'kyle_temp';
SELECT SUSER_NAME(), USER_NAME();
EXEC msdb.dbo.sp_send_dbmail @profile_name = 'Mail Profile',
            @recipients = '[email protected]',
            @subject = 'Test',
              @body = 'Test'
REVERT;
DROP USER kyle_temp

Login Foo menunjukkan bahwa ia dipetakan ke Pengguna Foo di msdb. Ketika saya melihat pengguna foo di msdb saya melihat bahwa ia memiliki "DatabaseMailUserRole" Diperiksa dan memiliki Jalankan di dbo sp_send_dbmail.

Apa yang saya lewatkan?

Kyle Brandt
sumber

Jawaban:

10

Anda menjalankan mode EXECUTE ASkonteks 'kotak pasir' yang ditakuti , seperti dijelaskan dalam Memperluas Peniruan Basis Data dengan Menggunakan EXECUTE AS . Singkatnya, kode yang berjalan di bawah EXECUTE AS USER ...hanya dipercaya di dalam konteks basis data , bukan pada konteks instance.

Ada tiga jalan keluar:

  • cara mudah: tandai database saat ini sebagai TRUSTWORTHY ALTER DATABASE [...] SET TRUSTWORTHY ON;
  • jalan keluar yang benar: gunakan penandatanganan kode
  • cheat: use EXECUTE AS LOGIN

Jika di lingkungan Anda dbobasis data saat ini tepercaya maka Anda dapat pergi dengan TRUSTWORTHY. Ini akan berfungsi, tetapi jika properti ini disetel maka yang ada db_ownerdalam DB saat ini dapat mengangkat dirinya ke admin server.

Jika Anda menginginkan solusi 'benar' maka:

  1. pindahkan kode ini dalam proc yang disimpan
  2. menandatangani proc yang disimpan dengan sertifikat
  3. jatuhkan kunci pribadi (sehingga tidak dapat digunakan lagi untuk menandatangani apa pun)
  4. ekspor kunci publik, impor di [msdb]
  5. buat pengguna yang [msdb]berasal dari sertifikat ini
  6. berikan izin yang diperlukan (AUTHENTICATE, EXECUTE di sp_send_mail) kepada pengguna yang mendapatkan sertifikat

Sepele, heh? BTW, setiap kali Anda memodifikasi proc tersimpan yang ditandatangani, tanda tangan hilang dan prosedur harus diulang. Lihat Memanggil prosedur di database lain dari prosedur yang diaktifkan untuk contoh.

Saya benar-benar tidak merekomendasikan menggunakan EXECUTE AS LOGINsebagai gantinya.

Remus Rusanu
sumber
Dalam jangka panjang saya mencoba untuk mengeksekusi ini sebagai pemicu, jadi EXECUTE AS saya adalah cara pengujian dalam jangka pendek ...
Kyle Brandt
1
Cara terbersih adalah memiliki proc tersimpan lokal di DB Anda, dan memiliki panggilan ke msdb.dbo.sp_send_maildalam badan SP lokal ini. Minta pemicunya memanggil SP lokal ini. Kode menandatangani SP.
Remus Rusanu