暗号化を使用したパスワードの保護

はじめに

このドキュメントでは、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 つの新しいユーザー アカウントを作成します。

まず始めに、以下の手順に従って管理者権限で動作するコマンド シェル ウィンドウを開きます。

  1. [スタート] メニューをクリックします。
  2. [コマンド プロンプト] を右クリックします。
  3. [管理者として実行] を選択します。
  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 キーの作成

  1. [スタート] メニューをクリックします。
  2. [コマンド プロンプト] を右クリックします。
  3. [管理者として実行] を選択します。
  4. コマンド ウィンドウで、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 マネージャーを使用してパスワードを変更します。

  1. [スタート] メニューをクリックします。
  2. [コマンド プロンプト] を右クリックします。
  3. [管理者として実行] を選択します。
  4. コマンド ウィンドウで、setProvider.exe ファイルを保存した場所に移動して、以下のコマンドを実行します。
                      
setProvider.exe Rsa_WAS

既定のプロバイダーである Rsa_WAS が正常に変更されました。

新しいアプリケーション プールの作成

この手順では、新しく 2 つの アプリケーション プールを作成し、これらを互いに分離させます。これには、次の手順で IIS マネージャーを起動します。

  1. [スタート] をクリックして「INetMgr.exe」と入力し、Enter キーを押します (プロンプトが表示されたら [続行] を選択してアクセス許可を管理者特権にします)。

  2. [接続] セクションで、コンピューター名の隣の [+] ボタンをクリックします。

  3. [アプリケーション プール] をクリックします。

  4. 右側の [アプリケーション プールの追加] というタスクを選択します。

  5. 次のように「AppPool1」という名前を入力して [OK] を押します。

    Dd939101.Using Encryption to Protect Passwords - Figure 1(ja-jp,TechNet.10).jpg

  6. 前述の手順を繰り返します。ただし、今回は「AppPool2」という名前を使用します。

  7. IIS マネージャー内に次のような画面が表示されます。

    Dd939101.Using Encryption to Protect Passwords - Figure 2(ja-jp,TechNet.10).jpg

  8. ご覧のとおり、AppPool1 と AppPool2 の ID はいずれも NetworkService です。そこで、AppPool1 を右クリックして [詳細設定] を選択して、これを前に作成したアカウントに変更します。

  9. [プロセス モデル] というタイトルの下で次の操作を行います。
    a. [ID] という語の右側のボタンをクリックします。
    b. [アプリケーション プール ID] ウィンドウで、[カスタム アカウント] ラジオ ボタンを選択して、[設定] ボタンをクリックします。
    c. [資格情報の設定] ダイアログに以下のユーザー名とパスワードを入力します。

    ユーザー名 : AppPoolIdentity1
    パスワード : **password1

    Dd939101.Fig3(ja-jp,TechNet.10).jpg

10.  [ID] 値が次のように表示されます。:

Dd939101.Using Encryption to Protect Passwords - Figure 5(ja-jp,TechNet.10).jpg

11. [OK] をクリックして変更を保存します。
12.  AppPool2 に対して前述の手順を繰り返し、ユーザー名に「AppPoolIdentity2」、パスワードに「password2」を指定します。
13.   IIS 7.0 マネージャーには以下が表示されています (主にアプリケーション プールの ID が変更されています)。

Dd939101.Using Encryption to Protect Passwords - Figure 6(ja-jp,TechNet.10).jpg

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 つの新しいサイトを作成して、前に作成したアプリケーション プールにそれぞれを追加します。まず始めに、以下の手順に従って管理者権限で動作するコマンド シェルを開きます。

  1. [スタート] メニューをクリックします。
  2. [コマンド プロンプト] を右クリックします。
  3. [管理者として実行] を選択します。
  4. コマンド ウィンドウで、以下のコマンドを使用して 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 つのサイトを作成します。

  1. [スタート] をクリックして「INetMgr.exe」と入力し、Enter キーを押します (プロンプトが表示されたら [続行] を選択してアクセス許可を管理者特権にします)。

  2. [接続] セクションで、コンピューター名の隣の [+] ボタンをクリックします。

  3. [接続] の下のツリー ビューで [サイト] を右クリックして、[Web サイトの追加] を選択します。  

  4. 次の情報を使用してサイトを作成します。

    ***Web サイト名 : One
    アプリケーション プール : AppPool1
    物理パス : {inetpub ディレクトリの場所}\wwwroot\one
    ポート : 81

完了すると、次のように表示されます。*Dd939101.Using Encryption to Protect Passwords - Figure 7(ja-jp,TechNet.10).jpg**

  1. [OK] をクリックして、変更を保存します。

  2. 前述の 2 つの手順を繰り返します。ただし、今回は 2 つ目のサイトに次の情報を使用します。

    Web サイト名 : Two
    アプリケーション プール :AppPool2
    物理パス :{inetpub ディレクトリの場所}\wwwroot\two
    ポート : 82

これで One および Two という 2 つの新しいサイトが作成され、これらが AppPool1 と AppPool2 というアプリケーション プールに追加されました。

サイトをテストする URL は次のとおりです。

  • サイト One : https://localhost:81
  • サイト Two : https://localhost:82

各アプリケーション プールの新しいプロバイダーの作成

ここでは、アプリケーション プールごとに新しい RSA プロバイダーを作成します。

  1. [スタート] メニューをクリックします。
  2. [コマンド プロンプト] を右クリックします。
  3. [管理者として実行] を選択します。
  4. コマンド ウィンドウで、createProvider.exe ファイルを保存した場所に移動して、以下のコマンドを実行します。
                      
createProvider.exe App1Key RsaKeyForAppPool1 Rsa_app1


createProvider.exe App2Key RsaKeyForAppPool2 Rsa_app2

One サイトに対する匿名アカウントの設定

管理者特権のコマンド プロンプト ウィンドウで、次のコマンドを実行します。

setProvider.exe Rsa_app1
  1. IIS マネージャーに戻って One サイトをダブルクリックします。

  2. [機能名] という見出しの下で、[認証] 項目をダブルクリックします。

  3. 右側の [Tasks] という見出しの下で、[匿名認証] を選択して [編集] をクリックします。[匿名認証資格情報の編集] ダイアログ ボックスが表示されます。

  4. [特定のユーザー] オプションをクリックし、[設定] ボタンをクリックします。

  5. ユーザー名に「AnonymousAccount1」、パスワードに「password3」と入力して、[OK] をクリックします。

  6. 次のダイアログ ボックスが表示されます。

    Dd939101.Using Encryption to Protect Passwords - Figure 8(ja-jp,TechNet.10).jpg

  7. [OK] を押して、変更を保存します。

Two サイトに対する匿名アカウントの設定

管理者特権のコマンド プロンプト ウィンドウで、次のコマンドを実行します。

setProvider.exe Rsa_app2
  1. IIS マネージャーに戻って Two サイトをダブルクリックします。
  2. [機能名] という見出しの下で、[認証] 項目をダブルクリックします。
  3. 右側の [Tasks] という見出しの下で、[匿名認証] を選択して [編集] をクリックします。[匿名認証資格情報の編集] ダイアログが表示されます。
  4. [特定のユーザー] オプションをクリックし、[設定] をクリックします。
  5. ユーザー名に「AnonymousAccount2」、パスワードに「password4」と入力して、[OK] をクリックします。
  6. [OK] をクリックして、変更を保存します。

暗号化プロバイダーの既定へのリセット

  • 管理者特権のコマンド プロンプト ウィンドウに戻り、次のコマンドを実行します。
setProvider.exe RsaProtectedConfigurationProvider

注 : この変更により、今後は暗号化されたプロパティはすべて既定の暗号化プロバイダーを使用することになります。

変更の確認

変更が適用されたかを確認します。Windows のメモ帳で %SystemRoot%\System32\Inetsrv\applicationHost.config ファイルを開きます。

  • AppPool1AppPool2 のパスワードが両方とも 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 は所属する匿名パスワードの暗号化だけ解除できるようになりました。