セキュリティ保護された ASP.NET アプリケーションの構築 : 認証、認定、および通信のセキュリティ保護 2 つのサーバー間の通信を IPSec で保護する方法
J.D. Meier, Alex Mackman, Michael Dunner, and Srinath Vasireddy
Microsoft Corporation
November 2002
日本語版最終更新日 2003 年 3 月 17 日
Microsoft® ASP.NET
Microsoft SQL Server™
Microsoft Windows® 2000
全体の概要については、「セキュリティ保護された ASP.NET アプリケーションの構築」の開始ページを参照してください。
要約 : Windows 2000 には、2 つのサーバー間に暗号化チャネルを作成する IPSec が実装されています。IPSec は、IP トラフィックのフィルタ処理とサーバーの認証に使用できます。ここでは、セキュリティ保護された (暗号化された) チャネルを提供するように IPSec を構成する方法を説明します。
目次
インターネット プロトコル セキュリティ (IPSec) を使うと、アプリケーション サーバーとデータベース サーバーなど、2 つのコンピュータの間で送信されるデータを保護することができます。IPSec は、暗号化、整合性、認証の各サービスがトランスポート レベルで実装されているため、アプリケーションに対して完全に透過的です。アプリケーション間相互の通信は、TCP ポートおよび UDP ポートを使って、通常どおり行われます。
IPSec では、以下のことが可能です。
- 2 つのコンピュータ間で送信されるデータをすべて暗号化することにより、メッセージの機密性を維持できます。
- 2 つのコンピュータ間でメッセージの整合性を維持できます (データ暗号化なし)。
- 2 つのコンピュータ間での相互認証が可能です。たとえば、データベース サーバーを保護する場合では、特定のクライアント コンピュータ (アプリケーション サーバーや Web サーバーなど) からの要求だけを許可するポリシーを確立することが考えられます。
- 相互に通信できるコンピュータを制限できます。また、通信を特定の IP プロトコルと TCP/UDP ポートだけに制限することもできます。
ここでは、アプリケーション サーバーと SQL Server 2000 データベース サーバーの間の通信チャネルを保護する方法を述べます。このアプリケーション サーバーは、推奨されている TCP/IP クライアント ネットワーク ライブラリを通じて SQL Server に接続し、SQL Server の既定 TCP ポート 1433 を使用します。
図 1 のような構成になります。
図 1 ソリューションの構成
ここでは、単純な IPSec ポリシーを使って、以下のことを規定する方法を示します。
- アプリケーション サーバーから SQL Server への通信を、ポート 1433 経由の TCP 通信だけに制限します。
- その他の IP パケットは、ICMP (ping) も含めて、すべて破棄します。
- 2 つのコンピュータ間で送信されるすべてのデータを暗号化し、機密性を確保します。
このアプローチには、以下の長所があります。
- 2 つのコンピュータ間で送信されるすべてのデータに対して、機密性が確保されます。
- SQL Server が攻撃にさらされる可能性が大幅に低減されます。ハッカーが攻撃を仕掛けるとしたら、データベース サーバーに対話形式でログオンするか、またはアプリケーション サーバーの制御を奪って、TCP ポート 1433 経由で SQL Server に攻撃を仕掛ける以外に方法はありません。
- IPSec ポリシーは、定義と実装が非常に簡単です。
ただし、このポリシーには、以下の短所があります。
- SQL Server がドメイン コントローラと通信できないため、次のような制限が生じます。
- グループ ポリシーを適用できません (データベース サーバーをスタンドアロン サーバーとして運用することになります)。
- アプリケーション サーバーとデータベース サーバーの間で Windows 認証を行うには、両方のコンピュータ上に同期のとれたローカル アカウント (ユーザー名およびパスワードが同じアカウント) が維持されている必要があります。
- IPSec を適用するための、より確実な方法 (Windows 2000 既定および Kerberos) を使用できません。
SQL Server は、DNS サーバーも含めて、ほかのコンピュータと通信できません。
ここで示しているアプローチでは、仮共有キー認証を使用していますが、この認証方式を本稼動環境で使用することはお勧めできません。本稼動システムでは、証明書認証か、Windows 2000 ドメイン認証を使用するのが妥当です。仮共有シークレットを使用する IPSec ポリシーが適しているのは、開発環境またはテスト環境の場合だけです。
両方のコンピュータが静的な IP アドレスを持っている必要があります。
メモ
- IPSec ポリシーは、フィルタ、フィルタ操作、およびフィルタ規則から成ります。
- フィルタは、以下の要素で構成されます。
- 送信元の IP アドレスまたは IP アドレス範囲
- 宛先の IP アドレスまたは IP アドレス範囲
- IP プロトコル (TCP、UDP、"任意" など)
- 送信元および宛先のポート (TCP または UDP の場合のみ)
2 つのコンピュータ上でフィルタをミラー化することもできます。フィルタをミラー化すると、クライアント コンピュータとサーバー コンピュータに同じフィルタ規則が適用されます (送信元と宛先のアドレスは逆になります)。
フィルタ操作では、特定のフィルタが呼び出されたときに行う操作を指定します。以下のいずれかです。
- [許可] トラフィックを保護せず、そのまま送受信を許可します。
- [ブロック] トラフィックを許可しません。
- [セキュリティのネゴシエート] 通信の保護方法をクライアントとサーバーの間でネゴシエートし、その方法を使用して通信を行います。保護方法をネゴシエートできない場合は、通信が行われません。ネゴシーエートに失敗した場合の動作として、セキュリティ保護されていない通信を許可するか、すべての通信をブロックするかを指定することができます。
フィルタ規則では、フィルタをフィルタ操作と関連付けます。
指定した送信元および宛先 IP アドレスを逆に入れ換えて、すべてのパケットに規則を適用するポリシーをミラー化ポリシーと呼びます。ここでは、ミラー化ポリシーを作成します。
必要条件
ハードウェア、ソフトウェア、ネットワーク インフラストラクチャ、スキル、知識、サービス パックの要件は、以下のとおりです。
Microsoft® Windows® 2000 オペレーティング システムが稼動している 2 つのコンピュータ
この 2 つのコンピュータの IP アドレスが事前にわかっている必要があります。
データベース サーバー コンピュータ上では Microsoft® SQL Server® 2000 が稼動していること
要約
ここでは、次の手順について説明します。
- IP フィルタを作成する。
- フィルタ操作を作成する。
- フィルタ規則を作成する。
- IPSec ポリシーをリモート コンピュータにエクスポートする。
- ポリシーを割り当てる。
- フィルタの動作を確認する。
1. IP フィルタを作成する
■ データベース サーバー コンピュータ上に新しい IPフィルタを作成するには
データベース サーバーに管理者としてログオンします。
[管理ツール] プログラム グループからローカル セキュリティ ポリシー Microsoft 管理コンソール (MMC) スナップインを起動します。
左側のペインで、[ローカル コンピュータの IP セキュリティ ポリシー] を右クリックし、[IP フィルタ一覧とフィルタ操作の管理] をクリックします。
すべての ICMP トラフィックとすべての IP トラフィックに対して、2 つのフィルタ一覧が事前に定義されています。
[追加] をクリックします。
[IP フィルタ一覧] ダイアログ ボックスの [名前] ボックスに「SQL ポート」と入力します。
[追加] をクリックし、IP フィルタ ウィザードの開始画面が表示されたら [次へ] をクリックします。
[IP トラフィックの発信元] ダイアログ ボックスで、[発信元アドレス] ボックスの一覧から [特定の IP アドレス] を選択し、アプリケーション サーバー コンピュータの IP アドレスを入力します。
[次へ] をクリックします。
[IP トラフィックの宛先] ダイアログ ボックスで、[宛先アドレス] ボックスの一覧から [特定の IP アドレス] を選択し、データベース サーバー コンピュータの IP アドレスを入力します。
[次へ] をクリックします。
[IP プロトコルの種類] ダイアログ ボックスで、プロトコルの種類として TCP を選択し、[次へ] をクリックします。
[IP プロトコルのポート] ダイアログ ボックスで、[任意の発信ポート] をクリックし、[次の宛先ポート] をクリックします。ポート番号として「1433」を入力します。
[次へ] をクリックし、[完了] をクリックしてウィザードを終了します。
[閉じる] をクリックして、[IP フィルタ一覧] ダイアログ ボックスを閉じます。
2. フィルタ操作を作成する
この手順では、2 つのフィルタ操作を作成します。指定したコンピュータからの通信をすべてブロックするフィルタ操作と、アプリケーション サーバーおよびデータベース サーバーの間の通信に暗号化を適用するフィルタ操作の 2 つです。
■ フィルタ操作を作成するには
[フィルタ操作の管理] タブをクリックします。
いくつかのフィルタ操作が事前に定義されています。
[追加] をクリックして新しいフィルタ操作を作成します。
この手順では 2 つのフィルタ操作を作成しますが、まず最初に、選択したコンピュータからのすべての通信をブロックするためのブロック操作を作成します。
フィルタ操作ウィザードの最初の画面が表示されたら [次へ] をクリックします。
[名前] ボックスに「ブロック」と入力して、[次へ] をクリックします。
[フィルタ操作の全般オプション] ダイアログ ボックスで、[ブロック] をクリックし、[次へ] をクリックします。
[完了] をクリックして、ウィザードを終了します。
[追加] をクリックして、フィルタ操作ウィザードをもう一度起動します。
2 番目に作成するフィルタ操作は、アプリケーション サーバーとデータベース サーバー間の通信を暗号化するためのフィルタ操作です。
フィルタ操作ウィザードの最初の画面が表示されたら [次へ] をクリックします。
[名前] ボックスに「高レベルのセキュリティが必要」と入力して、[次へ] をクリックします。
[セキュリティのネゴシエート] をクリックし、[次へ] をクリックします。
[IPSec をサポートしないコンピュータと通信しない] をクリックし、[次へ] をクリックします。
[カスタム] をクリックし、[設定] をクリックします。
[データの整合性と暗号化 (ESP)] チェック ボックスがオンになっていることを確認します。
[整合性アルゴリズム] ボックスの一覧から [SHA1] を選択します。
[暗号化アルゴリズム] ボックスの一覧から [3DES] を選択します。
[セッションのキーの設定] の中の 2 つのチェック ボックスをオンにして、100000 KB ごと、3600 秒ごとに新しいキーを生成するように設定します。
[OK] をクリックして [カスタム セキュリティ メソッドの設定] ダイアログ ボックスを閉じ、[次へ] をクリックします。
[プロパティを編集する] チェック ボックスをオンにして、[完了] をクリックします。
[セキュリティで保護されていない通信を受け付けるが、常に IPSec を使って応答] チェック ボックスをオフにします。
[セッション キーの PFS (Perfect Forward Secrecy)] チェック ボックスをオンにして、[OK] をクリックします。
[閉じる] をクリックして、[IP フィルタ一覧とフィルタ操作の管理] ダイアログ ボックスを閉じます。
3. フィルタ規則を作成する
この手順では、「1. IP フィルタを作成する」で作成したフィルタに「2. フィルタ操作を作成する」で作成した 2 つのフィルタ操作を関連付けるために、2 つの新しいフィルタ規則を作成します。
■ フィルタ規則を作成するには
左側のペインで、[ローカル コンピュータの IP セキュリティ ポリシー] を右クリックし、[IP セキュリティ ポリシーの作成] をクリックします。
IP セキュリティ ポリシー ウィザードの開始の画面が表示されたら [次へ] をクリックします。
[名前] ボックスに「セキュリティ保護された SQL」と入力して、[次へ] をクリックします。
[既定の応答規則をアクティブにする] をオフにして、[次へ] をクリックします。
[プロパティを編集する] チェック ボックスをオンのままにし、[完了] をクリックします。
[追加] をクリックして、セキュリティの規則ウィザードを起動します。
セキュリティの規則ウィザードの開始画面が表示されたら [次へ] をクリックします。
[この規則ではトンネルを指定しない] をクリックし、[次へ] をクリックします。
[すべてのネットワーク接続] をクリックし、[次へ] をクリックします。
[次の文字列をキー交換 (仮共有キー) の保護に使う] をクリックします。
テキスト ボックスに秘密キーとして「MySecret」を入力します。
メモ このキーが両方のコンピュータの間で一致していないと、両者が互いに通信できません。実際には、長い乱数を使用すべきですが、ここでは、あくまで一例として "MySecret" というキーを使用しています。
[次へ] をクリックします。
[SQL ポート] オプションを選択します。
メモ オプションを選択するには、テキスト部分ではなく、オプション ボタンの黒丸をクリックする必要があります。
[次へ] をクリックします。
[高レベルのセキュリティが必要] をクリックし、[次へ] をクリックします。
[完了] をクリックして、[セキュリティ保護された SQL] ダイアログ ボックスに戻ります。
[追加] をクリックして、セキュリティの規則ウィザードをもう一度起動し、開始画面で [次へ] をクリックします。
[この規則ではトンネルを指定しない] をクリックし、[次へ] をクリックします。
[すべてのネットワーク接続] をクリックし、[次へ] をクリックします。
[認証方法] ダイアログ ボックスで、[Windows 2000 既定値 (Kerberos V5 プロトコル)] が選択されたままにして、[次へ] をクリックします。
メモ この規則では、[ブロック] フィルタ操作を指定するので、認証は不要です。
[IP フィルタ一覧] ダイアログ ボックスで、[すべての IP トラフィック] をクリックし、[次へ] をクリックします。
[フィルタ操作] ダイアログ ボックスで、[ブロック] を選択し、[次へ] をクリックします。
[完了] をクリックします。
[閉じる] をクリックして、[セキュリティ保護された SQL のプロパティ] ダイアログ ボックスを閉じます。
4. IPSec ポリシーをリモート コンピュータにエクスポートする
データベース サーバー上に作成した IPSec ポリシーをアプリケーション サーバー コンピュータにエクスポートおよびコピーする必要があります。
■ IPSec ポリシーをアプリケーション サーバー コンピュータにエクスポートするには
左側のペインで、[ローカル コンピュータの IP セキュリティ ポリシー] を右クリックし、[すべてのタスク] をポイントして、[ポリシーのエクスポート] をクリックします。
[ファイル名] ボックスに「セキュリティ保護された SQL」と入力し、[保存] をクリックしてファイルをローカル ハード ディスクにエクスポートします。
.ipsec ファイルをアプリケーション サーバーにコピーするか、ファイル共有上に置きます。
重要 エクスポートしたポリシー ファイルには、クリア テキストの仮共有キーが格納されているので、このファイルを適切に保護する必要があります。どちらのコンピュータのハード ディスクにも、このファイルを保存しないようにしてください。
アプリケーション サーバーに管理者としてログオンし、ローカル セキュリティ ポリシー MMC スナップインを起動します。
[ローカル コンピュータの IP セキュリティ ポリシー] を選択して右クリックし、[すべてのタスク] をポイントし、[ポリシーのインポート] をクリックします。
前の手順でエクスポートした .ipsec ファイルを探し、[開く] をクリックしてポリシーをインポートします。
5. ポリシーを割り当てる
IPSec ポリシーをアクティブにするには、ポリシーを割り当てる必要があります。1 つのコンピュータ上でアクティブにすることができるポリシーは、常に 1 つだけです。
■ アプリケーション サーバーおよびデータベース サーバー上で "セキュリティ保護されたSQL" ポリシーを割り当てるには
アプリケーション サーバー コンピュータ上で、インポートした "セキュリティ保護された SQL" ポリシーを右クリックし、[割り当て] をクリックします。
データベース サーバー コンピュータ上でも、同じ操作を実行します。
これにより、ミラー化ポリシーが両方のコンピュータ上で割り当てられます。
このポリシーを適用すると、アプリケーション サーバーだけがデータベース サーバーと通信できるようになります。さらに、ポート 1433 経由の TCP 接続だけが許可され、2 つのコンピュータの間で送信されるすべてのトラフィックが暗号化されます。
6. フィルタの動作を確認する
この手順では、アプリケーション サーバーとデータベース サーバーの間で送信されるデータが暗号化されていることをネットワーク モニタで確認します。
■ フィルタの動作を確認するには
アプリケーション サーバー コンピュータ上で、Visual Studio .NET を使って "SQLIPSecClient" という名前の新しい C# コンソール アプリケーションを作成します。
class1.cs に以下のコードをコピーし、既存のすべてのコードを上書きします。
メモ 接続文字列に含まれる IP アドレスは、実際のデータベース サーバーの IP アドレスで置き換えてください。
using System;
using System.Data;
using System.Data.SqlClient;
namespace SQLIPSecClient
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
// Replace the IP address in the following connection string with the IP
// address of your database server
SqlConnection conn = new SqlConnection(
"server=192.168.12.11;database=NorthWind;Integrated Security='SSPI'");
SqlCommand cmd = new SqlCommand(
"SELECT ProductID, ProductName FROM Products");
try
{
conn.Open();
cmd.Connection = conn;
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
Console.WriteLine("{0} {1}",
reader.GetInt32(0).ToString(),
reader.GetString(1) );
}
reader.Close();
}
catch( Exception ex)
{
}
finally
{
conn.Close();
}
}
}
}
[ビルド] メニューの [ソリューションのビルド] をクリックします。
2 つのコンピュータの間で Windows 認証を行うには、アプリケーション サーバー コンピュータへの対話式ログオンに現在使用しているアカウントをデータベース サーバー コンピュータ上に複製しておく必要があります。ユーザー名およびパスワードを必ず一致させてください。
さらに、SQL Server Enterprise Manager を使用して、新規作成したアカウント用のデータベース ログインを作成し、このログインに対応する新しいデータベース ユーザーを Northwind データベースに追加する必要があります。
次の操作を行い、両方のコンピュータ上で一時的に "セキュリティ保護された SQL" IPSec ポリシーの割り当てを解除します。
- アプリケーション サーバー コンピュータ上で [ローカル セキュリティ設定] を起動します。
- [ローカル コンピュータの IP セキュリティ ポリシー] をクリックします。
- 右側のペインで [セキュリティ保護された SQL] を右クリックし、[割り当ての解除] をクリックします。
- データベース サーバー コンピュータ上でも、同じ操作を実行します。
データベース サーバー コンピュータ上で、[管理ツール] プログラム グループの [ネットワーク モニタ] をクリックします。
メモ Windows 2000 Server に用意されているネットワーク モニタは、機能制限版です。完全版は、Microsoft SMS に用意されています。
ネットワーク モニタがインストールされていない場合は、コントロール パネルから [アプリケーションの追加と削除] を開いて、[Windows コンポーネントの追加と削除] をクリックし、[Windows コンポーネント] の一覧から [管理とモニタ ツール] を選択して、[詳細] をクリックし、[ネットワーク モニタ ツール] をクリックします。[OK] をクリックし、[次へ] をクリックしてネットワーク モニタの機能制限版をインストールします。Windows 2000 Server CD を挿入するように促すメッセージが表示されることがあります。
[キャプチャ] メニューの [フィルタ] をクリックして、アプリケーション サーバーとデータベース サーバーの間の TCP/IP ネットワーク トラフィックを表示するための新しいフィルタを作成します。
[キャプチャの開始] をクリックします。
アプリケーション サーバー コンピュータに戻り、テスト コンソール アプリケーションを実行します。Northwind データベースに登録されている製品の一覧がコンソール ウィンドウに表示されることを確認します。
データベース サーバーに戻り、ネットワーク モニタの [キャプチャの表示] をクリックします。
最初にキャプチャしたフレームをダブルクリックして、キャプチャしたデータを表示します。
キャプチャしたフレームを下方向にスクロールします。クリア テキストの SELECT ステートメントがあり、その後ろに、データベースから取得した製品の一覧があることを確認します。
次の操作を行い、両方のコンピュータ上で "セキュリティ保護された SQL" IPSec ポリシーを割り当てます。
- アプリケーション サーバー コンピュータ上で [ローカル セキュリティ設定] を起動します。
- [ローカル コンピュータの IP セキュリティ ポリシー] をクリックします。
- 右側のペインで [セキュリティ保護された SQL] を右クリックし、[割り当て] をクリックします。
- データベース サーバー コンピュータ上でも、同じ操作を実行します。
ネットワーク モニタのキャプチャ ウィンドウを閉じます。
[キャプチャの開始] をクリックし、[ファイルの保存] メッセージ ボックスが表示されたら [いいえ] をクリックします。
アプリケーション サーバー コンピュータに戻り、テスト コンソール アプリケーションをもう一度実行します。
データベース サーバー コンピュータに戻り、ネットワーク モニタの [キャプチャの表示] をクリックします。
データが判読不能になっている (暗号化されている) ことを確認します。
ネットワーク モニタを閉じます。
関連資料
IPSec の詳細については、TechNet の「IP Security and Filtering」(英語情報) を参照してください。
ネットワーク モニタの詳細については、MSDN ライブラリで Microsoft Platform SDK の「Network Monitor」(英語情報) を参照してください。