投稿者 : Saad Ladki
はじめに
このドキュメントでは、IIS 7.0 以降のサーバーのアプリケーション プールとワーカー プロセスの分離の両方を設定するために必要な手順の概要について説明します。 アプリケーション プールの分離では、WAS (IIS ローカル システム プロセス) がアクセスする必要があるデータを保護する必要があります。 このデータの例として、アプリケーション プールのパスワードがあります。 一方、ワーカー プロセスの分離では、アプリケーション プール ID がアクセスする必要があるデータを保護する必要があります。 このデータの例として、匿名ユーザー アカウントのパスワードがあります。
前提条件
このプロセスを簡略化するために、次の 2 つのサンプル コードが用意されています。
- machine.configで新しい RSA 暗号化プロバイダーを作成します。
- machine.configで既定のプロバイダーの名前を設定します。
最後の前提条件セクションでは、後のトピックで使用する 4 つのユーザー アカウントを設定する方法について説明します。
新しい RSA 暗号化プロバイダー アプリケーションの作成
Windows メモ帳を開き、次の C# コードを含む任意の名前付き createProvider.cs のディレクトリにファイルを作成します。
using System; using Microsoft.Web.Administration; using System.Configuration; namespace testingEncryption { public class createProvider { public static void Main(string[] args) { String keyContainerName = args[0]; String description = args[1]; String providerName = args[2]; System.Configuration.Configuration machineConfig = System.Configuration.ConfigurationManager.OpenMachineConfiguration(); System.Configuration.ProviderSettings settings = new System.Configuration.ProviderSettings(providerName, "System.Configuration.RsaProtectedConfigurationProvider, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"); settings.Parameters["description"] = description; settings.Parameters["keyContainerName"] = keyContainerName; settings.Parameters["cspProviderName"] = String.Empty; settings.Parameters["useMachineContainer"] = "true"; settings.Parameters["useOAEP"] = "false"; settings.Parameters["name"] = providerName; ProtectedConfigurationSection pcSection = (System.Configuration.ProtectedConfigurationSection)machineConfig.GetSection ("configProtectedData"); pcSection.Providers.Add(settings); machineConfig.Save(); } } }
次に、管理者特権でのコマンド プロンプトを起動します。
- [スタート] メニューをクリックします。
- コマンド プロンプトを右クリックします。
- [ 管理者として実行] を選択します。
コマンド プロンプト ウィンドウで、 createProvider.cs ファイルを保存した場所に移動し、次のコマンドを実行してコードをコンパイルします。
%SystemRoot%\Microsoft.NET\Framework\v2.0.50727\csc.exe /reference:%SystemRoot%\System32\inetsrv\Microsoft.Web.Administration.dll createProvider.cs
これで、この手順は完了です。
既定のプロバイダーを変更するアプリケーションの作成
Windows メモ帳を開き、次の C# コードを含む任意の名前付き setProvider.cs のディレクトリにファイルを作成します。
using System; using Microsoft.Web.Administration; using System.Configuration; namespace testingEncryption { public class setProvider { public static void Main(string[] args) { String provider = args[0]; // example: DataProtectionConfigurationProvider System.Configuration.Configuration machineConfig = System.Configuration.ConfigurationManager.OpenMachineConfiguration(); ProtectedConfigurationSection pcSection = (System.Configuration.ProtectedConfigurationSection)machineConfig.GetSection("configProtectedData"); string oldEncryptionProviderName = pcSection.DefaultProvider; Console.WriteLine("The default provider is currently: " + oldEncryptionProviderName); Console.WriteLine("Changing the default provider to: " + provider); pcSection.DefaultProvider = provider; machineConfig.Save(); } } }
次に、管理者特権でのコマンド プロンプトを起動します。
- [スタート] メニューをクリックします。
- コマンド プロンプトを右クリックします。
- [ 管理者として実行] を選択します。
コマンド プロンプト ウィンドウで、 setProvider.cs ファイルを保存した場所に移動し、次のコマンドを実行してコードをコンパイルします。
%SystemRoot%\Microsoft.NET\Framework\v2.0.50727\csc.exe /reference:%SystemRoot%\System32\inetsrv\Microsoft.Web.Administration.dll setProvider.cs
これで、この手順は完了です。
ユーザー アカウントの作成
この手順では、このドキュメント全体で使用される 4 つの新しいユーザー アカウントを作成します。
開始するには、次の手順を使用して、管理者権限で実行されているコマンド シェル ウィンドウを開きます。
- [スタート] メニューをクリックします。
- コマンド プロンプトを右クリックします。
- [ 管理者として実行] を選択します。
- コマンド ウィンドウで、次のコマンドを実行します。
net user /add AppPoolIdentity1 password1
net user /add AppPoolIdentity2 password2
net user /add AnonymousAccount1 password3
net user /add AnonymousAccount2 password
これで、この手順は完了です。
アプリケーション プールの分離
IIS には、LOCALSYSTEM のコンテキストで実行される WAS というプロセスがあり、アプリケーション プールパスワードへのアクセスを必要とする唯一のプロセスです。 このタスクでは、次の作業を行います。
- LOCALSYSTEM と管理者のみがアクセスできる新しい RSA キー (iisWasKey) を作成します。 このキーは、すべてのアプリケーション プールのパスワードを暗号化するために使用されます。
- 2 つのアプリケーション プールを作成します。
- これらの各アプリケーション プールを、異なる ID で実行し、iisWasKey を使用してパスワードを暗号化するように構成します。
- キー ファイルに対する NTFS ファイル システムのアクセス許可を制限して、SYSTEM と管理者のみがアクセスできるようにします。
新しい RSA キーの作成
- [スタート] メニューをクリックします。
- コマンド プロンプトを右クリックします。
- [ 管理者として実行] を選択します。
- コマンド ウィンドウで、 createProvider.exe を保存した場所に移動し、次のコマンドを実行します。
createProvider.exe iisWasKey RsaKeyForWAS Rsa_WAS
これらの変更が正しく発生したことを確認します。 Windows メモ帳を使用して %SystemRoot%\Microsoft.NET\Framework\v2.0.50727\config\machine.config
を開き、セクションの行が新しいプロバイダーに存在することを確認します。
<configProtectedData defaultProvider="RsaProtectedConfigurationProvider">
<providers>
<add name="RsaProtectedConfigurationProvider" type="System.Configuration.RsaProtectedConfigurationProvider,System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" description="Uses RsaCryptoServiceProvider to encrypt and decrypt" keyContainerName="NetFrameworkConfigurationKey" cspProviderName="" useMachineContainer="true" useOAEP="false"/>
<add name="DataProtectionConfigurationProvider" type="System.Configuration.DpapiProtectedConfigurationProvider,System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" description="Uses CryptProtectData and CryptUnProtectData Windows APIs to encrypt and decrypt" useMachineProtection="true" keyEntropy=""/>
<add name="Rsa_WAS" type="System.Configuration.RsaProtectedConfigurationProvider,System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" description="RsaKeyForWAS" keyContainerName="iisWasKey" cspProviderName="" useMachineContainer="true" useOAEP="false" />
</providers>
</configProtectedData>
アプリケーション プール パスワードの暗号化
既定では、プロパティが暗号化されるたびに、IIS は machine.configで定義された暗号化に defaultProvider を使用します。この既定値は RsaProtectedConfigurationProvider です。
この手順では、先ほど作成した setProvider.exe アプリケーションを使用してプロバイダーを iisWasKey に変更し、IIS マネージャーを使用してパスワードを変更します。
- [スタート] メニューをクリックします。
- コマンド プロンプトを右クリックします。
- [ 管理者として実行] を選択します。
- コマンド ウィンドウで、 setProvider.exe を保存した場所に移動し、次のコマンドを実行します。
setProvider.exe Rsa_WAS
既定のプロバイダー Rsa_WASが正常に変更されました。
新しいアプリケーション プールを作成する
この手順では、互いに分離する 2 つの新しいアプリケーション プールを作成します。 これを行うには、IIS マネージャーを起動します。
[ スタート] をクリックし、「INetMgr.exe」と入力して Enter キー を押します (メッセージが表示されたら、[ 続行 ] を選択してアクセス許可を昇格します)。
[接続] セクションで、コンピューターの名前の横にある [+] ボタンをクリックします。
[アプリケーション プール] をクリックします。
右側の [ アプリケーション プールの追加] というタイトルのタスクを選択します。
名前 'AppPool1' を入力し、次のように [OK] を押します 。
前の手順を繰り返しますが、今回は AppPool2 という名前を使用します。
AppPool1 と AppPool2 の両方の ID が NetworkService であることがわかります。 これを先ほど作成したアカウントに変更します。そのためには、AppPool1 を右クリックし、[詳細設定] を選択します。
タイトルの [プロセス モデル] の下で、次の 手順を実行します。
現在、アイデンティティの値が次のように表示されるはずです。
[OK] をクリックして変更を保存します。
AppPool2 に対して前の手順を繰り返し、ユーザー名 "AppPoolIdentity2" とパスワード "password2" を指定します。
IIS マネージャーに次の情報が表示されます (主にアプリケーション プールの ID が変更されています)。
Windows メモ帳を使用して変更を確認し、
%SystemRoot%\System32\Inetsrv\applicationHost.config
ファイルを開きます。 applicationPools セクションに移動すると、意図したとおりにRsa_WAS キーを使用してアプリケーション プールのパスワードが暗号化されていることがわかります。password="[enc:Rsa_WAS:jAAAAAECAAADZgAAAKQAAAUkBfhWFbUHIt/qtlo+P7CiZC10r9H0DGBvAl U2mhiOxMoHXX6Dz0S8TQjKx2YTKvuE8y+SBUWrEs3JYzXKOkY45Q9z6E/3BFvru5oR9uzbjInASKF/83N N1tIEsoorQWmUOjnL4XM9RNzpqkY6TgyC3CyPUGN9fR7li5+AUupHHfgVPMzcLHfCsoq+ri+X6IbEnJdu cUEAYBn1P9F/Zxk=:enc]" /> password="[enc:Rsa_WAS:jAAAAAECAAADZgAAAKQAAEbQEa/sAmyLbryAR0hD3voip2+0RfzM44sXPekp I2H7HYLzta55NfLcG8vSPHhasahKVgO4wcIcT03CLSn+5koWvAaIRdeClhXWK/X8ZQPFooOpyhOqT0TEP5v jB+DXAKgq0RC6ufHFtrHMy0U69ew7/49YXEcrkF+o8OJZ1K+EkgA3J2ikHKxW0pFBU0tFvLCjt2/UXypfNI 0hYPe2syk=:enc]" />
暗号化プロバイダーのロックダウン
既定では、キーの作成時に、IIS_IUSRSにキーへの読み取りアクセス権が付与されます。 ただし、ASPNET_REGIIS ツールを使用して、そのアクセス権を削除することはできます。 これを行うには、管理者特権のコマンド プロンプトから次のコマンドを実行します。
cd /d %systemroot%
cd Microsoft.NET\Framework\v2.0.50727
aspnet_regiis.exe -pr iisWasKey IIS_IUSRS
これにより、IIS_IUSRS (アプリケーション プール ID グループ) が、管理者と LOCALSYSTEM アクセスのみを対象とする iisWasKey を読み取れなくなりました。
ワーカープロセスのアイソレーション
このトピックでは、異なるアプリケーション プールの一部であり、匿名認証 ID が異なる 2 つの新しいサイトを作成して、ワーカー プロセスの分離を設定する方法について説明します。 次に、アプリケーション プールごとに新しい RSA プロバイダーを作成し、匿名パスワードを暗号化します。
新しいサイトを作成する
このセクションでは、2 つの新しいサイトを作成し、前に作成したアプリケーション プールに各サイトを追加します。 開始するには、次の手順に従って、管理者権限で実行されているコマンド シェルを開きます。
[スタート] メニューをクリックします。
コマンド プロンプトを右クリックします。
[ 管理者として実行] を選択します。
コマンド ウィンドウで、次のコマンドを使用して wwwroot ディレクトリに移動します。
cd /d %SystemDrive%\inetpub\wwwroot
次のコマンドを使用して、"one" という名前の新しいディレクトリとディレクトリ "two" を作成します。
mkdir one
mkdir two
次の HTML コードを含む "1" ディレクトリと "2" ディレクトリの両方に基本的な Default.htm ファイルを作成します。
<html><body>Hello from site X</body></html>
注
ファイルのディレクトリの場所に応じて、'X' を '1' または 'two' に置き換えます。
次に、IIS マネージャーを使用して 2 つのサイトを作成します。
[ スタート] をクリックし、「 INetMgr.exe 」と入力して Enter キー を押します (プロンプトが表示されたら、[ 続行 ] を選択してアクセス許可を昇格します)。
[接続] セクションで、コンピューターの名前の横にある [+] ボタンをクリックします。
ツリー ビューの [接続] で [サイト] を右クリックし、[Web サイトの追加] を選択します。
サイトを作成するには、次の情報を使用します。
Web サイト名: 1
アプリケーション プール: AppPool1
物理パス: {inetpub ディレクトリの場所}\wwwroot\one
ポート: 81完了すると、次のようになります。
[OK] をクリックして変更を保存します。
前の 2 つの手順を繰り返しますが、今回は 2 番目のサイトに次の情報を使用します。
Web サイト名: 2
アプリケーション プール: AppPool2
物理パス: {inetpub ディレクトリの場所}\wwwroot\two
ポート: 82
これで、 One と Two という名前の 2 つの新しいサイトが作成され、 AppPool1 および AppPool2 アプリケーション プールに追加されました。
サイトをテストする URL は次のとおりです。
-
http://localhost:81
サイト One の場合 -
http://localhost:82
サイト ツー の場合
アプリケーション プールごとに新しいプロバイダーを作成する
このセクションでは、アプリケーション プールごとに新しい RSA プロバイダーを作成します。
[スタート] メニューをクリックします。
コマンド プロンプトを右クリックします。
[ 管理者として実行] を選択します。
コマンド ウィンドウで、 createProvider.exe を保存した場所に移動し、次のコマンドを実行します。
createProvider.exe App1Key RsaKeyForAppPool1 Rsa_app1 createProvider.exe App2Key RsaKeyForAppPool2 Rsa_app2
サイト 1 の匿名アカウントを設定する
管理者特権のコマンド プロンプト ウィンドウで、次のコマンドを実行します。
setProvider.exe Rsa_app1
IIS マネージャーに戻り、サイト 1 をダブルクリックします。
[機能名] 見出しの下にある [認証] 項目をダブルクリックします。
[匿名認証] を選択し、右側の [タスク] 見出しの [匿名認証資格情報の編集] ダイアログ ボックスの下にある [編集] をクリックします。
[ 特定のユーザー ] オプションをクリックし、[ 設定 ] ボタンをクリックします。
ユーザー名 AnonymousAccount1 とパスワード password3 を入力し、[ OK] を選択します。
これにより、次のダイアログ ボックスが表示されます。
[OK] をクリックして変更を保存します。
サイト 2 の匿名アカウントを設定する
管理者特権のコマンド プロンプト ウィンドウで、次のコマンドを実行します。
setProvider.exe Rsa_app2
- IIS マネージャーに戻り、サイト 2 をダブルクリックします。
- [機能名] 見出しの下にある [認証] 項目をダブルクリックします。
- [匿名認証] を選択し、右側の [タスク] 見出しの下にある [匿名資格情報の編集] ダイアログ ボックスを表示する [編集] をクリックします。
- [ 特定のユーザー ] オプションをクリックし、[ 設定] をクリックします。
- ユーザー名 AnonymousAccount2 とパスワード password4 を入力し、[ OK] を選択します。
- [OK] をクリックして変更を保存します。
暗号化プロバイダーを既定値にリセットする
- 管理者特権のコマンド プロンプト ウィンドウに戻り、次のコマンドを実行します。
setProvider.exe RsaProtectedConfigurationProvider
注
この変更により、今後暗号化されたすべてのプロパティで既定の暗号化プロバイダーが使用されるようになります。
変更を確認する
必要なことが起こったことを確認します。 Windows メモ帳を使用して、 %SystemRoot%\System32\Inetsrv\applicationHost.config
ファイルを開きます。
AppPool1 と AppPool2 の両方のパスワードは、引き続き Rsa_Was キーで保護されていることに注意してください。
AnonymousAccount1 のパスワードも、Rsa_app1 キーで保護されていることに注意してください。
password="[enc:Rsa_app1:jAAAAAECAAADZgAAAKQAAKoz4LV7HyPQuyNzXh8gspB0rPG7j3Ijvn3d+jY3/f gma8ZxA7AHLUxjis9b0+Qu8XkLvsGn/A+F+m1O68gY1LkWzAcSW9ks81FuiBVhpZx73FzEo6aOz2QqBduJ7Xhu x923KMBqmwkIVJ0mVAdzwFIm6LWymwRXxNxDE4eosKsw6QP6Rd6duC8gckaLxrTndclErQYgGdMt3W6ofxzRMlc=:enc]" />
最後に、 AnonymousAccount2 パスワードも Rsa_app2 キーで保護されていることに注意してください。
password="[enc:Rsa_app2:jAAAAAECAAADZgAAAKQAAKmHMhCTICEUhGncSGCxQc6ll/QGXo0asEIzOf3rIjl sBDGRYhlDQWlf2QbFcIsBGYt8dHo9hzAQN/f03BPSlaFynevpSx4xJOg2/B8ATgPmCg4vgxpY5huZbGxongs55c Rr20WFXsxzlUuw1xoUZI8c1+7gQPOtF0Rwh1g8NBmb5ML/R3jAIFcMtVhaj0OOIfAP7JCjdInwztBqK0XO7FM=:enc]" />
暗号化プロバイダーのロックダウン
上記のように、キーのファイルアクセス許可をセキュリティで保護します。 管理者特権でのコマンド プロンプトから次のコマンドを実行します。
cd /d %systemroot%
cd Microsoft.NET\Framework\v2.0.50727
aspnet_regiis.exe -pr App1Key IIS_IUSRS
aspnet_regiis.exe -pa App1Key AppPoolIdentity1
aspnet_regiis.exe -pr App2Key IIS_IUSRS
aspnet_regiis.exe -pa App2Key AppPoolIdentity2
これらのコマンドにより、キーを読み取るIIS_IUSRS機能が削除され、キーへのアクセス許可が必要なアプリケーション プール ID のみが追加されました。
サイトのテスト
次に、サイトをテストします。
http://localhost:81
http://localhost:82
すべてが以前と同じように動作し続ける必要があります。
概要
要約すると、アプリケーション プールの設定をセキュリティで保護するために、次のタスクを実行しました。
- 2 つのアプリケーション プールを作成しました
- 2 つのローカル ユーザー アカウントを作成し、アプリケーション プール ID として構成しました
- 管理暗号化キーを作成し、それを使用してすべてのアプリケーション プール ID パスワードを保護しました
- ASPNET_REGIISを使用して、キーへのアクセスからIIS_IUSRS (アプリケーション プール ID グループ) を削除しました
これらのタスクにより、管理者アカウントと SYSTEM アカウントのみがアプリケーション プールのパスワードを読み取ることができます。 そのため、アプリケーション プール内のアプリケーションが自分の (または任意の) アプリケーション プールのパスワードを取得しようとした場合、試行は失敗します。
ワーカー プロセスの設定を分離するには、次の手順を実行します。
- 新しい匿名 ID アカウントを作成しました
- アプリケーション プール用の新しいプロバイダーを作成しました
- アプリケーション プール キーを使用して匿名認証パスワードを暗号化しました
- IIS_IUSRSの匿名認証プロバイダーへのアクセスを削除し、アプリケーション プール ID へのアクセス権のみを付与しました
アプリケーション プール ID が属する匿名パスワードを復号化できるのは、他の誰でもなく、その ID 自身に限定されます。