暗号化を使用したパスワードの保護
はじめに
このドキュメントでは、IIS 7.0 サーバーに対してアプリケーション プール分離とワーカー プロセス分離の両方を設定するために必要な手順を概説します。アプリケーション プール分離は、WAS (IIS 7 ローカル システム プロセス) がアクセスする必要があるデータの保護を伴います。このデータの一例がアプリケーション プールのパスワードです。一方、ワーカー プロセス分離は、アプリケーション プール ID がアクセスする必要があるデータの保護を伴います。このデータの一例が匿名ユーザー アカウントのパスワードです。
この記事には次のような内容が含まれています。
- 前提条件
- 新しい RSA 暗号化プロバイダー アプリケーションの作成
- ユーザー アカウントの作成
- アプリケーション プール分離
- ワーカー プロセス分離
- まとめ
前提条件
このプロセスを簡略化するために、以下を行うための 2 つのサンプル コードが用意されています。
- machine.config に新しい RSA 暗号化プロバイダーを作成する。
- machine.config に既定のプロバイダー名を設定する。
最後の前提条件のセクションでは、後のトピックで使用する 4 つのユーザー アカウントのセットアップ方法について説明します。
新しい RSA 暗号化プロバイダー アプリケーションの作成
1. Windows のメモ帳を開き、任意のディレクトリに、以下の C# コードを含む createProvider.cs というファイルを作成します。
using System;
usingMicrosoft.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();
}
}
}
2. 次に、管理者特権のコマンド プロンプトを次のように起動します。
a. [スタート] メニューをクリックします。
b. [コマンド プロンプト] を右クリックします。
c. [管理者として実行] を選択します。
3. コマンド プロンプトのウィンドウで、createProvider.cs ファイルを保存した場所に移動し、次のコマンドを実行してコードをコンパイルします。
%SystemRoot%\Microsoft.NET\Framework\v2.0.50727\csc.exe /reference:%SystemRoot%\System32\inetsrv\Microsoft.Web.Administration.dll createProvider.cs
これでこの手順は完了です。
既定のプロバイダーを変更するアプリケーションの作成
1. Windows のメモ帳を開き、任意のディレクトリに、以下の C# コードを含む setProvider.cs というファイルを作成します。
using System;
usingMicrosoft.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();
}
}
}
2. 次に、管理者特権のコマンド プロンプトを次のように起動します。
a. [スタート] メニューをクリックします。
b. [コマンド プロンプト] を右クリックします。
c. [管理者として実行] を選択します。
3. コマンド プロンプトのウィンドウで、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" />
アプリケーション プールのパスワードの暗号化
既定では、プロパティが暗号化されるたびに machine.config に定義されている暗号化の defaultProvider が使用されます。この既定値は RsaProtectedConfigurationProvider です。
この手順では、前に作成した setProvider.exe アプリケーションを使用してプロバイダーを iisWasKey に変更し、IIS マネージャーを使用してパスワードを変更します。
- [スタート] メニューをクリックします。
- [コマンド プロンプト] を右クリックします。
- [管理者として実行] を選択します。
- コマンド ウィンドウで、setProvider.exe ファイルを保存した場所に移動して、以下のコマンドを実行します。
setProvider.exe Rsa_WAS
既定のプロバイダーである Rsa_WAS が正常に変更されました。
新しいアプリケーション プールの作成
この手順では、新しく 2 つの アプリケーション プールを作成し、これらを互いに分離させます。これには、次の手順で IIS マネージャーを起動します。
[スタート] をクリックして「INetMgr.exe」と入力し、Enter キーを押します (プロンプトが表示されたら [続行] を選択してアクセス許可を管理者特権にします)。
[接続] セクションで、コンピューター名の隣の [+] ボタンをクリックします。
[アプリケーション プール] をクリックします。
右側の [アプリケーション プールの追加] というタスクを選択します。
次のように「AppPool1」という名前を入力して [OK] を押します。
前述の手順を繰り返します。ただし、今回は「AppPool2」という名前を使用します。
IIS マネージャー内に次のような画面が表示されます。
ご覧のとおり、AppPool1 と AppPool2 の ID はいずれも NetworkService です。そこで、AppPool1 を右クリックして [詳細設定] を選択して、これを前に作成したアカウントに変更します。
[プロセス モデル] というタイトルの下で次の操作を行います。
a. [ID] という語の右側のボタンをクリックします。
b. [アプリケーション プール ID] ウィンドウで、[カスタム アカウント] ラジオ ボタンを選択して、[設定] ボタンをクリックします。
c. [資格情報の設定] ダイアログに以下のユーザー名とパスワードを入力します。ユーザー名 : AppPoolIdentity1
パスワード : **password1
10. [ID] 値が次のように表示されます。:
11. [OK] をクリックして変更を保存します。
12. AppPool2 に対して前述の手順を繰り返し、ユーザー名に「AppPoolIdentity2」、パスワードに「password2」を指定します。
13. IIS 7.0 マネージャーには以下が表示されています (主にアプリケーション プールの ID が変更されています)。
14. 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
5. 以下のコマンドを使用して新たに one というディレクトリと two というディレクトリを作成します。
mkdir one
mkdir two
. one と two の両方のディレクトリに、以下の HTML コードを含む基本ファイル Default.htm を作成します。
<html><body>Hello from site X</body></html>
注 : X をファイルのディレクトリの場所に応じて one または two に置き換えてください。
次に IIS マネージャーを使用して次の 2 つのサイトを作成します。
[スタート] をクリックして「INetMgr.exe」と入力し、Enter キーを押します (プロンプトが表示されたら [続行] を選択してアクセス許可を管理者特権にします)。
[接続] セクションで、コンピューター名の隣の [+] ボタンをクリックします。
[接続] の下のツリー ビューで [サイト] を右クリックして、[Web サイトの追加] を選択します。
次の情報を使用してサイトを作成します。
***Web サイト名 : One
アプリケーション プール : AppPool1
物理パス : {inetpub ディレクトリの場所}\wwwroot\one
ポート : 81
完了すると、次のように表示されます。***
[OK] をクリックして、変更を保存します。
前述の 2 つの手順を繰り返します。ただし、今回は 2 つ目のサイトに次の情報を使用します。
Web サイト名 : Two
アプリケーション プール :AppPool2
物理パス :{inetpub ディレクトリの場所}\wwwroot\two
ポート : 82
これで One および Two という 2 つの新しいサイトが作成され、これらが AppPool1 と AppPool2 というアプリケーション プールに追加されました。
サイトをテストする URL は次のとおりです。
- サイト One : https://localhost:81
- サイト Two : https://localhost:82
各アプリケーション プールの新しいプロバイダーの作成
ここでは、アプリケーション プールごとに新しい RSA プロバイダーを作成します。
- [スタート] メニューをクリックします。
- [コマンド プロンプト] を右クリックします。
- [管理者として実行] を選択します。
- コマンド ウィンドウで、createProvider.exe ファイルを保存した場所に移動して、以下のコマンドを実行します。
createProvider.exe App1Key RsaKeyForAppPool1 Rsa_app1
createProvider.exe App2Key RsaKeyForAppPool2 Rsa_app2
One サイトに対する匿名アカウントの設定
管理者特権のコマンド プロンプト ウィンドウで、次のコマンドを実行します。
setProvider.exe Rsa_app1
IIS マネージャーに戻って One サイトをダブルクリックします。
[機能名] という見出しの下で、[認証] 項目をダブルクリックします。
右側の [Tasks] という見出しの下で、[匿名認証] を選択して [編集] をクリックします。[匿名認証資格情報の編集] ダイアログ ボックスが表示されます。
[特定のユーザー] オプションをクリックし、[設定] ボタンをクリックします。
ユーザー名に「AnonymousAccount1」、パスワードに「password3」と入力して、[OK] をクリックします。
次のダイアログ ボックスが表示されます。
[OK] を押して、変更を保存します。
Two サイトに対する匿名アカウントの設定
管理者特権のコマンド プロンプト ウィンドウで、次のコマンドを実行します。
setProvider.exe Rsa_app2
- IIS マネージャーに戻って Two サイトをダブルクリックします。
- [機能名] という見出しの下で、[認証] 項目をダブルクリックします。
- 右側の [Tasks] という見出しの下で、[匿名認証] を選択して [編集] をクリックします。[匿名認証資格情報の編集] ダイアログが表示されます。
- [特定のユーザー] オプションをクリックし、[設定] をクリックします。
- ユーザー名に「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 は所属する匿名パスワードの暗号化だけ解除できるようになりました。