web-dev-qa-db-ja.com

ローカルログインの偽装がリンクサーバーで機能しない

以下を使用して、サーバー上にリンクサーバーを作成しました。

exec sp_addlinkedserver
    @server=N'MyOldDB',
    @srvproduct=N'',
    @provider = N'SQLNCLI',
    @datasrc=N'MYSERVER',
    @catalog=N'TheDefaultDatabase';

さて、ログオン資格情報がどのように決定されるかについての次の説明(MSDNから)にもかかわらず、

ローカルサーバー上のすべてのログインとリンクサーバー上のリモートログイン間の既定のマッピングは、sp_addlinkedserverを実行することで自動的に作成されます。既定のマッピングでは、ログインの代わりにリンクサーバーに接続するときに、SQL Serverがローカルログインのユーザー資格情報を使用することが規定されています。これは、ローカルユーザー名を指定せずに、リンクサーバーに対して@useselfをtrueに設定してsp_addlinkedsrvloginを実行するのと同じです。

次のエラーが発生します。

Msg 18456, Level 14, State 1, Line 1
Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'.

私がこれをやろうとすると:

select top 10 * from MyOldDB.TheDefaultDatabase.dbo.Batches

誰かが私をここで正しい方向に向けることができますか?

7
Eric Smith

発生したエラーは、ログイン自体とは無関係です。

これは、SQL ServerがNTログイントークンをリモートサーバーに「パススルー」しようとしたときに発生します。トークンを通過させる権限がありません。ローカルサーバーは統合セキュリティに接続するため、リモートサーバーはこれを探します。

ローカルサーバーに設定するには、 "セキュリティアカウントの委任" が必要です。

デフォルトのマッピングについては...

MSDNによると、ローカルに「MyDomain\bob」がある場合、ローカルに「保存された」「MyDomain\bob」と呼ばれる「仮想」エントリがあるということです。 2つのサーバー間の2つのサーバーの調整はありません。これはこれを実行するのと同じです:

EXEC sp_addlinkedsrvlogin 'MyLinkedServer', @useself = 'TRUE';

「MyDomain\MyGroup」はマップされないことに注意してください。個別のNTユーザーとSQLログインのみです。 NTグループではありません。

これはすべて "リンクサーバーのセキュリティ" で説明されています

リンクサーバー構成の既定のマッピングでは、ログインの現在のセキュリティ資格情報をエミュレートします。この種類のマッピングは、セルフマッピングと呼ばれます。 sp_addlinkedserverを使用してリンクサーバーを追加すると、すべてのローカルログインにデフォルトのセルフマッピングが追加されます。セキュリティアカウントの委任が利用可能で、リンクサーバーがWindows認証をサポートしている場合、Windows認証ログインのセルフマッピングがサポートされています。

...

クライアントまたは送信サーバーでセキュリティアカウントの委任が利用できない場合、またはリンクサーバー/プロバイダーがWindows認証モードを認識しない場合、Windows認証を使用するログインでは自己マッピングは機能しません。

6
gbn