セキュリティ保護された ASP.NET アプリケーションの構築 : 認証、認定、および通信のセキュリティ保護 SQL Server 2000 との通信を SSL で保護する方法
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 アプリケーションの構築」の開始ページを参照してください。
要約 : 多くの場合、SQL Server データベース サーバーとの間で受け渡すデータを保護することがアプリケーションを運用するうえでの必須条件になります。SQL Server 2000 では、SSL を使って暗号化チャネルを作成できます。ここでは、データベース サーバーに証明書をインストールし、SQL Server を構成して SSL を有効にする方法を述べます。最後に、チャネルがセキュリティ保護されていることを確認します。
目次
クライアント (直接の呼び出し元) と Microsoft® SQL Server 2000 の間の通信リンクは、SSL (Secure Sockets Layer) プロトコルで保護することができます。SQL Server を構成して SSL を有効にすると、クライアントとサーバーの間で転送されるすべてのデータを暗号化して、転送中のデータの機密性を確保することができます。
メモ
データベース トラフィックは、IPSec、SSL のいずれかを使って保護できます。
IPSec でデータベース トラフィックを保護する方法の詳細については、このガイドの「パート IV : 参照」の「2 つのサーバー間の通信を IPSec で保護する方法」を参照してください。
IPSec の場合とは異なり、クライアントまたはサーバーの IP アドレスが変ったときに構成を変更する必要はありません。
SSL を使用するには、データベース サーバー コンピュータ上にサーバー証明書をインストールしておく必要があります。さらに、同じ証明機関 (CA) から発行されたルート証明機関証明書をクライアント コンピュータにインストールしておく必要があります。
SQL Server 2000 接続ライブラリをクライアントにインストールしておく必要があります。以前のバージョンのライブラリや汎用ライブラリは使用できません。
SSL は、TCP/IP (SQL Server の推奨通信プロトコル) および名前付きパイプに対してのみ動作します。
すべての接続に対して暗号化を適用するようにサーバーを構成することができます。
クライアント上では、以下のことが可能です。
- すべての送信接続に暗号化を適用できます。
- 接続文字列を使用して、接続ごとに暗号化を適用するかどうかをクライアント アプリケーションが選択することができます。
必要条件
ハードウェア、ソフトウェア、ネットワーク インフラストラクチャ、スキル、知識、サービス パックの要件は、以下のとおりです。
- Microsoft Windows® 2000 オペレーティング システムが稼動している 2 つのコンピュータ。
- データベース サーバー コンピュータ上では SQL Server 2000 が稼動していること。ここでは、SQL Server サービスがローカル システムとして稼動している場合を想定しています。証明書がローカル コンピュータ ストアに置かれている場合は、SQL の実行に使用されているアカウントに関係なく SSL が動作します。
- Microsoft Data Access Components (MDAC) 2.6 以上、または SQL Server 2000 クライアント接続ライブラリがクライアント コンピュータにインストールされていること。
- ここでは、Windows 2000 上で稼動している Microsoft 証明書サービスにアクセスしてサーバー認証用の証明書を作成する場合を想定していますが、これは必須条件ではありません。
要約
ここでは、次の手順について説明します。
- サーバー認証用の証明書をインストールする。
- 証明書がインストールされていることを確認する。
- 発行 CA の証明書をクライアントにインストールする。
- すべてのクライアントに SSL の使用を強制する。
- クライアントが SSL を使用するかどうかを選択できるようにする。
- 通信が暗号化されていることを確認する。
1. サーバー認証用の証明書をインストールする
SSL を使用するには、接続するクライアントによって信頼されている証明機関 (CA) から発行されたサーバー認証用の証明書をサーバーにインストールしておく必要があります。
■ サーバー証明書をインストールするには
管理者アカウントを使ってデータベース サーバーにログオンします。
Internet Explorer を起動し、次の例のようにアドレスを入力して、Microsoft 証明書サービスにアクセスします。 http://MyCA/certsrv
[証明書を要求する] をクリックし、[次へ] をクリックします。
[要求の詳細設定] をクリックし、[次へ] をクリックします。
[フォームを使用してこの CA への証明書の要求を送信します] をクリックし、[次へ] をクリックします。
以下のことに注意して、証明書要求フォームに必要事項を記入します。
SQL Server コンピュータの完全修飾ドメイン名を [名前] ボックスに入力します。次に、例を示します。
sql01.nwtraders.com
[目的] (つまり、必要な証明書の種類) ボックスでは、[サーバー認証証明書] をクリックします。
暗号化サービス プロバイダ (CPS) については、[Microsoft RSA SChannel Cryptographic Provider] をクリックします。
メモ Microsoft Base Cryptographic Provider version 1.0 と Microsoft Enhanced Cryptographic Provider も使用できますが、Microsoft Strong Cryptographic Provider は使用できません。
[ローカル コンピュータ ストアを使用する] チェック ボックスをオンにします。
メモ [強力な秘密キーの保護を有効にする] は、選択しないでください。
[送信] をクリックして、要求を送信します。
証明書サーバーが証明書を自動的に発行する場合は、この時点で証明書をインストールできます。証明書サーバーが証明書を自動的に発行しない場合は、Microsoft 証明書サービスにアクセスして [保留中の証明書の確認] を選択し、CA 管理者に証明書を発行してもらった後で、証明書をインストールできます。
2. 証明書がインストールされていることを確認する
この手順では、サーバー証明書が正しくインストールされていることを確認します。
■ 証明書がインストールされていることを確認するには
[スタート] ボタンをクリックし、[ファイル名を指定して実行] をクリックします。
「mmc」と入力し、[OK] をクリックします。
[コンソール] メニューの [スナップインの追加と削除] をクリックします。
[追加] をクリックします。
[証明書] をクリックし、[追加] をクリックします。
[コンピュータ アカウント] をクリックし、[次へ] をクリックします。
[ローカル コンピュータ: (このコンソールを実行しているコンピュータ)] がオンになっていることを確認し、[完了] をクリックします。
[閉じる] をクリックし、[OK] をクリックします。
左側ペインのツリー ビューで、[証明書 (ローカル コンピュータ)] を展開し、[個人] を展開して、[証明書] をクリックします。
前の手順で指定した完全修飾ドメイン名を持つ証明書が 1 つだけインストールされていることを確認します。
証明書をダブルクリックすると、その詳細を確認できます。
3. 発行 CA の証明書をクライアントにインストールする
証明書をインストールし、SQL Server サービスを再起動したら、SQL Server が クライアントとの間で SSL をネゴシエートできるようになります。SSL を使用して SQL Server に接続するクライアントは、以下の条件を満たしている必要があります。
- MDAC 2.6 または SQL Server 2000 接続ライブラリがインストールされていること
- SQL Server 証明書の発行元を信頼していること
■ 発行 CA の証明書をクライアント コンピュータにインストールするには
クライアント コンピュータに管理者としてログオンします。
Internet Explorer を起動し、次の例のように入力して、Microsoft 証明書サービスにアクセスします。
http://MyCA/certsrv
[CA 証明書または証明書失効リストの取得] をクリックし、[次へ] をクリックします。
[この CA 証明書のパスをインストールしてください] をクリックし、ルート証明書をインストールするかどうかを確認するダイアログ ボックスが表示されたら [はい] をクリックします。
4. すべてのクライアントに SSL の使用を強制する
この手順では、すべてのクライアントに対して SSL の使用を強制するようにサーバーを構成します。「5. クライアントが SSL を使用するかを選択できるようにする」で述べるように、SSL を使用するかどうかをクライアントが接続ごとに選択できるように設定することもできます。SSL の使用をクライアントに強制するようにサーバーを構成することには、以下のような利点があります。
- すべての通信が必ずセキュリティ保護されます。
- セキュリティ保護されていない接続は常に拒否されます。
ただし、以下のような短所があります。
- すべてのクライアントに MDAC 2.6 または SQL Server 2000 接続ライブラリがインストールされている必要があります。以前のバージョンのライブラリや汎用ライブラリでは接続できません。
- セキュリティ保護する必要のない接続についても暗号化が行われるため、パフォーマンスが若干低下します。
■ すべてのクライアントに SSL の使用を強制するには
SQL Server コンピュータ上で、[Microsoft SQL Server] プログラム グループの [サーバー ネットワーク ユーティリティ] をクリックします。
[プロトコル暗号化を設定する] をクリックしてオンにします。
TCP/IP と名前付きパイプの一方または両方が有効になっていることを確認します。
その他のプロトコルでは、SSL がサポートされていません。
[OK] をクリックして SQL Server ネットワーク ユーティリティを閉じます。[SQL Server ネットワーク ユーティリティ] メッセージ ボックスが表示されたら [OK] をクリックします。
SQL Server サービスを再起動します。
これ以降、クライアントから接続を開始するときには、クライアント側でセキュリティ保護された接続が指定されているかどうかに関係なく、常に SSL の使用が強制されます。
5. クライアントが SSL を使用するかどうかを選択できるようにする
この手順では、クライアントが SSL を使用するかどうかを選択できるように SSL を構成する方法を示します。クライアント ライブラリを使用して、クライアントから開始するすべての接続に SSL を強制的に適用するように構成するか、または、個々のアプリケーションが接続ごとに SSL を使用するかどうかを選択できるように設定することができます。クライアント側で SSL を構成することには、以下の長所があります。
- SSL のオーバーヘッドは、SSL を実際に必要としている接続でしか発生しなくなります。
- SQL Server との間の SSL 接続をサポートしていないクライアントでも、接続が可能になります。
このアプローチをとる場合は、セキュリティ保護されていない接続も許可されることを十分に認識してください。
■ サーバーを再構成するには
- SQL Server コンピュータ上で、サーバー ネットワーク ユーティリティを実行します。
- [プロトコル暗号化を設定する] チェック ボックスをオフにします。
- SQL Server サービスを再起動します。
- クライアント コンピュータに戻ります。
■ クライアントから開始するすべての接続に SSL を使用するには
このアプローチでは、クライアントから開始するすべての接続に SSL を使用するようにクライアント ライブラリを構成します。これは、暗号化をサポートしない SQL Server、および SQL Server 2000 より前のバージョンの SQL Server にはアクセスできないことを意味します。
- [Microsoft SQL Server] プログラム グループで、[クライアント ネットワーク ユーティリティ] をクリックします。
- TCP/IP と名前付きパイプの一方または両方が有効になっていることを確認します。
- [プロトコルの暗号化を設定する] をオンにします。
■ アプリケーションが暗号化を使用するかどうかを選択できるようにするには
このアプローチでは、アプリケーションが接続文字列を通じて、暗号化を使用するかどうかを決定します。これにより、各アプリケーションが暗号化を必要な時にのみ使用することができます。
- SQL Server への接続に OLE-DB データ プロバイダを使用している場合は、次のサンプル OLE-DB 接続文字列のように、Use Encryption for Data を True に設定します。
Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Northwind;Data Source=sql01;Use Encryption for Data=True
- SQL Server への接続に SQL Server .NET データ プロバイダを使用している場合は、次の例のように、Encrypt を True に設定します。
Server=sql01;Integrated Security=SSPI;Persist Security Info=False;Database=Northwind;Encrypt=True
6. 通信が暗号化されていることを確認する
この手順では、アプリケーション サーバーとデータベース サーバーの間で送信されるデータが暗号化されていることをネットワーク モニタで確認します。最初に、クリア テキスト形式でデータ送信を開始した後、サーバーとクライアントを順に構成して暗号化を有効にします。
■ 通信が暗号化されていることを確認するには
クライアント コンピュータ上で、Visual Studio .NET を使って SQLSecureClient という名前の新しい C# コンソール アプリケーションを作成します。
class1.cs に以下のコードをコピーし、既存のすべてのコードを上書きします。
メモ 接続文字列に含まれるサーバー名は、実際のデータベース サーバーの名前で置き換えてください。
using System; using System.Data; using System.Data.SqlClient; namespace SQLSecureClient { class Class1 { [STAThread] static void Main(string[] args) { // Replace the server name in the following connection string with the // name of your database server SqlConnection conn = new SqlConnection( "server='sql01';database=NorthWind;Integrated Security='SSPI'"); SqlCommand cmd = new SqlCommand("SELECT * 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 認証を行うには、クライアント コンピュータへの対話式ログオンに現在使用しているアカウントを、データベース サーバー コンピュータ上に複製しておく必要があります。ユーザー名およびパスワードを必ず一致させてください。もう 1 つの方法として、両方のコンピュータで認識されるドメイン アカウントを使うことも考えられます。
さらに、SQL Server Enterprise Manager を使用して、新規作成したアカウント用のデータベース ログオンを作成し、このログオンに対応する新しいデータベース ユーザーを Northwind データベースに追加する必要があります。
データベース サーバー コンピュータ上で SQL Server ネットワーク ユーティリティを使って [プロトコル暗号化を設定する] をオフにし、暗号化を無効にします。
データベース サーバー コンピュータ上で、[管理ツール] プログラム グループの [ネットワーク モニタ] をクリックします。
メモ Windows 2000 Server に用意されているネットワーク モニタは、機能制限版です。完全版は、Microsoft SMS に用意されています。
ネットワーク モニタがインストールされていない場合は、コントロール パネルの [アプリケーションの追加と削除] を起動し、[Windows コンポーネントの追加と削除] をクリックします。Windows コンポーネントの一覧の [管理とモニタ ツール] をクリックし、[詳細] をクリックして、[ネットワーク モニタ ツール] をクリックします。[OK] をクリックし、[次へ] をクリックしてネットワーク モニタの機能制限版をインストールします。Windows 2000 Server CD を挿入するように促すメッセージが表示されることがあります。
[キャプチャ] メニューの [フィルタ] をクリックして、クライアント コンピュータとデータベース サーバーの間の TCP/IP ネットワーク トラフィックを表示するための新しいフィルタを作成します。
[キャプチャの開始] をクリックします。
クライアント コンピュータに戻り、テスト コンソール アプリケーションを実行します。Northwind データベースに登録されている製品の一覧がコンソール ウィンドウに表示されることを確認します。
データベース サーバーに戻り、ネットワーク モニタの [キャプチャの表示] をクリックします。
最初にキャプチャされたフレームをダブルクリックして、キャプチャされたデータを表示します。
キャプチャしたフレームを下方向にスクロールします。クリア テキストの SELECT ステートメントがあり、その後ろに、データベースから取得した製品の一覧があることを確認します。
ここで、SQL Server ネットワーク ユーティリティを使って次の操作を行い、すべての接続に暗号化の使用が強制されるようにサーバーを構成します。
- SQL Server ネットワーク ユーティリティで [プロトコル暗号化を設定する] を選択します。
- SQL Server サービスをいったん停止した後、再開します。
ネットワーク モニタに戻り、[キャプチャの開始] をクリックします。[ファイルの保存] ダイアログ ボックスが表示されたら [いいえ] をクリックします。
クライアント コンピュータに戻り、テスト コンソール アプリケーションをもう一度実行します。
データベース サーバー コンピュータに戻り、ネットワーク モニタの [キャプチャの表示] をクリックします。
データが判読不能になっている (暗号化されている) ことを確認します。
次の操作を行い、暗号化を強制しないようにサーバーを再構成します。
- SQL Server ネットワーク ユーティリティの [プロトコル暗号化を設定する] チェック ボックスをオフにします。
- SQL Server サービスをいったん停止した後、再開します。
ネットワーク モニタで新しいキャプチャを開始し、クライアント アプリケーションに戻ります。データがクリア テキストに戻っていることを確認します。
クライアント コンピュータに戻り、[Microsoft SQL Server] プログラム グループの [クライアント ネットワーク ユーティリティ] をクリックします。
[プロトコルの暗号化を設定する] を選択し、[OK] をクリックしてクライアント ネットワーク ユーティリティを閉じます。
ネットワーク モニタに戻り、[キャプチャの開始] をクリックします。[ファイルの保存] ダイアログ ボックスが表示されたら [いいえ] をクリックします。
クライアント コンピュータに戻り、テスト コンソール アプリケーションをもう一度実行します。
データベース サーバー コンピュータに戻り、ネットワーク モニタの [キャプチャの表示] をクリックします。
データが判読不能になっている (暗号化されている) ことを確認します。
どの場合も、通信シーケンスの開始時には、SQL Server からサーバー認証用の証明書がクリア テキストでクライアントに送信されることに注意してください。これは、SSL プロトコルの一部であり、サーバーとクライアントが共に暗号化を必要としていなくても行われます。
関連資料
Windows 2000 のネットワーク モニタのインストール方法の詳細については、以下の Microsoft サポート技術情報の Knowledge Base の文書を検索してください。
- 243270「Windows 2000 にネットワーク モニタをインストールする方法」
- 276553「HOW TO: Enable SSL Encryption for SQL Server 2000 with Certificate Server」(英語情報)
ネットワーク モニタの詳細については、MSDN ライブラリで Microsoft Platform SDK の「Network Monitor」(英語情報) を参照してください。