印刷用ページ       送信     
クリックして評価とフィードバックをお寄せください
MSDN
MSDN ライブラリ
テクニカルドキュメント
.NET 開発
patterns & practices
How-To
 How To: ASP.NET 2.0 アプリケーション用のサービス ...

  低帯域幅での表示をオンにする
How To: ASP.NET 2.0 アプリケーション用のサービス アカウントを作成する方法
Patterns and Practices ホーム
J.D. Meier、Alex Mackman、Blaine Wastell、Prashant Bansode、Andy Wigley、Kishore Gopalan
Microsoft Corporation
August 2005
日本語版最終更新日 2006 年 1 月 19 日

適用対象

  • ASP.NET version 2.0
  • インターネット インフォメーション サービス (IIS) version 6.0  
  • MicrosoftR Windows Server? 2003 オペレーティング システム

概要

このガイドでは、ASP.NET Web アプリケーションの実行のために、最小権限をもったカスタムのサービス アカウントを作成して構成する方法を説明します。 既定では、Microsoft Windows Server 2003 および IIS 6.0 上では ASP.NET アプリケーションは、組み込みのネットワーク サービス アカウントを使用して稼動します。 実動環境では、通常はカスタム サービス アカウントを使用してアプリケーションを実行します。 カスタム サービス アカウントを使用することで、ご自分のアプリケーションを分離することができます。 他のアプリケーションとは別個に、ご自分のアプリケーションを監査および許可できるので、ネットワーク サービス アカウントに関連した特権や許可に変更が加えられても、アプリケーションは保護されます。 カスタム サービス アカウントを使用するには、-ga スイッチを指定して Aspnet_regiis.exe ユーティリティを実行して、アカウントを構成してから、カスタム アカウントの ID を使用するカスタム アプリケーション プール内で稼動するように、アプリケーションを構成する必要があります。

目次

このガイドの目的
はじめに
ガイドライン
ステップの概要
ステップ 1 - 新規ユーザー アカウントの作成
ステップ 2 - 新規アカウントに対する ASP.NET 許可の割り当て
ステップ 3 - 新規アカウントに対する最小特権の割り当て
ステップ 4 - テスト ASP.NET アプリケーションの作成
ステップ 5 - カスタム ID をもったアプリケーション プールの作成
ステップ 6 - 新規アプリケーション プールで実行するためのアプリケーションの構成
ステップ 7 - カスタム サービス アカウントのテスト
カスタム アカウントとネットワーク サービスの比較
その他の考慮事項
関連資料

このガイドの目的

  • カスタム サービス アカウントを使用して実行するようにアプリケーションを構成する。
  • 必要な特権と許可をカスタム アカウントに割り当てる。
  • アプリケーションが実行に使用する ID を確認する。

概要

既定では、Microsoft Windows Server 2003 および IIS 6.0 上では ASP.NET アプリケーションは、ASP.NET V2.0 というアプリケーション プール内で稼動します。 このアプリケーション プールは、組み込みのネットワーク サービス アカウントを使用します。 このアカウントには最小特権しか付帯しませんが、ネットワーク資格情報はもっています。すなわち、これを使用して、ネットワーク サーバーに対して認証を行えるということです。
以下のようなケースでは、ネットワーク サービス アカウントやカスタムのドメイン レベルのサービス アカウントの使用が妨げられる可能性があります。
  • Web サーバーはドメイン内にない
  • Web サーバーとダウンストリーム リモート サーバーは、信頼関係のない別々のドメイン内にある
  • Web サーバーとダウンストリーム リモート サーバーは、ファイアウォールで隔てられていて、NTLM や Kerberos 認証に必要なポートを開くことができない
上記のどのケースでも、ミラーリングされたローカル アカウントを使用することができます。 このアプローチでは、両方のサーバー上で同じユーザー名とパスワードを使用する 2 つのローカル アカウントを使用します。 別の方法として、SQL 認証を使用することができます。ただし、Windows 認証から提供されるセキュリティよりも効力が劣るので、推奨されていません。
カスタム サービス アカウントと専用のアプリケーション プールを使用して、次のような多くの利点を得ることができます。
  • アプリケーションどうしを互いに分離することができます。
  • ローカルおよびリモートのリソース上のアプリケーションごとに、別々のアクセス制御を確立することができます。 たとえば、あるアプリケーションのアカウントにのみアクセス権を限定すると、そのアプリケーションのデータベースに他のアプリケーションからアクセスできなくなります。
  • Windows 監査を使用して、アプリケーションのアクティビティを、他のアプリケーションとは別個に追跡することができます。
  • 汎用ネットワーク サービス アカウントに関連したアクセス制御または許可に対して、意図的であってもなくても変更が加えられた場合に、アプリケーションにその影響を与えないようにすることができます。

ガイドライン

アプリケーションを実行するめのカスタム サービス アカウントを作成するときは、以下の点に気を付けてください。
  • 特権の最小化原則にのっとって、必要最低限の一連の特権と許可をアカウントに認可する。
  • SYSTEM アカウントを使用して ASP.NET を実行しない。
  • アプリケーションのアカウントに対して「オペレーティング システムの一部として 動作する」ユーザー権限を認可しない。
注意    ASP.NET アプリケーションは、既定では偽装を使用しません。 したがって、エンド ユーザー アカウントまたはユーザー グループに対してではなく、アプリケーションの ID に対してリソース上のアクセス制御を構成する必要があります。

ステップの概要

カスタム サービス アカウント ID を使用する専用アプリケーション プールを作成してテストするには、次のステップを行います。
  • ステップ 1 - 新規ユーザー アカウントの作成
  • ステップ 2 - 新規アカウントに対する ASP.NET 許可の割り当て
  • ステップ 3 - 新規アカウントに対する最小特権の割り当て
  • ステップ 4 - テスト ASP.NET アプリケーションの作成
  • ステップ 5 - カスタム ID をもったアプリケーション プールの作成
  • ステップ 6 - 新規アプリケーション プールで実行するためのアプリケーションの構成
  • ステップ 7 - カスタム サービス アカウントのテスト

ステップ 1 - 新規ユーザー アカウントの作成

新規 Windows アカウントの作成から始めます。
新規アカウントの作成
  1. 新規のローカルまたはドメインのユーザー アカウントを作成します。 [コントロール パネル] のコンピュータの管理ツールを使用して、ローカル アカウントを作成します。 [コントロール パネル] の [Active Directory ユーザーおよびコンピュータ] ツールを使用して、ドメイン アカウントを作成します。
  2. たとえば CustomASP などの、適当な名前をアカウントに付けます。 [ユーザーは次回ログオン時にパスワードの変更が必要] をクリアし、[パスワードを無期限にする] を選択します。
    注意   アカウントには必ず強力なパスワードを使用してください。 強力なパスワードには、少なくとも 7 文字を使用しなければならず、大文字と小文字、数字、および *、?、または $ などのその他の文字が混在していなければなりません。

ステップ 2 - 新規アカウントに対する ASP.NET 許可の割り当て

カスタム サービス アカウントを使用するには、IIS メタベースと、ASP.NET で使用されるファイル システム フォルダにアクセスするのに適した許可がそのアカウントになければなりません。 ASP.NET 2.0 には、適切な許可を認可するのに使用できる Aspnet_regiis.exe ユーティリティが用意されています。
新規アカウントに対する ASP.NET 許可の割り当て
  1. 次のようなコマンドをコマンド ウィンドウから実行します。

    aspnet_regiis -ga MachineName\AccountName

ただし、MachineName は、サーバーの名前ですが、ドメイン アカウントを使用している場合はそのドメインの名前です。また、AccountName は、カスタム アカウントの名前です。
  1. カスタム アカウントに必要な許可を確認します。 -ga スイッチを指定して Aspnet_regiis.exe を実行すると、このコマンドによって以下の権利がこのアカウントに認可されます。
    • IIS メタベースへのアクセス
    • %Windir%\Microsoft.NET\Framework\version\Temporary ASP.NET ファイル フォルダへの書き込み

    アカウントはローカルのユーザー グループのメンバでもあるので、\Inetpub ディレクトリ ツリー (このディレクトリには、ユーザー グループへの読み取りアクセスを認可する ACL があります) への読み取りアクセス権ももっています。

    注意   -ga スイッチを使用すると、いくつかの一括変更が行われます。 特定のフォルダへのアクセスを制限したい場合、そのフォルダ上の ACL を手動で調整する必要があります。

ステップ 3 - 新規アカウントに対する最小特権の割り当て

IIS 6.0 を Windows Server 2003 にインストールすると、IIS_WPG という Windows グループが作成されます。 このグループは、ASP.NET アプリケーションを実行するのに必要な最小特権をもっています。 作成時に、カスタム サービス アカウントをこのグループに追加する必要があります。
注意   -ga スイッチを指定してリリース バージョンの Aspnet_regiis.exe ツールを使用すると、カスタム アカウントが IIS_WPG グループに編入されるはずです。
最小特権の割り当て
ローカル IIS_WPG グループにカスタム サービス アカウントを追加します。
  1. [スタート] メニューで、[コントロール パネル] をクリックし、[管理ツール] をクリックしてから、[コンピュータの管理] をクリックします。
  2. [ローカル ユーザーとグループ] を拡張表示してから [グループ] を拡張表示します。
  3. IIS_WPG グループを右クリックしてから、[グループに追加] をクリックします。
  4. [追加] をクリックし、カスタム アカウント名を入力します。 [OK]をクリックします。

    アカウントを IIS_WPG グループに追加すると、ファイル システム フォルダとレジストリ キーへのアクセスに適した権利がそのアカウントに認可されるとともに、Web アプリケーション プロセスを実行するのに必要なユーザー権限もそのアカウントに与えられます。

ステップ 4 - テスト ASP.NET アプリケーションの作成

このステップでは、アプリケーションの実行に使用する Windows ID を表示する 1 ページを備えたテスト ASP.NET アプリケーションを作成します。
テスト アプリケーションの作成
  1. Visual Studio .NET で、TestCustomPool という新規の Web アプリケーションを作成します。
  2. 以下のコードを Default.aspx ページ の読み込みイベント ハンドラに追加します。
    using System.Security.Principal;
    ...
    WindowsIdentity id = WindowsIdentity.GetCurrent();
    Response.Write("<b>Windows Identity Check</b><br>");
    Response.Write("Name: " + id.Name + "<br>");
    
  3. テスト アプリケーションをコンパイルして実行します。 出力を書き取ります。そこには、既定のネットワーク サービス アカウントのもとでアプリケーションが現在実行されていることが示されています。

    ブラウザには、次のような一文が表示されるはずです。

    Windows Identity Check
    Name: NT AUTHORITY\NETWORK SERVICE
    

ステップ 5 - カスタム ID をもったアプリケーション プールの作成

このステップでは、ASP.NET アプリケーションを実行する新規アプリケーション プールを作成し、先に作成したカスタム サービスを使用するために構成します。
カスタム サービス アカウントを使用して実行するアプリケーション プールの作成
  1. インターネット インフォメーション サービス (IIS) マネージャを開始します。
  2. 左側のペインで、ローカル コンピュータを展開表示してから、[アプリケーション プール] を展開表示します。
  3. アプリケーション プール ノードを右クリックし、[新規] をクリックし、[アプリケーション プール] をクリックします。
  4. [Add New Application Pool] ダイアログ ボックスで、[Application Pool ID] テキスト ボックスに "TestPool" と入力します。 [Use default settings for new application pool] オプションを選択済みのままにし、[OK] をクリックします。 これで、TestPool という名前の新規アプリケーション プールが作成されます。
  5. 新規アプリケーション プールを右クリックし、[プロパティ] をクリックします。
  6. [識別] タブをクリックします。
  7. [アプリケーション プール ID] セクションで、[構成可能] をクリックします。
  8. [ユーザー名] テキスト ボックスに "CustomASP" と入力します。
  9. CustomASP アカウントのパスワードを [パスワード] テキスト ボックスに入力し、[適用] をクリックします。
  10. [パスワードの確認] ダイアログ ボックスが表示されます。 パスワードをもう一度入力し、[OK] をクリックしてから、もう一度 [OK] をクリックします。

ステップ 6 - 新規アプリケーション プールで実行するためのアプリケーションの構成

このステップでは、新規アプリケーション プールで実行するために、テスト ASP.NET アプリケーションを構成します。 それによって、実行では必ずカスタム サービス アカウント ID が使用されるようになります。
  1. インターネット インフォメーション サービス (IIS) マネージャに戻ります。
  2. IIS マネージャ コンソールの左側のペインで、テスト アプリケーション TestCustomPool を見つけ出します。
  3. TestCustomPool を右クリックし、[プロパティ] をクリックします。
  4. [プロパティ] ダイアログ ボックスの [ディレクトリ] タブ上の [アプリケーションの設定] セクションで、[アプリケーション プール] リストから TestPool を選択し、次に [OK] をクリックします。

ステップ 7 - カスタム サービス アカウントのテスト

[参照] を使用して、テスト アプリケーションの Default.aspx ページに進みます。 そこには、カスタム サービス アカウントの名前が表示されているはずです。それによって、この ID を使用してアプリケーションが実行されていることが確認されます。 ブラウザの表示には次のようになるはずです。
Windows Identity Check
Name: <ServerName>\CustomASP
<ServerName> は、サーバー名です。

カスタム アカウントとネットワーク サービスの比較

アプリケーションがリソースにアクセスするのに特定の ID が必要な場合の選択肢は、大きく分けて 2 とおりあります。 それは、カスタム アプリケーション プール ID を使用する方法と、既定のネットワーク サービス ID を使用して実行してから、LogonUser API を呼び出して Windows ID を作成する方法です。その作成後、代替 ID を要求する特定のメソッドでその ID を偽装することができます。 どちらのアプローチにも、長所と短所があります。

カスタム アカウントを使用する場合

このアプローチでは、特定の Windows ID を使用して実行するように構成されたアプリケーション プールで、アプリケーションを実行します。
長所
カスタム アカウントの使用には、次のような長所があります。
  • アカウントの資格情報は IIS メタベースに保管されます。これは、SYSTEM アカウントと、管理者グループのメンバしか読み取ることはできません。
  • 正しく管理するのが困難なスレッド セキュリティ コンテキストを、アプリケーションで管理する必要はありません。 間違いがあった場合、非同期スレッド スイッチに起因して、ハンドルの漏洩や偽装トークンの喪失につながります。
短所
カスタム アカウントの使用には、次のような短所があります。
  • コンピュータ アカウントの代わりにドメイン アカウントを使用するために、アプリケーション プールの ID を変更すると、管理者が Setspn ユーティリティを実行してドメイン アカウント用のサービス プリンシパル名 (SPN) を作成しないかぎり、Kerberos 認証を実行する機能を利用できなくなります。 別々のドメイン ID を使用する複数のアプリケーションが同一サーバー上にある場合に、Kerberos 認証を使用する必要が生じると、各アプリケーションごとに別々のドメイン ネーム システム (DNS) 名を使用しなければならなくなります。
  • IIS_WPG グループにカスタム アカウントを追加する以外に、そのカスタム アカウント用の別のファイル システム ACL を構成する必要が生じると考えられます。
  • ファーム内の各 Web サーバー上で、アカウントの有効期間と資格情報を管理する必要があります。
  • カスタム ID を使用して Web アプリケーションが実行する必要のある操作に対して、拡張特権が必要な場合、そのような特権で Web アプリケーション全体を実行する必要があります。すなわち、実行するコードが膨大な量になるということです。

ネットワーク サービスを使用する場合

このアプローチでは、最低限の特権付きのネットワーク サービス アカウントを使用してアプリケーションを実行します。 ただし、特定の ID を使用してリソースへのアクセスや操作の実行を行う必要がある場合、LogonUser API を呼び出して、新規の Windows ID を作成します。 その後、ID を要求するメソッドにおいてのみ、その ID を偽装します。
長所
ネットワーク サービス アカウントの使用には、次のような長所があります。
  • 特権の引き上げを、アプリケーションで必要な部分のみに分けて限定することができます。 アプリケーションが攻撃を受けても、特権が引き上げられていると、攻撃者にとってやっかいな作業が増えます。
  • ファイル システム ACL を構成しなおす必要はありません。
  • アカウントの資格情報ストレージを一極配置することができます。たとえば、コンピュータ ID などへの限定されたアクセス権を設定されたデータベース内や、共用 RSA キーを使用して保護されている Web.config ファイル内などに配置できます。 そうすれば、ファームがドメイン (理想的には、これは境界ネットワーク内の制限付きドメインでなければなりません) に所属する場合に、Web ファームのロールアウトがしやすくなり、LogonUser API の呼び出し時にはドメイン アカウントが使用されます。
短所
ネットワーク サービス アカウントの使用には、次のような短所があります。
  • このアプローチの場合、スレッド セキュリティ コンテキストの管理の複雑さが増大します。 アプリケーションが非同期の連係動作を使用する場合や、さまざまな場所から頻繁に呼び出される場合は、特に困難です。
  • 資格情報をアプリケーションで保管して読み取る必要があります。 そのため、アプリケーションが攻撃を受けると、最終的にその資格情報を取り出されてしまう可能性があります。
  • Windows 2000 では LogonUser の使用を避ける必要があります。LogonUser API の呼び出しのために、「オペレーティング システムの一部として動作する」 という強力なユーザー権限をプロセスID に認可する必要があるからです。 Windows Server 2003 では、LogonUser を呼び出すのに、そのようなユーザー権限は必要ありません。
ASP.NET Web アプリケーションでの偽装に関する詳細は、How To: ASP.NET 2.0 で偽装と委任を使用する方法 を参照してください。

その他の考慮事項

ASP.NET アプリケーションを実行するためのサービス アカウントを作成するときに考慮すべきその他の問題点には、次のようなものがあります。
  • ドメイン アカウント用のサービス プリンシパル名 (SPN) の作成
  • IIS 5.0 分離モードの使用

ドメイン アカウント用のサービス プリンシパル名 (SPN) の作成

アプリケーションが Kerberos 認証を使用してクライアントを認証している場合、ネットワーク サービスなどのコンピュータ アカウントからドメイン アカウントへの使用に切り替えると、MicrosoftR Active DirectoryR ディレクトリ サービスに登録したドメイン アカウント用のサービス プリンシパル名がないかぎり、Kerberos 認証は機能を停止します。
ドメイン アカウント用の SPN の作成
  1. Windows Server 2003 CD から、Windows Server 2003 ツールをインストールします。
  2. コマンド プロンプトから、次のような Setspn ツールを実行します。

    setspn -A HTTP/webservername domain\customAccountName

    setspn -A HTTP/webservername.fullyqualifieddomainname domain\customAccountName

このツールは、カスタム ドメイン アカウント (domain\customAccountName) 用の SPN を作成し、そのアカウントを、指定した Web サーバー上の HTTP サービスに関連付けます。 上記に示したとおり、コマンドを 2 回実行すれば、NetBIOS サーバー名およびサーバーの完全修飾ドメイン ネームにそのアカウントを関連付けることができます。 そうすれば、完全修飾ドメイン ネームの使用法に一貫性のない環境でも、SPN は必ず正しく確立されるようになります。
注意   複数の Web アプリケーションに対して複数の ID を付けたい場合、それらの Web アプリケーションに同じホスト名を付けることはできません。 これは、Kerberos での制限事項ではなく、HTTP での制限事項です。 その対処法として、同じホストに対して複数の DNS 名を用意し、それぞれ異なる DNS 名の付いた各 Web アプリケーションごとに URL を開始します。 たとえば、http://site/app1 と http://site/app2 ではなく、http://app1 と http://app2 を使用します。

IIS 5.0 分離モードの使用

IIS 5.0 分離モードで実行するように IIS 6.0 サーバーを構成した場合、Machine.config ファイル内の <processModel> 要素 に定義されているアカウント資格情報を使用して ASP.NET アプリケーションが実行されます。 この構成では、ASP.NET アプリケーションは、Aspnet_wp.exe という共用ワーカー プロセス内で実行され、IIS 6.0 アプリケーション プールは使用されません。 <processModel> 要素上でアカウント資格情報を変更すると、サーバー上のすべての ASP.NET アプリケーションが指定のアカウントのもとで実行されることになります。
<processModel> 要素を使用してアカウント資格情報を修正する方法の詳細は、How To: ASP.NET の実行に使用するカスタム アカウントの作成方法 を参照してください。

関連資料

ご意見、ご提案

このガイドに関するご意見、ご提案等がございましたら、Wiki またはメールでお寄せください。
特に、以下に関するご意見、ご提案をお待ちしております。
  • 推奨事項に関する技術的な問題
  • 実用性および利便性に関する問題

テクニカル サポート

本ガイドに記載されているマイクロソフトの製品およびテクノロジに関するテクニカル サポートは、Microsoft Support Services で対応いたします。製品サポートの詳細につきましては、Microsoft Support のサイト http://support.microsoft.com/ を参照してください。

コミュニティおよびニュースグループ

次のフォーラムおよびニュースグループより、コミュニティ サポートが提供されています。
上手なご利用方法としては、実際にお使いのテクノロジあるいは実際の問題に対応したニュースグループを参照していただくとよいでしょう。たとえば、ASP.NET のセキュリティ機能に関する問題が発生している場合は、ASP.NET Security フォーラムのご利用をお奨めします。

ご協力いただいた方々

  • ご協力いただいた社外の方々: Andy Eunson; Chris Ullman, Content Master; David Raphael, Rudolph Araujo, Foundstone Professional Services; Manoranjan M. Paul
  • MCS (Microsoft Consulting Services) および PSS 関係者: Wade Mascia, Tom Christian, Adam Semel, Nobuyuki Akama, Microsoft Corporation
  • MPD (Microsoft Product Group) 関係者: Stefan Schackow, Vikas Malhotra, Microsoft Corporation
  • MSDN 関係者: Kent Sharkey, Microsoft Corporation
  • Microsoft IT 関係者: Eric Rachner, Shawn Veney (ACE Team), Microsoft Corporation
  • テスト チーム: Larry Brader, Microsoft Corporation; Nadupalli Venkata Surya Sateesh, Sivanthapatham Shanmugasundaram, Sameer Tarey, Infosys Technologies Ltd
  • 編集チーム: Nelly Delgado, Microsoft Corporation; Sharon Smith, Tina Burden McGrayne, Linda Werner & Associates Inc
  • リリース管理: Sanjeev Garg, Microsoft Corporation
Patterns and Practices ホーム
© 2009 Microsoft Corporation. All rights reserved. 使用条件  |  商標  |  プライバシー
Page view tracker