sp_send_mailのデータベース権限に関する問題


8

データベースメールを送信しようとしていますが、取得していEXECUTE permission denied on the object 'sp_send_dbmail' database 'msdb', schema 'dbo'.ます。私が実行しているコードは次のとおりです:

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 = 'test@test.com',
            @subject = 'Test',
              @body = 'Test'
REVERT;
DROP USER kyle_temp

Fooログインは、msdbでFooユーザーにマッピングされていることを示しています。msdbでfooユーザーを見ると、 "DatabaseMailUserRole"がオンになっていて、dboでExecuteが実行されていることがわかりsp_send_dbmailます。

何が欠けていますか?

回答:


10

EXECUTE ASを使用したデータベース偽装の拡張でEXECUTE AS説明されているように、コンテキストの恐ろしい「サンドボックス」モードが実行されています。つまり、下で実行されるコードは、データベースコンテキスト内でのみ信頼され、インスタンスコンテキストでは信頼されません。EXECUTE AS USER ...

3つの方法があります。

dbo現在のデータベースの環境が信頼されている場合は、TRUSTWORTHYを使用できます。動作しますが、このプロパティが設定されている場合db_owner、現在のDB内のいずれかがサーバー管理者に昇格できます。

「正しい」ソリューションが必要な場合:

  1. このコードをストアドプロシージャに移動する
  2. 証明書でストアドプロシージャに署名する
  3. 秘密鍵をドロップします(それが何かに署名するために二度と使用されないようにするため)
  4. 公開鍵をエクスポートしてインポートする [msdb]
  5. [msdb]この証明書から派生したユーザーを作成する
  6. 証明書から派生したユーザーに必要な権限(AUTHENTICATE、sp_send_mailでのEXECUTE)を付与する

ささいなことでしょ?ところで、署名されたストアドプロシージャを変更するたびに、署名は失われ、手順を繰り返す必要があります。例については、アクティブ化されたプロシージャから別のデータベースのプロシージャ呼び出すを参照してください。

EXECUTE AS LOGIN代わりに使用することは全くお勧めしません。


私は、ASをEXECUTEので、長い目で見れば、私は、これがトリガとして実行したしようとしています...短期的にテストする方法です
カイルブラント

1
最もクリーンな方法は、DBにローカルストアドプロシージャを置きmsdb.dbo.sp_send_mail、このローカルSP本体で呼び出しを行うことです。トリガーがこのローカルSPを呼び出すようにします。SPにコード署名します。
Remus Rusanu
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.