Sql-Server

為 sysmail_update_account_sp 分配權限

  • November 10, 2016

我有一個 Microsoft SQL Server 2014。郵件系統是通過 DBMail 配置的,並且在主 Web 應用程序(擁有自己的數據庫)中有一個儲存過程,它通過使用msdb.dbo.sysmail_account選擇適當的配置文件來執行 msdb 的**sysmail_update_account_sp

我面臨的問題是 Web 應用程序有一個 SQL 登錄,我想切換上下文並執行sysmail_update_account_sp

EXEC AS USER = @UserName

   SET @AccountNr = ( SELECT TOP 1 account_id FROM msdb.dbo.sysmail_account WHERE name = @DatabaseName ORDER BY account_id )

   IF @AccountNr > 0

   EXECUTE msdb.dbo.sysmail_update_account_sp
               @account_id = @AccountNr
               , @email_address = @ParamSMTPFrom
               , @account_name = @DatabaseName
               , @display_name = @DatabaseName
               , @replyto_address = @ParamSMTPFrom
               , @description = @EmailAccountDescription
               , @mailserver_name = @ParamWebAppSmtpServer
               --[ , [ @mailserver_type = ] 'server_type' ] 'optional only SMTP supported'
               , @port = @ParamWebAppSMTPPort
               , @username = @ParamWebAppSMTPUser
               , @password = @ParamWebAppSMTPPwd
               , @use_default_credentials = 0 -- we will always have nor domain credientials @DefaultCredentials
               --use account name and password
               --not databse credentials
               , @enable_ssl = @SSL -- bit 1 for use ssl
REVERT

發生的錯誤是:

無法作為數據庫主體執行,因為主體“SERVERNAME\dbMailUser”不存在,無法模擬此類主體,或者您沒有權限

我檢查的事情:

  1. SERVERNAME\dbMailUser 目前在 msdb 中具有 DatabaseMailUserRole 權限。
  2. 如果我將執行儲存的 proc 使用者(來自 Web 應用程序)添加為系統管理員,我不必切換或任何東西。但我想將權限限制在最低限度。

如何通過正確切換上下文以不同使用者(SQL 或 Windows 登錄)的身份執行?目前 SQL 登錄名是數據庫所有者。

要求是登錄應該能夠從儲存過程配置 DBMail 並能夠發送郵件(DatabaseMailUserRole),而不是處於 sysadmin 角色。

關於我對 DBMail 配置如何工作的理解,我的方向是否正確?

此請求與此處(DBA.StackExchange)上關於需要非常精細的提升權限的另一個問題非常相似,如果不相同的話。我在回答中提供了工作程式碼,也可以在這裡使用:

我需要向使用者提供哪些最低權限才能檢查 SQL Server 代理服務的狀態?

總體概念是相同的:通過(通過證書)與具有適當權限的登錄相關聯,為儲存過程本身提供所需的權限。VIEW SERVER STATE TO [MrDoStuff]唯一的區別是您可能只是添加[MrDoStuff]sysadmin固定的伺服器級角色而不是 granting 。

但是,這個問題和“什麼最低權限……”問題之間的一個區別是,另一個問題只需要訪問 DMV 而不是要簽名的程式碼之外的任何程式碼對象。碰巧的是,預設情況下,簽名不會轉移到簽名程式碼呼叫的程式碼。但是有一種方法可以讓這種情況發生:對被呼叫的外部程式碼進行會簽。會簽允許由已簽名程式碼執行的程式碼在沒有實際簽名的情況下傳輸簽名(因此不能獨立呼叫外部程式碼)。反簽名由用於簽署初始儲存過程的相同ADD SIGNATURE函式處理:

  1. 將證書恢復到[msdb]數據庫中
  2. dbo.sysmail_update_account_sp對儲存過程進行會簽

繼續其他答案中的範常式式碼,其他步驟應該是:

USE [msdb];

CREATE CERTIFICATE [DoStuffCert]
   FROM FILE = 'C:\temp\ViewSqlAgentStatus.CER'
   WITH PRIVATE KEY (
       FILE = 'C:\temp\ViewSqlAgentStatus.PVK',
       DECRYPTION BY PASSWORD = 'DontStartNoneWontBeNone',
       ENCRYPTION BY PASSWORD = 'W0rdUp,Yo!'
   );

ADD COUNTER SIGNATURE TO dbo.sysmail_update_account_sp
   BY CERTIFICATE [DoStuffCert] WITH PASSWORD = 'W0rdUp,Yo!';

如果sysmail_update_account_sp執行任何儲存過程,則可能還需要對它們進行會簽。

引用自:https://dba.stackexchange.com/questions/120519