1. はじめ
に ASP.NET 2.0 アプリケーションを作成する場合、開発者は通常、機密の構成情報を Web.config ファイルに保存します。最も一般的な例はデータベース接続文字列ですが、Web.config ファイルに含まれる他の機密情報には、SMTP サーバー接続情報やユーザー資格情報データなどが含まれます。 ASP.NET は、.config 拡張子を持つファイル リソースに対するすべての HTTP リクエストをデフォルトで拒否するように構成できますが、ハッカーが Web サーバーのファイル システムにアクセスできる場合、機密情報が盗まれる可能性があります。たとえば、Web サイトへの匿名 FTP アクセスを誤って許可してしまい、ハッカーが FTP プロトコル経由で Web.config ファイルを簡単にダウンロードしてしまう可能性があります。
幸いなことに、ASP.NET 2.0 では、<connectionStrings> セクションやアプリケーションで使用されるカスタム構成セクションなど、Web.config ファイルの選択した部分を暗号化できるため、この問題は軽減されます。構成セクションは、エンコードまたは aspnet_regiis.exe (コマンド ライン プログラム) を使用して簡単に事前暗号化できます。暗号化されると、Web.config 設定は覗き見から保護されます。さらに、ASP.NET ページから暗号化された構成設定をプログラムで取得すると、ASP.NET は読み取った暗号化された部分を自動的に復号化します。つまり、構成情報が暗号化されたら、暗号化されたデータを使用するために他のコードを記述したり、アプリケーションでそれ以上のアクションを実行したりする必要はありません。
この記事では、この構成設定セクションをプログラムで暗号化および復号化する方法について説明し、コマンド ライン プログラム aspnet_regiis.exe の使用方法を検討します。次に、ASP.NET 2.0 によって提供される暗号化オプションを評価します。さらに、ASP.NET バージョン 1.x で構成情報を暗号化する方法についても簡単に説明します。
2. 前提
ASP.NET 2.0 構成情報の暗号化方法について説明する前に、次の点に留意してください。
1. すべての形式の暗号化には何らかのシークレットが含まれており、このシークレットはデータの暗号化と復号化に使用されます。対称暗号化アルゴリズムはメッセージの暗号化と復号化に同じキーを使用しますが、非対称暗号化アルゴリズムは暗号化と復号化に異なるキーを使用します。どのテクノロジーが使用されるかに関係なく、最も重要なことは、復号キーがどれほど安全であるかです。
2. ASP.NET 2.0 が提供する構成暗号化テクノロジは、ハッカーが何らかの方法で構成ファイルを取得できないように設計されています。その考えは、ハッカーのコンピュータ上に Web.config ファイルがあれば、暗号化された部分を解読できないということです。ただし、Web サーバー上の ASP.NET ページが暗号化された構成ファイルの情報を要求する場合、データを使用するにはその前に復号化する必要があります (これはコードを記述しなくても行われます)。したがって、ハッカーが構成ファイルをクエリしてその結果を表示する ASP.NET Web ページをシステムにアップロードできる場合、暗号化された設定をプレーン テキストとして表示することができます。 (詳細については、この記事で提供されているサンプル ASP.NET ページを参照してください。このページでは、Web.config ファイルのさまざまな部分を暗号化および復号化する方法が示されています。ご覧のとおり、ASP.NET ページはアクセス (および表示) できます。暗号化されたデータ (通常のテキスト形式)
3. 構成情報の暗号化および復号化には、一定のパフォーマンス コストが必要です。したがって、機密情報を含む構成部分のみを暗号化するのが一般的です。たとえば、<compilation> または <authorization> 構成セクションを暗号化する必要がない場合があります。
3. どのような種類の情報を暗号化できますか?
ASP.NET 2.0 構成情報を暗号化する方法を分析する前に、まずどのような構成情報が暗号化できるかを見てみましょう。 .NET Framework 2.0 が提供するライブラリを使用すると、開発者は Web.config または machine.config ファイル内のほとんどの構成セクションを暗号化できます。これらの構成部分は、<configuration> 要素または <system.web> 要素の子ノードである XML 要素です。たとえば、次のサンプル Web.config ファイルには、
<connectionStrings>、<compilation>、および <authentication> として明示的に定義された 3 つの構成設定が含まれています。
<?xmlバージョン="1.0"?>
<構成 xmlns=" http://schemas.microsoft.com/.NetConfiguration/v2.0 ">
<接続文字列>
<add name="MembershipConnectionString" connectionString="connectionString"/>
</connectionStrings>
<システム.ウェブ>
<コンパイルデバッグ="true"/>
<認証モード="フォーム" />
これら
の各セクションは、オプションでプログラムまたは aspnet_regiis.exe (コマンド ライン ツール) 経由で暗号化できます。暗号化されると、暗号化されたテキストは構成ファイルに直接保存されます。たとえば、上記の <connectionStrings> セクションを暗号化すると、結果の Web.config ファイルは次のようになります: (注: スペースの制限のため、<CipherValue> の大部分は省略しています)
<?xml version= 「1.0」?>
<構成 xmlns=" http://schemas.microsoft.com/.NetConfiguration/v2.0 ">
<connectionStrings configProtectionProvider="DataProtectionConfigurationProvider">
<暗号化データ>
<暗号データ>
<CipherValue>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAed...GicAlQ==</CipherValue>
</CipherData>
</暗号化データ>
</connectionStrings>
<システム.ウェブ>
<コンパイルデバッグ="true"/>
<認証モード="フォーム" />
</system.web>
さらに、この手法を使用して暗号化できない構成部分がいくつかあります。
· <processModel>
・<ランタイム>
・<mscorlib>
・<起動>
・<system.runtime.remoting>
・<configProtectedData>
・<衛星アセンブリ>
・<暗号化設定>
・<cryptoNameMapping>
· <cryptoClasses>
これらの構成部分を暗号化するには、これらの値を暗号化してレジストリに保存する必要があります。このプロセスに役立つ aspnet_setreg.exe コマンド ライン ツールがあります。このツールについては、この記事の後半で説明します。
[ヒント] Web.Config と Machine.Config の違い:
Web.config ファイルは、特定の Web アプリケーションの構成設定を指定し、アプリケーションのルート ディレクトリにありますが、machine.config ファイルは、そこにあるすべての構成設定を指定します。 Web サーバー上の $WINDOWSDIR$Microsoft.NetFrameworkVersionCONFIG ディレクトリにあるサイトの構成設定。
4. 暗号化オプション
開発者は ASP.NET 2.0 プロバイダー モデルを使用して構成セクション情報を保護でき、これによりあらゆる実装を API にシームレスにプラグインできます。 .NET Framework 2.0 は、構成セクション情報を保護するための 2 つの組み込みプロバイダーを提供します。
· Windows Data Protection API (DPAPI) プロバイダー (DataProtectionConfigurationProvider): このプロバイダーは、Windows の組み込み暗号化テクノロジを使用して、構成セクションの暗号化と復号化を行います。デフォルトでは、このプロバイダーはネイティブ キーを使用します。ユーザー キーを使用することもできますが、これには少しカスタマイズが必要です。
· RSA で保護された構成プロバイダー (RSAProtectedConfigurationProvider): RSA 公開キー暗号化を使用して、構成セクションの暗号化と復号化を行います。このプロバイダーを使用して、構成情報の暗号化と復号化に使用される公開キーと秘密キーを保存するキー コンテナーを作成する必要があります。エクスポート可能なキー コンテナーを作成することで、マルチサーバー ファームで RSA を使用できます。
もちろん、必要に応じて独自の保護設定プロバイダーを作成することもできます。
この記事では、DPAPI プロバイダーを使用したマシンレベルのキーの使用についてのみ説明します。これは、キーやキー コンテナーを作成する必要がないため、これまでで最も簡単な方法です。もちろん、欠点は、暗号化された構成ファイルは、最初に暗号化を実装した Web サーバーでのみ使用できることです。さらに、マシン キーを使用すると、Web サーバー上のどのサイトでも暗号化されたテキストを復号化できるようになります。
5. 構成セクションをプログラムで暗号化します。
System.Configuration.SectionInformation クラスは構成セクションの記述を抽象化します。構成セクションを暗号化するには、SectionInformation クラスの ProtectSection(provider) メソッドを使用し、暗号化の実行に使用するプロバイダーの名前を渡すだけです。アプリケーションの Web.config ファイル内の特定の構成セクションにアクセスするには、WebConfigurationManager クラス (System.Web.Configuration 名前空間内) を使用して Web.config ファイルを参照し、その GetSection を使用します。(sectionName) メソッドは、 ConfigurationSection インスタンス。最後に、ConfigurationSection インスタンスの SectionInformation プロパティを介して SectionInformation オブジェクトを取得できます。
以下では、簡単なコード例を使用して問題を説明します
。
{
構成構成 = WebConfigurationManager。
OpenWebConfiguration(Request.ApplicationPath);
ConfigurationSection セクション = config.GetSection(セクション名);
if (セクション != null &&!section.SectionInformation.IsProtected)
{
セクション.SectionInformation.ProtectSection(プロバイダー);
config.Save();
}
}
private void UnProtectSection(string セクション名) {
構成 config =WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
ConfigurationSection セクション = config.GetSection n(セクション名);
if (セクション != null && セクション.SectionInformation.IsProtected)
{
セクション.セクション情報.UnprotectSection();
config.Save();
、
対応するパラメーターはセクション名 (connectionStrings など) とプロバイダー (DataProtectionConfigurationProvider など) であり、Web.config ファイルを参照して Web.config ファイルを開きます。このセクションでは、SectionInformation オブジェクトの ProtectSection(provider) メソッドが呼び出され、最後に構成の変更が保存されます。
一方、UnProtectSection(provider) メソッドは、特定の構成セクションの復号化を実装します。ここでは、復号化するセクションのみを渡す必要があります。その情報は、暗号化されたセクション (つまり、上記の例の <connectionStrings> セクション) に付随するタグにすでに格納されているため、プロバイダーに煩わされる必要はありません。これは暗号化され、後でプロバイダーが含まれます: <connectionStringsconfigProtectionProvider="DataProtectionConfigurationProvider">)。
このデータが暗号化されると、ASP.NET ページからデータを読み取るとき (つまり、SqlDataSource コントロールから、または ConfigurationManager.ConnectionStrings[connStringName].ConnectionString を介してプログラムで接続文字列情報を読み取るとき) に、ASP.NET が自動的にデータを復号化することに注意してください。接続文字列を返し、プレーン テキスト値を返します。つまり、暗号化を実装した後にコードを変更する必要はまったくありません。かなりクールですよね?
この記事からダウンロードしたサンプル ASP.NET 2.0 Web サイトには、サイトの Web.config ファイルを表示するサンプル ページが含まれています。このファイルには、暗号化構成のさまざまな部分に対応する複数行の TextBox と、対応する Web コントロール ボタンがあります。ファイル。この例では、上で説明した ProtectSection() メソッドと UnProtectSection() メソッドも使用します。
6. コマンド ライン ツール aspnet_regiis.exe を使用します。
aspnet_regiis.exe コマンド ライン ツールを使用して、Web.config ファイルの構成部分を暗号化および復号化することもできます。これは、「%WINDOWSDIR%Microsoft.Net」にあります。 Frameworkversion" ディレクトリ。ツール。 Web.config ファイルのセクションを暗号化するには、次のようにこのコマンド ライン ツールで DPAPI マシン キーを使用できます。
特定の Web サイトの Web.config ファイルを暗号化する一般的な形式:
aspnet_regiis.exe -pef Section Physical_directory - prov プロバイダー
または:
aspnet_regiis.exe -pe section -app virtual_directory -prov
特定の Web サイトの Web.config ファイルを暗号化するプロバイダーの特定のインスタンス:
aspnet_regiis.exe -pef "connectionStrings" "C:InetpubwwwrootMySite" -prov " DataProtectionConfigurationProvider"
または:
aspnet_regiis.exe -pe "connectionStrings" -app "/MySite" -prov "DataProtectionConfigurationProvider"
特定の Web サイトの Web.config ファイルを復号化する一般的な形式:
aspnet_regiis.exe -pdf セクション Physical_directory
または:
aspnet_regiis。 exe -pd セクション -app virtual_directory
特定の Web サイトの Web.config ファイルを復号する具体的な例:
aspnet_regiis.exe -pdf "connectionStrings" "C:InetpubwwwrootMySite"
または:
aspnet_regiis.exe を実行するように指定することもできます
。machine.config ファイルの暗号化/復号化。
[ヒント] ASP.NET バージョン 1.x での構成設定の暗号化。ASP.NET
バージョン 1.x で構成設定を保護するには、開発者は機密設定を暗号化して Web サーバーのレジストリに保存し、「強力な」キー ストレージを使用する必要があります。方法。 (ASP.NET 2.0 のように) 暗号化されたコンテンツを保存するのではなく、構成ファイルには、暗号化された値が保存されるレジストリ キーへの参照が含まれるだけです。例:
<identity impersonate="true"
userName="レジストリ:HKLMSOFTWAREMY_SECURE_APPidentityASPNET_SETREG,userName"
password="registry:HKLMSOFTWAREMY_SECURE_APPidentityASPNET_SETREG,password" />
Microsoft は、機密構成情報を暗号化し、それを「強力な」レジストリ エントランスに移動するための aspnet_setreg.exe コマンド ライン ツールを開発者に提供しています。残念ながら、このツールは特定の構成設定に対してのみ機能します。一方、ASP.NET 2.0 では、あらゆる構成セクションを暗号化できます。
ASP.NET 1.x アプリケーションでの aspnet_setreg.exe の使用の詳細については、MSDN の KB#32990 を参照してください。残念ながら、このコマンド ライン プログラムでは、構成設定の事前定義されたセクションのみを暗号化でき、データベース接続文字列や自分で追加したその他の機密情報を暗号化することはできません。
7. 結論
この記事では、ASP.NET 2.0 が提供するさまざまな暗号化オプションを使用して構成セクションの情報を保護する方法を学び、プログラミング手法と aspnet_regiis.exe を使用して Web.config の構成セクションをそれぞれ暗号化する方法についても説明しました。 。機密の構成設定を保護すると、機密の構成設定の検出がより困難になり、サイトのハッキングがより困難になります。現在、ASP.NET 2.0 はすでに比較的簡単な暗号化および復号化テクノロジを提供しており、開発者が機密の構成設定を保護するためにこの方法を使用しない理由はありません。