暗号化を使用したパスワードの保護
執筆者: 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
を開き、新しいプロバイダー用のセクションの行が存在することを確認します。
keyContainerName="NetFrameworkConfigurationKey" cspProviderName=""
useMachineContainer="true" useOAEP="false" name="RsaProtectedConfigurationProvider"
type="System.Configuration.RsaProtectedConfigurationProvider,System.Configuration,
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
useMachineProtection="true" keyEntropy="" name="DataProtectionConfigurationProvider"
type="System.Configuration.DpapiProtectedConfigurationProvider,System.Configuration,
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
cspProviderName="" useMachineContainer="true" useOAEP="false"
name="Rsa_WAS"
type="System.Configuration.RsaProtectedConfigurationProvider,System.Configuration,
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
アプリケーション プール パスワードの暗号化
既定では、プロパティが暗号化されるときは常に、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] を右クリックし、[詳細設定] を選択します。
これは "プロセス モデル" というタイトルの下にあります。
次に示すように、ID の値が表示されます。
[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
次のコマンドを使用して、"1" と "2" という名前の新しいディレクトリを作成します。
mkdir one
mkdir two
"1" と "2" ディレクトリの両方に、次の HTML コードを含む基本的な Default.htm ファイルを作成します。
<html><body>Hello from site X</body></html>
Note
ファイルのディレクトリの場所に応じて、"X" を "1" または "2" に置き換えます。
次に、IIS マネージャーを使用して 2 つのサイトを作成します。
[スタート] をクリックし、「INetMgr.exe」と入力し、Enter キーを押します (メッセージが表示されたら、 [続行] を選択してアクセス許可を昇格します)。
[接続] セクションで、コンピューターの名前の横にある [+] ボタンをクリックします。
ツリー ビューの [接続] で [サイト] を右クリックし、[Webサイトの追加] を選択します。
次の情報を使用してサイトを作成します。
Web サイト名: 1
アプリケーション プール: AppPool1
物理パス: {inetpub ディレクトリの場所}\wwwroot\one
ポート: 81完了すると、次のようになります。
[OK] をクリックして変更を保存します。
前の 2 つのステップを繰り返しますが、今回は 2 番目のサイトに次の情報を使用します。
Web サイト名: 2
アプリケーション プール: AppPool2
物理パス: {inetpub ディレクトリの場所}\wwwroot\two
ポート: 82
これで、"1" と "2" という名前の 2 つの新しいサイトを作成し、それらを AppPool1 と AppPool2 のアプリケーション プールに追加しました。
サイトをテストする URL は次のとおりです。
- サイト 1:
http://localhost:81
- サイト 2:
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をダブルクリックします。
- [機能名] 見出しの下にある [認証]項目をダブルクリックします。
- [Anonymous Authentication を選択し、右側の Tasks 見出しの下にある [Edit Anonymous Credentials] ダイアログ ボックスを 表示します。
- [特定のユーザー] オプションをクリックし、[設定] をクリックします。
- ユーザー名「AnonymousAccount2」とパスワード「password4」を入力し、[OK] を選択します。
- [OK] をクリックして変更を保存します。
暗号化プロバイダーを既定値にリセットする
- 管理者特権のコマンド プロンプト ウィンドウに戻り、次のコマンドを実行します。
setProvider.exe RsaProtectedConfigurationProvider
Note
この変更により、今後暗号化されたすべてのプロパティで既定の暗号化プロバイダーが使用されるようになります。
変更の確認
意図したことが起こったことを確認します。 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 が属する匿名パスワードの暗号化も解除でき、他のユーザーは暗号化の解除ができないことが実質的に保証されました。