1

SQL Server 2005 で偽装とデータベース リンクを組み合わせると、奇妙な動作が発生します。最初に、単純な SQL Server 認証を使用して Login 'John'でデータベース サーバーに接続します。このサーバーでは、サーバー リンクremote_sqlserverが定義されています。このサーバーのmydbに対する SELECT 権限を既に持っています。このサーバー リンクで DB のテーブルを単純にクエリすると、次のようになります。

SELECT count(*)
FROM remote_sqlserver.mydb.dbo.mytable  -- Works!

その後、同じログインで偽装を試みます (なぜそうするのかは聞かないでください。実験しているだけです ;) )

EXECUTE AS LOGIN = 'John'

SELECT count(*)
FROM remote_sqlserver.mydb.dbo.mytable  -- Error: "Login failed for user: 'John'"

元に戻すと、再び機能します。

REVERT

SELECT count(*)
FROM remote_sqlserver.mydb.dbo.mytable  -- Works!

同じログインで偽装なしでテーブルをクエリできるのに、偽装でエラーが発生する理由はわかりますか?

ところで:「自己偽装」の後、ローカルデータベースにクエリを実行しても(もちろん、十分な権限があります)、エラーは発生しません。サーバーリンクを介してリモートDBにクエリを実行した場合にのみ発生します。

4

3 に答える 3

2

オンライン ブックの記事「EXECUTE AS を使用してデータベースの偽装を拡張する」をお読みください。

EXECUTE AS を使用してリモート サーバーにアクセスする場合、呼び出し元を信頼するようにリモート サーバーを構成する必要があります。EXECUTE AS を使用しているため、「親」と「子」のログインは同じ (つまり「John」) ですが、信頼関係を設定する必要があります。ログインは同じでも、認証の「パス」が異なります。

于 2009-12-09T15:36:52.643 に答える
2

自分が誰であるかを信頼するという単純な手段で認証が機能するとしたら、興味深いと思いませんか? 「私はジョンです。私の口座のお金をすべてください」と言うと、銀行は現金を払います。幸いなことに、あらゆる場所で使用されている認証システムは、もう少し要求が厳しくなり、「私はジョンです」と言うと、「こんにちは、ジョン、あなたのパスワードは何ですか?」と尋ねられます。

ここでもまったく同じことが起こっています。パスワードを提供していないEXECUTE AS Login = 'John'と言うと、お気づきかもしれません。したがって、SQL Server インスタンスは、あなたが「John」であると「だまされた」可能性がありますが、SQL 外部の誰もあなたを信じません (SQL 内部の「だまし」は、実際には信頼と特権の長い話であり、実際にはもっと多くのことが起こります。 「私は SYSADMIN であり、このユーザーが John であると信じてください!」のように。

SQL Server システムの外部にアクセスして John になりたい場合は John のパスワードを指定する必要があります。通常の方法は、資格情報オブジェクトを使用することCREATE CREDENTIALです。

于 2009-12-09T16:49:27.390 に答える
1

まだお読みになっていない場合は、EXECUTE AS所有権チェーンについて簡単に読んでおくと、問題が明らかになる可能性があります。

于 2009-12-09T16:22:13.020 に答える