アプリケーション プール ID
作成者: Thomas Deml
サイトを独自のサーバーで実行しているか、クラウドで実行しているかにかかわらず、セキュリティは優先リストの最上位に置く必要があります。 そうであれば、IIS にアプリケーション プール ID と呼ばれるセキュリティ機能があることは朗報でしょう。 この機能は、Windows Server 2008 および Windows Vista の Service Pack 2 (SP2) で導入されました。 アプリケーション プール ID を使用すると、ドメインまたはローカル アカウントを作成および管理することなく、一意のアカウントでアプリケーション プールを実行することができます。 アプリケーション プール アカウントの名前は、アプリケーション プールの名前に対応します。 次の図は、DefaultAppPool ID として実行されている IIS ワーカー プロセス (W3wp.exe) を示しています。
アプリケーション プール ID アカウント
IIS 6.0 および IIS 7 のワーカー プロセスは、既定でネットワーク サービスとして実行されます。 ネットワーク サービスは、組み込みの Windows ID です。 パスワードは必要ありません。また、ユーザー特権のみが付与されます。つまり、比較的低い特権です。 低い特権のアカウントで実行することは、悪意のあるユーザーがソフトウェアのバグを利用してシステムを乗っ取ることを防止するため、セキュリティ上良い習慣です。
しかし、ネットワーク サービスとして実行される Windows システム サービスが増えるにつれて、時間の経過とともに問題が発生しました。 これは、ネットワーク サービスとして実行されているサービスが、同じ ID で実行される他のサービスを改ざんする可能性があるためです。 IIS ワーカー プロセスは既定でサードパーティのコード (Classic ASP、ASP.NET、PHP コード) を実行するため、IIS ワーカー プロセスを他の Windows システム サービスから分離し、一意の ID で IIS ワーカー プロセスを実行する必要が生じました。 Windows オペレーティング システムは、IIS がアプリケーション プールごとに一意の ID を作成できるようにする「仮想アカウント」という機能を備えています。 仮想アカウントの詳細については、「サービス アカウントのステップ バイ ステップ ガイド」を参照してください。
IIS アプリケーション プール ID の構成
Windows Server 2008 R2 以降のバージョンの IIS で IIS 7.5 を実行している場合、新しい ID を使用するために何もする必要はありません。 作成するすべてのアプリケーション プールについて、新しいアプリケーション プールの Identity プロパティは既定で ApplicationPoolIdentity に設定されます。 IIS 管理 プロセス (WAS) は、新しいアプリケーション プールの名前を持つ仮想アカウントを作成し、既定で、このアカウントでアプリケーション プールのワーカー プロセスを実行します。
Windows Server 2008 で IIS 7.0 を実行するときにこの仮想アカウントを使用するには、作成するアプリケーション プールの Identity プロパティを ApplicationPoolIdentity に変更する必要があります。 以下に、その方法を示します。
IIS 管理コンソール (INETMGR.MSC) を開きます。
マシン ノードの下にある [アプリケーション プール] ノードを開きます。 自動的に生成されたアプリケーション プール ID で実行するように変更するアプリケーション プールを選択します。
アプリケーション プールを右クリックし、[詳細設定] を選択します。
[ID] リスト項目を選択し、省略記号 (3 つのドットのボタン) をクリックします。
次のダイアログが表示されます。
[組み込みアカウント] ボタンを選択し、コンボ ボックスから ID 型 ApplicationPoolIdentity を選択します。
コマンド ラインを使用して同じ手順を実行するには、次の方法で appcmd コマンド ライン ツールを呼び出します。
%windir%\system32\inetsrv\appcmd.exe set AppPool <your AppPool> -processModel.identityType:ApplicationPoolIdentity
リソースのセキュリティ保護
新しいアプリケーション プールが作成されるたびに、IIS 管理プロセスによってアプリケーション プール自体の名前を表すセキュリティ識別子 (SID) が作成されます。 たとえば、"MyNewAppPool" という名前のアプリケーション プールを作成すると、"MyNewAppPool" という名前のセキュリティ識別子が Windows セキュリティ システムに作成されます。 この時点から、この ID を使用してリソースをセキュリティで保護できます。 ただし、ID は実際のユーザー アカウントではないため、Windows ユーザー管理コンソールにはユーザーとして表示されません。
これを試すには、Windows エクスプローラーでファイルを選択し、"DefaultAppPool" ID をファイルのアクセス制御リスト (ACL) に追加します。
エクスプローラーを開く
ファイルまたはディレクトリを選択します。
ファイルを右クリックし、[プロパティ] を選択します。
[セキュリティ] タブを選択します
[編集] ボタンをクリックし、[追加] ボタンをクリックします。
[場所] ボタンをクリックして、コンピューターを選択していることを確認します。
[選択するオブジェクト名を入力してください: ] テキスト ボックスに「IIS AppPool\DefaultAppPool」と入力します。
[名前の確認] ボタンをクリックし、[OK] をクリックします。
これにより、選択したファイルまたはディレクトリは、DefaultAppPool ID のアクセスも許可するようになります。
ICACLS ツールを使用してコマンド ラインからこれを行うことができます。 次の例では、DefaultAppPool ID にフル アクセスを付与します。
ICACLS test.txt /grant "IIS AppPool\DefaultAppPool:F"
詳細については、「ICACLS」を参照してください。
Windows 7 および Windows Server 2008 R2 以降のバージョンの Windows では、既定でアプリケーション プールをアプリケーション プール ID として実行します。 これを実現するために、"AppPoolIdentity" という名前の新しい ID 型が導入されました。 "AppPoolIdentity" ID 型 が選択されている場合 (Windows 7 および Windows Server 2008 R2 以降の既定の設定) 、IIS はワーカー プロセスをアプリケーション プール ID として実行します。 他のすべての ID 型では、セキュリティ識別子はプロセスのアクセス トークンにのみ挿入されます。 識別子が挿入される場合、コンテンツは引き続き ApplicationPoolIdentity の ACL に追加できますが、トークンの所有者はおそらく一意ではないでしょう。 この概念の詳細については、「IIS 7 の新機能 - アプリケーション プールの分離」に関するブログ投稿を参照してください。
ネットワークへのアクセス
ドメイン環境でネットワーク サービス アカウントを使用することには、大きな利点があります。 ネットワーク サービスとして実行されているワーカー プロセスは、マシン アカウントとしてネットワークにアクセスします。 マシン アカウントは、マシンがドメインに参加したときに生成されます。 次のようになります。
<domainname>\<machinename>$,
次に例を示します。
mydomain\machine1$
これに関する素晴らしい点は、ファイル共有や SQL Server データベースなどのネットワーク リソースを ACL に追加して、このマシン アカウントにアクセスを許可することができることです。
アプリケーション プール ID について
幸いなことに、アプリケーション プール ID もマシン アカウントを使用してネットワーク リソースにアクセスします。 変更の必要はありません。
アプリケーション プール ID に関する互換性の問題
ガイダンス ドキュメント
アプリケーション プール ID に関する最大の互換性の問題は、おそらく、ネットワーク サービスの ACL リソース、つまり IIS 6.0 と IIS 7.0 の DefaultAppPool の既定の ID の使用を明示的に推奨している以前のガイダンス ドキュメントでしょう。 IIS 7.5 以降で実行する場合、お客様はスクリプトを "IIS AppPool\DefaultAppPool" (または別のアプリケーション プール名) の ACL に変更する必要があります (それを行う方法については、上記の例を参照してください)。
ユーザー プロファイル
IIS は Windows ユーザー プロファイルを読み込みませんが、一部のアプリケーションはそれを利用して一時データを格納することがあります。 SQL Express は、これを行うアプリケーションの例です。 ただし、プロファイル ディレクトリまたはレジストリ ハイブに一時データを格納するには、ユーザー プロファイルを作成する必要があります。 ネットワーク サービス アカウントのユーザー プロファイルはシステムによって作成され、常に使用可能でした。 ただし、一意のアプリケーション プール ID に切り替えた場合、ユーザー プロファイルはシステムによって作成されません。 ディスク上にユーザー プロファイルがあるのは、標準アプリケーション プール (DefaultAppPool および Classic .NET AppPool) のみです。 管理者が新しいアプリケーション プールを作成する場合、ユーザー プロファイルは作成されません。
ただし、必要に応じて、LoadUserProfile 属性を "true" に設定することで、ユーザー プロファイルを読み込むように IIS アプリケーション プールを構成することができます。
まとめ
アプリケーション プール ID は、Windows Server 2008、Windows Vista、およびそれ以降のバージョンの Windows で導入された強力な新しい分離機能です。 この機能により、IIS アプリケーションの実行はより安全で信頼性の高いものになります。