16

認証されたユーザーの資格情報を SQL Server に渡すために、イントラネット ASP.Net Web アプリで偽装と委任を使用しようとしています。

Web サーバーと SQL サーバーは 2 つの別個のマシンですが、同じドメイン内にあるため、委任が必要です。

私は次のことをしました:

  • 私のWebアプリのweb.configに設定<authentication mode="Windows"/>してください。<identity impersonate="true"/>
  • Active Directory で、Web サーバーから SQL Server 上の MSSQLSvc サービスへの制約付き委任を有効にしました。
  • IIS を介して、Web サイトで Windows 認証のみを有効にしました。

どうやらこれはすべて機能するはずですが、機能しません (SQL Server が匿名ユーザーへのアクセスを拒否しています - 「ユーザー 'NT AUTHORITY\ANONYMOUS LOGON' のログインに失敗しました」)。

IIS7 では、アプリケーション プールは統合パイプライン モードを使用するように設定され、NetworkService ID で実行されます。Web サイトでは、Windows 認証のみが有効になっており、拡張保護がオフになっており、カーネルモード認証が有効になっており、プロバイダーは NTLM です。

私が読んだすべての Web ページは、私のセットアップが機能するはずであることを示しているようです。私は何が欠けていますか?

4

2 に答える 2

16

私は答えを発見しました:

IIS7 の Windows 認証プロバイダーは、NTLM ではなくNegotiate:Kerberosに設定する必要があります。これは、カーネルモード認証設定を無効にする必要があることを意味します。これでよさそうです。カスタム ID、つまり 1 つの特定の ID を使用する場合は、カーネル モード認証が必要であると言っているのは正しいと思います。委任では、任意の数の ID を使用できます。だから、すべてが順調です。

これについてもブログ記事を書いていますが、これはもう少し詳しく説明しています。

于 2010-01-20T14:13:45.507 に答える
-2

いいえ - 委任のためにサーバーを信頼するために Kerberos (SPN) が必要であり、これがそれを行う唯一の方法であると言うのは正確ではありません。はい、これはそれを行う 1 つの方法です (そして、Kerberos 経由で実現するにはすべてが必要です) が、これが唯一の方法ではなく、技術的に最も安全な方法または最も簡単な方法でもありません。追加の構成を行い、SQL で DB へのすべての Web ユーザーのログインを作成する必要がありますか? これらのアカウントのいずれかが侵害された場合はどうなりますか? より多くのアカウント、より多くの脆弱性。

いいえ、代わりにドメイン サービス アカウントを作成し、SQL にアクセスできるようにします。セキュリティ担当者が物事をロックする場合は、そのユーザーに、サービスとしてログオン、バッチ ジョブとしてログオン、およびローカル ログオンを許可する権限を付与します。または、これが単に理論を開発してテストするためのものである場合、または設定を気にしない、または設定を見つけることができない、または後でエラーが発生する場合、これは多くのフォロワーを獲得しない可能性がありますが、ローカル管理者を付与します (場合によっては、あなたがしなければならないことをしなければなりません-一部のセキュリティ専門家は、私が書きたいと思うよりも厳しく物事をロックします-後でいつでもセキュリティのトラブルシューティングを行ってロックダウンすることができます)。次に、そのアカウントをアプリ プールのカスタム アカウントとして設定し、そのアカウントに SQL でのログインを付与します。その1つのデータベースだけでdboを与えます。

IIS の Web サイトで、認証の種類を Windows に設定します。他のブログで「基本」と言っているのを見たので、Kerberos は機能しますが、NTLM は Windows 認証を使用します。IIS 7 では、ASP .NET 偽装を有効にすることもできます。個人的には、IIS 6 でしかこれを試したことはありませんが、プリンシパルは同じです。

web.config で、これを の下に追加します<configuration>。これは の「ピア」<system.web>です。

<connectionStrings>
  <add 
     name="NorthwindConnectionString" 
     connectionString="Data Source=serverName;Initial 
     Catalog=Northwind;Integrated Security=SSPI;User 
     ID=userName;Password=password"
     providerName="System.Data.SqlClient"
  />
</connectionStrings>

そしてで<system.web>

<authentication mode="Windows"/> 
<identity impersonate="true"
      userName="domain\user" 
      password="password" />

次に、次のように文字列をアプリに読み込みます。

using System.Configuration;

string connString = String.Empty;
if (ConfigurationManager.ConnectionStrings.ConnectionStrings.Count > 0)
{
    connString = ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString; 
    if (connString != null) // do DB connection stuff here
        Console.WriteLine("Northwind connection string = \"{0}\"",
        connString.ConnectionString);
    else
        Console.WriteLine("No Northwind connection string");
}

http://msdn.microsoft.com/en-us/library/ms178411.aspxを参照してください。

偽装タグと SQL 接続のために web.config にそのアカウントを入力した後、サービス アカウントに接続しない場合は、WindowsImpersonationContext ( http://msdn.microsoft.com/en-us ) を使用して偽装メソッドを使用できます。 /library/system.security.principal.windowsimpersonationcontext.aspx )。具体的には、トークンを取得した後に wic.Impersonate() と wic.Undo() が必要です。サービス アカウントのドメイン、名前、およびパスワードは、web.config から AppKeys の形式で読み取ることができます。

要するに、問題を回避する方法があります。web.config でパスワードを暗号化することもできます - ConnectionString と、「impersonate」タグに直接ではなく AppKey に保存する場合、そこにプレーン テキストのパスワードを入れたくない場合 (これは私は反対することをお勧めします)、偽装メソッドを使用する必要がある場合は、ログオン トークンの作成に使用できます (私が行ったように)。

于 2013-08-27T04:14:19.623 に答える