SQL Server 2008、SQL Server認証を介して接続。
DatabaseA
にmsdb
のsp_send_dbmail
を呼び出して、添付ファイル付きの電子メールを送信するストアドプロシージャがあります。ファイルは、リモートファイル共有ではなく、dbサーバー上にあります。
使用されているSQL Serverアカウントはsysadminではありませんが、DatabaseMailUserRole
のmsdb
に属しています。
添付ファイルなしでメールを送信することは問題ありませんが、添付ファイルが存在する場合、エラーが発生します。
クライアント接続セキュリティコンテキストを偽装できませんでした。ファイルを添付するには統合クライアントログインが必要です
これについてはいくつかの記事/投稿がありますが、いくつかは矛盾することを言っているようです。私は偽装を調査してきましたが、機能する1つのことは、次のことを行うためのDatabaseA
のストアドプロシージャです。
EXECUTE AS LOGIN = 'sa' -- or any account with sysadmin privileges
EXECUTE msdb..sp_send_dbmail ....
REVERT
添付ファイルを送信するつもりでこれが機能することを期待していなかったので、Windows認証を使用する必要がありました。ただし、機能しますが、低い特権のSQL Serverアカウントには、sa(または他のsysadminアカウント)をIMPERSONATEする権限を付与する必要があることを意味します。
DBAの悪夢を解き放つ前に、開発者として十分な注意を払います...
私の質問は: SQLサーバー(sysadmin以外)経由で認証されたユーザーが、セキュリティホールを開かずにローカルのdbサーバーディスクから電子メールの添付ファイルを送信できるようにする良い/安全な方法は何ですか?
更新:
Re:資格情報
新しいWindowsログインを作成し、SSMSを介してそのアカウントの資格情報を作成し、それらの資格情報を制限された特権のSQL Serverアカウントにマップしました。エラーが発生します:
メッセージ22051、レベル16、状態1、行0
クライアント接続セキュリティコンテキストを偽装できませんでした。
ファイルを添付するには統合クライアントログインが必要です
何か欠けているに違いない!
Credentials を使用する必要があります:
資格情報は、SQL Serverの外部のリソースに接続するために必要な認証情報(資格情報)を含むレコードです。この情報は、SQL Serverによって内部的に使用されます。ほとんどの資格情報には、Windowsユーザー名とパスワードが含まれています。
資格情報に格納された情報により、SQL Server認証を介してSQL Serverに接続したユーザーは、サーバーインスタンスの外部のリソースにアクセスできます。外部リソースがWindowsの場合、ユーザーは、資格情報で指定されたWindowsユーザーとして認証されます。
このようにして、メールを送信するSQLログインを、添付ファイルへのファイルアクセス権を持つNT認証情報に関連付けることができます。
これを資格情報で使用することはできませんでしたが、通常使用されるアカウントにsysadmin偽装権限を付与する必要なしに、資格情報を使用する別の方法を見つけました。
データベースをTRUSTWORTHYとして設定します。
ALTER DATABASE <your db> SET TRUSTWORTHY ON;
データベースの所有者をsysadminユーザーに設定します-この場合、saを使用しました
EXEC [your db].dbo.sp_changedbowner @loginame = N'sa', @map = false
次のように宣言された、メールの送信を行うストアドプロシージャを記述します。
CREATE PROCEDURE dbo.SendMailWithAttachments
WITH EXECUTE AS OWNER
AS
BEGIN
EXEC msdb.dbo.sp_send_dbmail ....,
@file_attachments = '\\some\remote\file';
END
また、sysadminの所有者がいる「mailXfer」などのスキーマを作成し、その中にストアドプロシージャを作成することもできます(つまり、CREATE PROCEDURE mailXfer.SendMailWithAttachements
)