ストアドプロシージャでEXECUTE AS
を使用しようとしているときに何か不足しています。ストアドプロシージャはsource_db
からデータを読み取り、それを集約してtarget_db
に結果を格納します。
Sp自体はtarget_db
にあります。私は専用のログインを持っており、それをsource_db
とtarget_db
の両方のユーザーにマッピングします(つまり、app_agent
とsource_db
にtarget_db
というユーザーがいますログイン用app_agent
)。
app_agent
としてログインして実行した場合
EXEC target_db.app_agent_schema.import_data
すべてが正常に動作します。でも私が変わったら
ALTER PROCEDURE app_agent_schema.import_data WITH EXECUTE AS OWNER` (or `AS SELF`)
そしてそれを実行してみてください、それは投げます
サーバープリンシパル「app_agent」は、現在のセキュリティコンテキストではデータベース「source_db」にアクセスできません。
SQL Server 2008を使用しています。
誰かが私のエラーを指摘できますか?
ありがとう
更新調査の結果、ALTER DATABASE target_db SET TRUSTWORTHY ON
が問題を解決することがわかりましたが、それは私にとって正しい解決策ではないようです...
これは EXECUTE ASを使用したデータベース偽装の拡張 で説明されています。 EXECUTE ASコンテキストは現在のデータベースでのみ信頼されており、他のデータベースへの波及を可能にすることは、特権攻撃ベクトルのエスカレーションです。
上記のリンク先の記事で説明されている2つのソリューションがあります。
簡単なのは、データベースにTRUSTWORTHY:ALTER DATABASE [source_db] SET TRUSTWORTHY ON;
とマークを付けることです。簡単ですが、source_db
のdbo
を事実上のsysadmin
にするので危険です。
安全な方法はコード署名を使用することです。例については 別のデータベースのプロシージャを呼び出す を参照してください。これはより複雑ですが、100%buletproffセキュリティです。
どのユーザーがALTER PROCEDUREコマンドを実行しますか?所有者(自己)のアクセスレベルが、意図したユーザーではなく、そのユーザーに設定されている可能性があります。