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

  低帯域幅での表示をオンにする
How To: ASP.NET で Network Service アカウントを使用してリソースにアクセスする方法
Patterns and Practices ホーム
J.D. Meier, Alex Mackman, Blaine Wastell, Prashant Bansode, Kishore Gopalan
Microsoft Corporation
August 2005
日本語版最終更新日 2006 年 1 月 19 日

適用対象

  • ASP.NET Version 1.1
  • ASP.NET Version 2.0
  • Microsoft(R) Windows Server(TM) 2003

概要

このガイドでは、NT AUTHORITY\Network Service マシン アカウントを使用してローカルおよびネットワーク リソースにアクセスする方法について説明します。Windows Server 2003 のデフォルトでは、ASP.NET アプリケーションはこのアカウントの ID を用いて動作します。Network Service アカウントは、ユーザー権限とアクセス権を限定した、最小特権のアカウントですが、ネットワーク クレデンシャルを使用することができます。つまり、このアカウントを使用することで、ドメイン内のネットワーク リソースに対して認証を行うことができます。本ガイドでは、Network Service アカウントを使用して、Windows イベント ログ、Windows レジストリ、ファイル システム、さらにローカルおよびリモート SQL Server データベースなどのサーバー リソースにアクセスする方法について説明します。

目次

このガイドの目的
はじめに
イベント ログ アクセス
レジストリ アクセス
ファイル アクセス
SQL Server

このガイドの目的

  • Network Service アカウントを使用してリソースにアクセスする場合の制限事項を確認する。
  • Network Service アカウントを使用して次のリソース タイプにアクセスする。
    • Windows イベント ログ
    • Windows レジストリ
    • ローカル ファイル システム
    • ローカルおよびリモート データベース

はじめに

Windows Server 2003 環境で動作する Microsoft Internet Information Services (IIS) 6.0 のデフォルト設定では、NT AUTHORITY\Network Service アカウント ID を使用するアプリケーション プールで ASP.NET アプリケーションを実行します。Network Service アカウントは、権限を限定した最小特権のマシン アカウントです。このアカウントを用いて動作するアプリケーションは、イベント ログやレジストリ、ファイル システムへのアクセスが制限されます。Network Service アカウントはネットワーク クレデンシャルを持ちます。つまり、Windows 認証を用いることで、ネットワーク リソースやリモート データベースにアクセスできます。ただし、ネットワーク リソースは、Web サーバーと同じドメインまたは信頼されたドメインのいずれかになければいけません。
状況的に、Network Service アカウントを使用するより、カスタム ドメイン サービス アカウントを使用した方がよい場合があります。カスタム ドメイン サービス アカウントを使用した方がよいのは次のような場合です。
  • 1 つのサーバー上の複数アプリケーションを一意に区別したい場合。
  • ローカル リソースとリモート リソースに対するアクセス コントロールをアプリケーション単位で設定したい場合。たとえば、アクセスをアプリケーションのアカウントに制限しているアプリケーションのデータベースには、他のアプリケーションがアクセスすることはできません。
  • Windows 監査を使用してアプリケーションの活動をアプリケーション単位でトラックしたい場合。
  • 汎用の Network Service アカウントに関連付けられたアクセス コントロールや権限が偶発的または故意に変更された場合のアプリケーションへの影響を回避したい場合。
このガイドでは、Network Service アカウントを使用して、イベント ログやレジストリ、ファイル システム、データベースといった様々なリソースにアクセスする方法について説明します。

イベント ログ アクセス

Network Service ID を用いて動作するアプリケーションは、既存のイベント ソースを使用することでイベント ログに書き込みすることができますが、レジストリ権限が十分ではないため、新規イベント ソースを作成することはできません。EventLog.Write メソッドを使用した場合、指定のイベント ソースが存在していないと、メソッドはイベント ソースの作成を試みます。このときレジストリに適切な権限が設定されていないと、セキュリティ例外が発生します。
注意   アプリケーション独自のイベント ソースを使用すると、他のアプリケーションのイベントとの区別が容易になるため便利です。
ASP.NET アプリケーションが存在しないイベント ソースを使用してイベント ログへの書き込みをできるようにするには、次の 2 通りの方法があります。
  • アプリケーションのインストール時に新規イベント ソースを作成する
  • レジストリのイベント ログ エントリへの書き込みアクセス権を付与する

インストール時に新規イベント ソースを作成する

この方法では、インストール ユーティリティを使用して実行する特殊なインストーラ クラスを作成し、インストール時、管理者権限が有効な場合に新規イベント ソースを作成します。インストール ユーティリティは、新規イベント ソースを作成する権限を持つ管理者アカウントを使用して実行します。
インストーラ クラスを作成してイベント ソースを作成するには
  1. Visual Studio .NET 2005 を使用して、InstallerClass.dll という名前のクラス ライブラリ プロジェクトを作成します。InstallerClass プロジェクトに System.Configuration.Install への参照を追加します。
  2. CustomEventLogInstaller クラスを指定し、System.Configuration.Install.Installer から派生させます。
  3. クラスの RunInstaller 属性に true を設定します。
  4. アプリケーションに必要な新しいイベント ログごとに System.Diagnostics.EventLogInstaller インスタンスを生成し、Installers.Add を呼び出して生成したインスタンスをプロジェクトのインストーラ クラスに追加します。次のサンプル クラスは、customLog という名前の新規イベント ソース 1 つを Application Event Log に追加します。
    using System;
    using System.Configuration.Install;
    using System.Diagnostics;
    using System.ComponentModel;
     
    [RunInstaller(true)]
    public class CustomEventLogInstaller: Installer
    {
       private EventLogInstaller customEventLogInstaller;
       public CustomEventLogInstaller() 
       {
          // 'EventLogInstaller' のインスタンスを生成します。
          customEventLogInstaller = new EventLogInstaller();
          // 作成する、イベント ログの 'Source' を設定します。
          customEventLogInstaller.Source = "customLog";
          // ソースの作成先である 'Event Log' を設定します。
          customEventLogInstaller.Log = "Application";
          // 'InstallerCollection' に myEventLogInstaller を追加します。
          Installers.Add(customEventLogInstaller);   
       }
       public static void Main()
       {
       }
    }
    
  5. コードをコンパイルして、InstallerClass.dll ライブラリを生成します。
  6. 管理者権限を持つアカウントを使用し、コマンド ラインに DLL 名を指定して InstallUtil.exe ユーティリティを実行します。たとえば、Visual Studio コマンド プロンプトをオープンし、次のコマンドを入力します。
    InstallUtil.exe <dll path>\InstallerClass.dll
    
インストール ユーティリティは、このクラスを使用して呼び出されると、RunInstallerAttribute の値を見に行きます。値が true の場合、ユーティリティは Installers コレクション内のすべての項目をインストールします。これにより、指定のイベント ソースが ASP.NET アプリケーションに対して作成されます。

書き込みアクセス権を付与する

新規イベント ソースを実行時に作成するためには、EventLog.WriteEntry メソッドは次のレジストリ キーの下に新しいエントリを作成する必要があります。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\

Network Service アカウントにこのレジストリ キーへの書き込みを許可するには
  1. レジストリ エディタ ツールの Regedit.exe を起動します。
  2. 左側パネルで、上記のレジストリ パスをたどり、[EventLog] フォルダ アイコンを見つけます。
  3. [EventLog] フォルダで右クリックし、[アクセス許可] をクリックします。
  4. [Permission for Eventlog] ダイアログ ボックスで、[Add] をクリックします。
  5. [Select Users, Computers, or Groups] ダイアログ ボックス上のテキスト ボックスに "NETWORK SERVICE" と入力して、[Check Namess] をクリックします。Network Service 名の下にアンダーラインが引かれ、有効なセキュリティ プリンシパルであることが示されます。[OK] をクリックします。
  6. [Permission for Eventlog] ダイアログ ボックスで、一覧から [Network Service] ユーザー名をクリックし、[Permissions for NETWORK SERVICE] セクションで、[Allow] 欄下の [Full Control] チェック ボックスをオンにします。[Apply] をクリックし、続いて [OK] をクリックします。
Network Service アカウントに、レジストリに新規イベント ソースを作成する権限が付与されました。
注意   レジストリの編集は、誤った操作を行うとシステムが不安定になることがあります。レジストリを編集する場合は十分な注意の上行うようにしてください。推奨方法としては、レジストリを直接編集せず、インストール時に新規イベント ソースを作成するなど別のテクニックの使用をお奨めします。

ヘルス モニタリング

ASP.NET Version 2.0 のヘルス モニタリング機能は、設定に従い、Windows アプリケーション イベント ログに書き込みを行って重要なライフタイムおよびセキュリティ イベントを通知します。ASP.NET のヘルス モニタリング機能を使用することで、コード内でカスタム イベントを発生させてイベント ログに書き込みすることができます。この方法では EventLog.WriteEntry を使用しませんが、あらかじめ定義したイベント ソースしか使用できません。ヘルス モニタリング機能の詳細については、How To: ASP.NET 2.0 でヘルス モニタリング機能を使用する方法 を参照してください。

レジストリ アクセス

Network Service アカウントにはレジストリへの書き込みアクセス権がありません。アプリケーションでレジストリへの書き込みが必要な場合は、対象となるレジストリ キーの必要なアクセス コントロール リスト (ACL) を設定しなければいけません。

Network Service にレジストリ アクセス権を付与する

次の例のアプリケーションは、Windows が自動同期を行うインターネット タイム サーバー名を変更、表示する必要があります。オペレータは、コントロール パネルの [日付と時刻][インターネット時刻] タブを使用することでこの設定を変更できます。
アプリケーションは、次のレジストリ キーを修正する必要があります。
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\DateTime\Servers

Network Service アカウントに上記レジストリ キーへの書き込みアクセスを許可するには
次の手順を実行するには、レジストリ セキュリティを変更する権限を持つ管理者アカウントを使用する必要があります。
  1. タスクバー上で、[Start] をクリックし、続いて [Run] をクリックします。[Open] ボックスに "regedit" と入力して、[OK] をクリックします。
  2. 左側パネルで、上記レジストリ パスをたどり、[DateTime] フォルダ アイコンを見つけます。
  3. [DateTime] フォルダ アイコンを右クリックし、[Permissions] をクリックします。
  4. [Permission for Servers] ダイアログ ボックスで、[Add] ボタンをクリックします。
  5. [Select Users, Computers, or Groups] ダイアログ ボックス上のテキスト ボックスに NETWORK SERVICE と入力して、[Check Names] をクリックします。Network Service 名の下にアンダーラインが引かれ、有効なセキュリティ プリンシパルであることが示されます。[OK] をクリックします。
  6. [Permission for Servers] ダイアログ ボックスで、一覧から [Network Service] ユーザー名をクリックし、[Permissions for NETWORK SERVICE] セクションで、[Advanced] をクリックします。
  7. [Advanced Security Settings for Servers] ダイアログ ボックスで、[Network Service] をクリックし、続いて [Edit] をクリックします。
  8. [Permission for Servers] ダイアログ ボックスで、[Allow] 欄の [Set Value] および [Create Subkey] チェック ボックスをオンにして書き込みアクセスを許可します。[Permissions] ダイアログ ボックスがクローズされるまで、[OK] を何度かクリックします。
注意   レジストリの編集は、誤った操作を行うとシステムが不安定になることがあります。レジストリを編集する場合は十分な注意の上行うようにしてください。
以上で、ASP.NET アプリケーションは、次のサンプルのようなコードを使用してインターネット タイム サーバー名を変更、表示できるはずです。
using Microsoft.Win32;
...
protected void Button1_Click(object sender, EventArgs e)
{
//タイム サーバーを変更します。
RegistryKey rk = Registry.LocalMachine.OpenSubKey(
@"SOFTWARE\Microsoft\Windows\CurrentVersion\DateTime\Servers", 
true); //書き込み可能 - 適切なアクセス権がないと失敗します。
string sDefault = (String)rk.GetValue("");
int iDefault = Convert.ToInt32(sDefault);
// すべてのサーバー名の配列です。
string[] sServers = rk.GetValueNames(); // サブ キーの列挙が必要です。
iDefault++;
if (iDefault >= sServers.Length) 
iDefault=1;
rk.SetValue("", iDefault.ToString());
// 表示を更新します。
Response.write(rk.GetValue(sServers[iDefault]).ToString());
}

ファイル アクセス

Network Service アカウントは、IIS サーバー ルート フォルダ上にデフォルトで読み取りおよび実行権限を持ちます。IIS サーバーのルート フォルダ名は wwwroot です。つまり、このルート フォルダ内に配置された ASP.NET アプリケーションは、最初から、自身のアプリケーション フォルダへの読み取りおよび実行権限を持っていることになります。ただし、ASP.NET アプリケーションでこれ以外の場所にあるファイルまたはフォルダを使用する必要がある場合は、別個にアクセスを有効にしなければいけません。

Network Service にファイル アクセスを付与する

Network Service として動作する ASP.NET アプリケーションへのアクセスを可能にするには、Network Service アカウントに対してアクセス権を付与しなければいけません。
特定のファイルに対する読み取り、書き込み、修正権限を付与するには
  1. Windows エクスプローラで、対象ファイルを選択します。
  2. ファイルで右クリックし、[Properties] をクリックします。
  3. [Properties] ダイアログ ボックスで、[Security] タブをクリックします。
  4. [Security] タブで、ユーザーの一覧を確認します。Network Service アカウントが一覧になければ、追加します。
  5. [Properties] ダイアログ ボックスで [Network Service] ユーザー名をクリックし、[Permissions for NETWORK SERVICE] セクションで、[Read] および [Write][Modify] 権限を選択します。
  6. [Apply] をクリックし、続いて [OK] をクリックします。
ASP.NET アプリケーションからの対象ファイルへの書き込みが可能になりました。
注意   ASP.NET アプリケーションを実行するすべてのアカウント (Network Service またはカスタム サービス アカウント) に対して、同一レベルのファイル アクセスを許可する必要があるときは、個々の Network Service アカウントではなく、IIS_WPG グループにアクセス権を付与できます。ASP.NET の実行に使用されるすべてのアカウントは、IIS_WPG グループのメンバでなければいけません。
カスタム アカウントを作成して ASP.NET アプリケーションを実行する方法については、How To: ASP.NET 2.0 アプリケーション用のサービス アカウントを作成する方法 を参照してください。

SQL Server

ASP.NET アプリケーションは、データベースに接続中は Windows 認証を使用しなければいけません。Windows 認証を使用することで、接続文字列に強力なデータベース クレデンシャルを使わずに済み、またデータベース サーバーにネットワーク経由でパスワードを渡さなくてもよくなります。
Windows 認証を使用した場合、認証にはデフォルトでアプリケーションのプロセス アカウントが使用されます。データベースへのアクセスを可能にするためのアカウントの必要条件は以下のようになります。
  • データベース サーバー上の SQL Server ログイン。
  • 必要なデータベース内の必要なオブジェクト (たとえば、ストアド プロシージャ、ビュー、テーブルなど) に対するアクセス権。

ローカル SQL Server へのアクセス権を付与する

SQL Server が Web サーバー上にある場合は、NT AUTHORITY\Network Service に対してデータベース ログインを作成しなければいけません。
Network Service を用いてローカル SQL Server データベースにアクセスするには
  1. SQL Server Enterprise Manager を起動します。
  2. 左側ペインでフォルダを展開し、ローカル SQL Server の [Security] フォルダを見つけます。
  3. [Security] フォルダで [Logins] を右クリックし、続いて [New Login] をクリックします。
  4. [SQL Server Login Properties - New Login] ダイアログ ボックスの [Name] ボックスに、"NT AUTHORITY\NETWORK SERVICE" と入力します。その他の設定はデフォルトのままで、[OK] をクリックします。
  5. [Databases] フォルダを展開し、続いて Pubs データベース (または Pubs に相当するデータベース) を展開します。
  6. [Users] を右クリックし、続いて [New Database User] をクリックします。
  7. [Database User Properties - New User] ダイアログ ボックスで、NT AUTHORITY\NETWORK SERVICE アカウントを選択します。
  8. [Permit in Database Role] リストで、[db_datareader] チェック ボックスをオンにします。
  9. [OK] をクリックし、続いて SQL Server Enterprise Manager を終了します。
Network Service アカウントに、指定データベースのテーブル内のデータを読み取る権限が付与されました。
現実のアプリケーションの要件はおそらくもっと複雑です。たとえば、ある特定のテーブルには読み取りアクセスを、それ以外のテーブルには更新アクセスを許可したいといった状況等が考えられるでしょう。SQL インジェクションによるリスクの軽減を支援する推奨アプローチは、Network Service アカウントに、選択したストアド プロシージャ セットに対する実行権限を付与し、直接的なテーブル アクセスを回避することです。

リモート SQL Server へのアクセス権を付与する

同一ドメイン内 (または信頼済みドメイン内) の別のサーバー上にあるデータベースにアクセスする場合は、データベースへの認証に Network Service アカウントのネットワーク クレデンシャルが使用されます。 Network Service アカウントのクレデンシャルは DomainName\AspNetServer$ という書式で、 DomainName は ASP.NET サーバーのドメイン、 AspNetServer は Web サーバー名を表します。
たとえば、ASP.NET アプリケーションが、CONTOSO ドメイン内にある SVR1 という名前のサーバー上で動作する場合、SQL Server は CONTOSO\SVR1$ からデータベース アクセス リクエストを受け取ります。
Network Service を使用してリモート SQL Server にアクセスするには
同一ドメインまたは信頼済みドメイン内にあるリモート データベース サーバーへのアクセス権を付与する手順は、手順 4 を除き、前述のローカル データベース サーバーの場合と同じです。手順 4 で、データベース ログインの作成に DomainName\AspNetServer$ アカウントを使用してください。
注意   本番環境では、Network Service サービス アカウントを Windows グループに配置し、SQL Server ログインを Windows グループに作成するようにしてください。

ご意見、ご提案

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

テクニカル サポート

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

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

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

テスト、編集、リリースチーム

  • テストチーム: Larry Brader, Microsoft Corporation; Nadupalli Venkata Surya Sateesh, Sivanthapatham Shanmugasundaram, Infosys Technologies Ltd.
  • 編集チーム: Nelly Delgado, Microsoft Corporation; Sharon Smith, Linda Werner & Associates, Inc.; Tina Burden McGrayne, TinaTech Inc.
  • リリース管理:Sanjeev Garg, Microsoft Corporation
Patterns and Practices ホーム
© 2009 Microsoft Corporation. All rights reserved. 使用条件  |  商標  |  プライバシー
Page view tracker