e知識「e-chishiki.com」では、インドでの著名なIT著者、IT教育者、eセキュリティーの大家により作成された様々な種類のプログラミング言語に関する技術的なコンテンツを知識情報データーベースとして提供します。
オンライン書籍; Microsoft .NET Web アプリケーションセキュリティ
第 8 章 : 暗号化(書籍のプレビュー)
Microsoft .NET Web アプリケーションセキュリティ
インドの情報セキュリティの大家が書き下ろした最新のセキュリティ書籍の一部をオンライン書籍としてご紹介します。書籍の情報は、こちらをご覧ください。
web.config の暗号化
次に、構成ファイル web.config の暗号化について見ていくことにしましょう。
web.config ファイルは、Web アプリケーションの構成パラメータを格納しているので、すべての攻撃者の標的になります。すべてのプログラマは、接続文字列を web.config に格納するように訓練されるので、このファイルには、ユーザー ID、パスワード、テーブル名などが含まれます。web.config を侵害することで、攻撃者はたとえばデータベースにログオンし、そこに格納されている機密データにアクセスできるようになります。
次に示すような簡単な web.config ファイルを encrypt サブディレクトリに作成し、仮想ディレクトリ en でそこを指し示します。
C:\encrypt> notepad web.config web.config <configuration> <connectionStrings> <add name="vijay" connectionString="database=book;uid=sa;pwd=vmukhi" providerName="System.Data.SqlClient"/> </connectionStrings> </configuration>
connectionStrings は add という名前の要素を受け取って、接続文字列を追加します。接続文字列には vijay という名前を割り当てます。名前以外に、providerName や connectionString などの他のパラメータを明示的に指定します。
このような接続文字列は、データベース コントロールやコードでいとも簡単に直接読み取ることができます。a.aspx ファイルはこの処理を実装したものです。
a.aspx
<%@ Page Language="C#" %>
<script runat="server">
void Page_Load(object o, EventArgs e)
{
Response.Write(ConfigurationManager.ConnectionStrings["vijay"].ConnectionString + "<br>");
Response.Write(ConfigurationManager.ConnectionStrings["vijay"].ProviderName);
}
</script>
ブラウザ ウィンドウ : http://localhost/en/a.aspx
database=book;uid=sa;pwd=vmukhi
System.Data.SqlClient
このコードは、ConnectionStrings プロパティとインデクサ vijay を使用して、接続文字列とプロバイダ名を表示します。
Web フォームは、異なるユーザー ID とパスワードで異なるデータベースに接続する多数の接続文字列をサポートできます。プログラマは、一般に、ファイルが侵害されることには注意しますが、復号化が面倒すぎるためパスワードは暗号化しません。
Microsoft は、aspnet_regiis というツールを提供することでこの問題を解決しています。このツールは、指定するパラメータに基づいて、web.config の重要な部分を暗号化します。復号化は自動的に行われます。
C:\encrypt>aspnet_regiis -pe "connectionStrings" -app "/en" -prov "DataProtectionConfigurationProvider" Encrypting configuration section... Succeeded!
-pe オプションは、この例の connectionStrings のように、特定のセクションを暗号化します。Microsoft は、.config ファイルの 4 つのセクション、appsettings、connectionstrings、sessionstate、および identity を暗号化することを推奨しています。
-app オプションでは、web.config が格納されている仮想ディレクトリの名前を指定します。仮想ディレクトリは c:\encrypt にマップするので en として指定します。Framework では、暗号化に使用する API を次の 2 つから選択できます。1 つは DataProtectionConfigurationProvider という名前の Data Protection API (DPAPI) で、もう 1 つの既定プロバイダである RSAProtectedConfigurationProvider は名前が示すように RSA を使用します。–prov オプションは、プロバイダの指定に使用します。
web.config を開くと、接続文字列の意味不明な文字が表示されます。
web.conifg
<configuration>
<connectionStrings configProtectionProvider="DataProtectionConfigur
ationProvider">
<EncryptedData>
<CipherData>
<CipherValue>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAotrXq4IY4ECBJ3zOsOozKgQAAAACAAAAAAADZgAAqAAAABAAAADHdyniab0DST51I5HFEzDyAAAAAASAAACgAAAAEAAAAJ0eiq8+zd3TJnKBMmLmWAs4AQAAMznVY6uxWHZJitdz5BAWqRZ4H9v9T3mp/OV3/IntPaIV5drZk0o+4L/pgrEZsby8BDWctdx0helTwQGrJQLQa/YZVbDcSGAaNZH4WU1w0AMD+m+IzKhKpL0uLSKhw446somvyCeFfHOiWHaCnArG3hrfLAZhyWKB+M2bmcpWiPt/FG3TWQ3CtVQKXf10sIaEF6X3UlbTsqg4F1AmmFkmTTvzbRAriX3NHSc//RXf8HqBM0WvpgxJOqoNHQyT9M+Nu/+P48Gui1XQH0sS/gEtI9LlDWjeYV0uraargDt1SFhboa2oiUibwkY5QD+sVHQeW59O8dsqC/LJWOxggoPnl+ZTW/RlWxQjWSceHMwFaqC4oCnjvg2c9s4eCcw7fkr6nLMUQpb9zFcaIJR052DaBmBTyXhNr4JgFAAAABYCJOcwGIq79LQD9xt2keGu+t4M</CipherValue>
</CipherData>
</EncryptedData>
</connectionStrings>
</configuration>
.config ファイルの connectionStrings 要素には新しいパラメータが割り当てられ、属性値は暗号化されています。パスワードの形跡はどこにもありません。しかしページ a.aspx をブラウザに読み込むと、前と同じような接続文字列が表示されます。このことから、aspx ファイルのコードは web.config 内のデータが暗号化されているのを認識していないことを証明しています。
何らかの理由で暗号化を手動で解除したい場合は、次のコマンドを使用します。
C:\encrypt>aspnet_regiis -pd "connectionStrings" -app "/en" Decrypting configuration section... Succeeded!
config ファイルを復号化するには、pe オプションを pd オプションに変更します。
DPAPI を使用することの利点は、プログラマがキーの操作をまったく行わなくてよいことです。キーは、C:\WINDOWS\system32\Microsoft\Protect\S-1-5-18> フォルダに格納されます。
このようなとても簡単で透過的であるにもかかわらず、多くの web.config 構成ファイルが暗号化されていません。



