別のSQLインスタンスにアクセスするストアドプロシージャの実行


8

この質問が既に尋ねられた別の質問が繰り返される場合、私は謝罪します。私は何時間も検索しましたが、自分の状況に合うものを見つけていません。

望ましい結果

SQL認証を使用するユーザーは、Server1(デフォルトのインスタンス)上のDatabase1に対する実行権限を持っています。ユーザーは、プロセスの一部として、Server1 \ Instance2上のデータベース2にアクセスするストアドプロシージャを実行します。安全でシンプルなものにしたいと思います(どちらも重要です)。

より詳しい情報

私のWindows資格情報は、(同じサーバー上にある)両方のインスタンスにアクセスできます。したがって、ログインの下で問題なくストアドプロシージャを実行できます。ただし、ユーザーに自分のアクセスレベルを付与したくありません。ユーザーがドメインにいないため、SQLログインも使用する必要があります。

ストアドプロシージャに、そのプロシージャだけのアクセスレベルを与えたいと思います。私はシステム管理者なので、その手順に必要なすべてをユーザーに提供します。それが機能するようになったら、おそらく私の目的ではなく、その目的のためだけにアカウントを作成しますが、ストアドプロシージャの動作を制御するので、どちらにしても安全です。

"WITH EXECUTE AS"ステートメントをストアドプロシージャに入れてみましたが、Windowsログイン情報を取得できませんでした。私がそれを入れると、ストアドプロシージャをコンパイルすると次のエラーが発生します:

ユーザー 'domain \ jdoe'は、存在しないか、権限がないため、実行できません。

私が言ったように、ユーザーは両方のサーバーのsysadminなので、それ以上何が必要かわかりません。

私は以下を調べました:

  • 信頼できる-データベースを公開しないほうがいい
  • リンクサーバー-追加のアクセス許可を与えたくありません。他のデータベースが自分のデータベースにアクセスすることを信頼していません。また、自分のデータベースが他のすべてのデータベースにアクセスすることを信頼していません。
  • 証明書-これは複雑で難しいようです。これを実行し、維持するための非常に簡単な方法を見つけられない限り、問題の価値があるかどうかはわかりません。
  • 所有権の連鎖-繰り返しますが、怖いです。私の目標がセキュリティ問題を防ぐことであるとき、これはより多くのセキュリティ問題を引き起こすようです。
  • ミラー化されたユーザー-他のサーバーインスタンスに同じ(明らかに異なるSID)ユーザーを作成し、同じパスワードを与えました。立ち入り禁止。

私は明白な何かを見逃しているように感じますが、それが何かはわかりません。一日中壁に頭をぶつけてきたので、近すぎて見られないだろう。ここで誰かが私に手を差し伸べるか、私を正しい方向に向けてくれれば幸いです。私は多くのMSDN記事を読んだと言います(男の子は嫌いですか?私が知りたいことを教えてくれないようです)。私が本当に欲しいのは、これを行う方法を順を追って説明するシンプルで簡単なチュートリアルです。それ以外に、私が進むべき方向の一般的な表示でさえ役立つでしょう。

回答:


3

代わりにEXECUTE AS LOGIN = 'DOMAIN \ username'を使用してみて、機能するかどうかを確認してください。


私はそれを試しましたが、そのコマンドは明らかにストアドプロシージャ内で設計されていません。
IAmTimCorey 2012年

ストアドプロシージャ内で問題なく動作するはずです。アカウントには独自のログインが作成されていますか、それともグループメンバーシップを介して権利を取得していますか?
mrdenny、2012年

私のアカウントには、sysadmin権限を持つ独自のログインがあります。また、グループメンバーシップによるドメイン管理者権限も持っているため、Windows資格情報を使用してログオンしたときに必要なすべての機能が提供されます。しかし、私は2つのことを発見しました。まず、ストアドプロシージャのWITHステートメントで上記のコードを使用すると、構文エラーが発生します。これをステートメントに入れると、1つのインスタンスの内部では機能しますが、インスタンス間では機能しません。
IAmTimCorey

3

EXECUTE AS+ Trustworthyの使用方法をご覧ください。ユーザーbにアクセス権が与えられており、2つのデータベースが相互に信頼している限り、ストアドプロシージャ内で呼び出すことができる場所に設定できます。

この人のブログはあなたが必要とするすべてに答えるか提供するべきです。 http://www.sommarskog.se/grantperm.html#EXECAScrossdb

TRUSTWORTHYデータベースプロパティを使用して、ソースデータベースのスコープ外のリソースへのアクセスを制御する

http://msdn.microsoft.com/en-us/library/ms188304%28v=sql.90%29.aspx


それに関して私が見る問題は、Trustworthyが2つのデータベース間の信頼関係を確立することです。これは、どちらかの側のシステム管理者によって悪用される可能性があります。これは欲しくない。個人の権限を制限しようとしています。私が他の人にさらに多くの許可を与えることになった場合、それは良いことではありません。ありがとう。
IAmTimCorey

ここで、個々の所有者は実際の人物である必要はありませんが、各データベースの一般的なログインである可能性があることに注意してください。データベース全体を許可する必要はありません。他のデータベースのsysadminsを信頼しない場合は、証明書の署名を要求します。
SoftwareCarpenter

以下の回答でリンクsommarskog.se/grantperm.htmlに遭遇したと述べました。それは私が提案した回答で私が投稿したのと同じブログです。「この人のブログはあなたが必要なすべてを答えたり、提供しなければならない。sommarskog.se/grantperm.html#EXECAScrossdb」たぶん、あなただけの他人のために、参照する再されました。私はそれが良いブログであることに同意し、読みます。幸運を!
SoftwareCarpenter

ええ、申し訳ありませんが、リンクがあなたからのものであることを忘れていました。それは良いリソースでした。ご協力いただきありがとうございます。
IAmTimCorey

2

このトピックについて幅広く読み、いくつかの実験を行った後、私はこの問題について結論に達したと思います。EXECUTE ASステートメントは、セキュリティに大きな影響を与えずにインスタンス間で機能するようには設計されていません。Windows IDは複数のサーバー上の複数のリソースにアクセスできるため、私が望んでいたのは、実行したいWindows IDをプロシージャに伝える方法でした。ただし、さまざまな設定で遊んだ後でも、ストアドプロシージャが私になりすませるようにするには、他のセキュリティ対策を弱める必要があることが明らかになりました。

クロスインスタンスまたはクロスサーバー手順については、そこには多くの情報がないようです。これの理由は、そうすることのセキュリティとパフォーマンスへの影響のためだと思います。ただし、それが重要である場合があると私は思います。そうするためのソリューションは複雑で、非常にシナリオ固有のようです。少なくとも私の選択肢のいくつかを理解するのに役立つ良い記事を見つけました。これはインスタンス間のアクセスに焦点を当てていませんでしたが、私が探していた手掛かりを与えてくれました。ぜひチェックしてみてください。

http://www.sommarskog.se/grantperm.html

私はまだこの問題の他の解決策に興味がありますが、私の解決策は現在2つあります。まず、1つのストアドプロシージャを介して2つのデータベースにアクセスする必要がある場合は、Windowsログインを使用する必要があります。ただし、パフォーマンスの問題(マルチサーバーロック、ネットワークの複雑化、クエリを最適化できないなど)が発生するため、これは可能な限り避けています。次に、データベース固有の個別の呼び出しを通じて各データベースからデータを取得します。つまり、データをマージする前にクライアントに戻します。それは私が望んでいるほど性能が高くないか、きれいではありませんが、それは最も安全な解決策のようです。


1

2つのSQLサーバーインスタンス間でデータベースオブジェクトにアクセスする必要がある場合は、次のいずれかをお勧めします。

  1. 宛先(リモート)インスタンス上のオブジェクトにアクセスするための適切な権限を持つ2つのインスタンス間でリンクサーバーを作成して使用します。
  2. SSISを使用して、SQL Serverのソースインスタンスからパッケージを呼び出します。使用するSQL Serverのバージョンに応じて、SQLエージェントジョブ(実行するスケジュールではなく、ストアドプロシージャによって呼び出される)を使用するか、SSISDBを使用して、リモートインスタンスのデータベースオブジェクトにアクセスするSSISパッケージを呼び出すことができます。
  3. ロジックを中間層(またはクライアントアプリケーション側)に移動します。
  4. リモートデータベースオブジェクトにアクセスするためのCLRを作成するこれらのうち、おそらくCLRを使用してリモートインスタンスサーバーにアクセスし、ストアドプロシージャを実行します。ソースSQL Serverインスタンスが実行するアカウントに、リモートSQL Serverインスタンスへのアクセス権を付与する必要があります。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.