web.configにはデータベースへの接続文字列など、ユーザ名とパスワードといった情報を記述しなければいけない場合があります。こういった重要な情報をテキストファイルに平文で記述していることに不安を覚える人もいるでしょう。
ASP.NET 2.0ではaspnet_regiis.exeを利用してweb.configを暗号化することができるようになりました。この暗号化した情報はASP.NETによって自動的に複合化されて読み取られるので、開発の終了後、運用サーバに配置する時点でweb.configの暗号化を行うだけの手間しか必要ではありません。
実際の暗号化の手順をみていきましょう。
○運用サーバ上で暗号化を行う
運用サーバの管理を自分で行っているのであれば、運用サーバ上で暗号化を行うのが一番簡単です。
サーバ上のコンソールから以下のようにコマンドを入力します。
aspnet_regiis -pef "暗号化するセクション" web.configがあるフォルダ
aspnet_regiis.exeは通常 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 フォルダに存在しています。
暗号化はセクションごとに行います。暗号化するセクションには、自分が利用しているセクションに合わせて以下のように指定します。
【例】
データベースへの接続:"connectionStrings"
アプリケーション設定:"appSettings"
smtpクライアント設定:"system.net/mailSettings/smtp"
web.configがあるフォルダには、たとえば「c:\Inetpub\wwwroot\website1」のように物理的なフォルダを指定します。
以下の内容のweb.configファイルをCドライブのルートにおいて実験してみます。
--------------------------------------------------------------------
<?xml version="1.0"?>
<configuration>
<connectionStrings>
<remove name="LocalSqlServer"/>
<add name="LocalSqlServer"
connectionString="server=サーバ名;uid=ユーザID;pwd=パスワード;Trusted_Connection=no;database=データベース名"
providerName="System.Data.SqlClient"/>
</connectionStrings>
</configuration>
--------------------------------------------------------------------
実行するコマンドは次のようになります。
> aspnet_regiis -pef "connectionStrings" c:\
これによって、web.configは以下のように書き換えられます。
--------------------------------------------------------------------
<?xml version="1.0"?>
<configuration>
<connectionStrings configProtectionProvider="RsaProtectedConfigurationProvider">
<EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element"
xmlns="http://www.w3.org/2001/04/xmlenc#">
<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">
<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<KeyName>Rsa Key</KeyName>
</KeyInfo>
<CipherData>
<CipherValue>mUBXZ2ToYw36KCzKafXkmoFRU144s2FHbs9BSdRauJAbH0b4rM2mv3Mjlmx+lolwEM6Ay0HP4XQnsXSt2/qznSFyZ7L9j1XpzdK02Cj8hLoFePQjFmbQstZ+I3ZY44OE8LfGPGVqkGjJgxoG4nJ8LfDF6PZTOHg/HXZ3ppbFdQk=</CipherValue>
</CipherData>
</EncryptedKey>
</KeyInfo>
<CipherData>
<CipherValue>F+AKN5rRXFYHf03QWXW7/HgxXjWePM3akXoZQ6PEKntYW4QSOVBr/nZjBBb9HynOXyCELhqyXqAsQA8pWYVEAYkmgS2y+yoU3R3P8NFjMl/K9ZbuYhVoSyuHFmwDmF0Z+JjqN1FCRYw+oaXhwEm3swcoKe/192ci3TTM47+AeSKCJiQuOTS4fqggl6oFaDxzKbUU4rE6Jro1P42/uU8HSHMOfqwt0YA4NKW06uoMMOfjUqzrcYmLasA/67vAy1B4hDeCSt5hodZT2FBpRPT8JLiR5/ZN0wDJLEAMiFP98lbhwFBWnCI0ZBoh2b/jW3aJ/AZ7XrigXCRBXJhyFYh9HQOEumroGzul2if7/Gpn5D8lEzOIbNRrZivuOA+tMg1Q</CipherValue>
</CipherData>
</EncryptedData>
</connectionStrings>
</configuration>
--------------------------------------------------------------------
なお、暗号化したデータを複合化して平文に戻すことも可能です。
この場合、-pef オプションの代わりに -pdf オプションを利用します。
> aspnet_regiis -pdf "connectionStrings" c:\
○運用サーバとは別の開発マシンで暗号化を行う
運用サーバの管理権限が開発者にない場合、暗号化のためのキーを運用サーバと開発マシンとで合わせる必要があります。このため若干手順が増えます。
◆運用サーバ上の作業◆
・キーを作成する
運用サーバ上にまず利用するキーを作成します。
> aspnet_regiis -pc "CustomKey" -exp
このように実行することで他のマシンへの持ち出し(エクスポート)が可能なCustomKeyという名前のキーを作成できます。
キーは C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys フォルダに作成されます。
・キーに読み取り権限を追加する
キーはNTFSのアクセス権で管理されています。ASP.NETの実行ユーザがキーを読み取れるようにアクセス権を付与する必要があります。
> aspnet_regiis -pa "CustomKey" "NT Authority\Network Service"
このように実行すると、Windows Server 2003上のASP.NETの実行ユーザにCustomKeyの読み取り権限が付与されます。
・キーをエクスポートする
キーはXMLファイルにエクスポートすることでやりとりすることができます。
> aspnet_regiis -px "CustomKey" "C:\CustomKey.xml" -pri
このように実行すると、CustomKey.xmlというファイルにCustomKeyがエクスポートされます。
-priオプションは開発マシン上で暗号化だけでなく複合化もできるようにするために必要なオプションです。
開発マシンにはこのCustomKey.xmlファイルを渡します。
◆開発マシン上の作業◆
・キーをインポートする
運用サーバ上で作成されたCustomKey.xmlファイルを開発マシン上に登録します。
> aspnet_regiis -pi "CustomKey" "C:\CustomKey.xml"
このように実行することで、CustomKeyが開発マシン上にも作成されます。
・キーに読み取り権限を追加する
開発マシン上で、VS2005の開発用Webサーバを用いてテストしている場合はこの作業は必要ありません。
開発マシンでIISからWebアプリケーションのテストを行っている場合は、ASP.NETの実行ユーザにキーの読み取り権限を与える必要があります。
> aspnet_regiis -pa "CustomKey" "ASPNET"
このように実行すると、Windows XP上のASP.NETの実行ユーザにCustomKeyの読み取り権限が付与されます。
・web.configを修正する
web.configの暗号化にCustomKeyを利用するためには、web.configの中にその設定を記述する必要があります。
以下の記述をweb.configに追加します
<configProtectedData>
<providers>
<add keyContainerName="CustomKey"
useMachineContainer="true"
description="Uses RsaCryptoServiceProvider to encrypt and decrypt"
name="CustomProvider"
type="System.Configuration.RsaProtectedConfigurationProvider,System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</providers>
</configProtectedData>
keyContainerNameには利用するキーの名前を設定します。
また、nameに設定した値を実際の暗号化時に利用します。
web.configはたとえば以下のようになります。
--------------------------------------------------------------------
<?xml version="1.0"?>
<configuration>
<configProtectedData>
<providers>
<add keyContainerName="CustomKey"
useMachineContainer="true"
description="Uses RsaCryptoServiceProvider to encrypt and decrypt"
name="CustomProvider"
type="System.Configuration.RsaProtectedConfigurationProvider,System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</providers>
</configProtectedData>
<connectionStrings>
<remove name="LocalSqlServer" />
<add name="LocalSqlServer" connectionString="server=サーバ名;uid=ユーザID;pwd=パスワード;Trusted_Connection=no;database=データベース名"
providerName="System.Data.SqlClient" />
</connectionStrings>
</configuration>
--------------------------------------------------------------------
・web.configを暗号化する
> aspnet_regiis -pdf "connectionStrings" c:\ -prov "CustomProvider"
このように、web.confg内に設定したプロバイダのnameを用いて暗号化を行います。
web.configは以下のようになります。
--------------------------------------------------------------------
<?xml version="1.0"?>
<configuration>
<configProtectedData>
<providers>
<add keyContainerName="CustomKey"
useMachineContainer="true"
description="Uses RsaCryptoServiceProvider to encrypt and decrypt"
name="CustomProvider"
type="System.Configuration.RsaProtectedConfigurationProvider,System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</providers>
</configProtectedData>
<connectionStrings configProtectionProvider="CustomProvider">
<EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element"
xmlns="http://www.w3.org/2001/04/xmlenc#">
<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">
<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<KeyName>Rsa Key</KeyName>
</KeyInfo>
<CipherData>
<CipherValue>OJ5n7dHLLxwIQHGwaSMSgZhlXO4tlCkBZ8nEQ78zGlwqSylVKmGTK/BLf3MqGAt1Oigmq/Q18fX0Ux2458uhUA8N4e4hPQGr51fSf0bvLzA7GF01u7xYhy+2jngz9lOORMzPx0zw+RzIg0e+4AoMGz27RJP9r/mW2RHmXXqor4I=</CipherValue>
</CipherData>
</EncryptedKey>
</KeyInfo>
<CipherData>
<CipherValue>Z+enXyXAOustA2SVWJaE36Ye16muFVv68hAsQHP1Rp+D7CVc56r1GzoLWX1ITUj0ZBVb+TXnxVpy50qHf62JaqZFfaKv6HIDv9NOTrsVegXfO3MSV9zlbFaO6SqKUlUFChs4icfxPiM1oAn2rJ4C8nhiu34TFgdE3FqiTJhTQm28YqTTv3Ax6zak8QxtkBl82n+GT4KXI568OZwHZsekTMsUZYuEgk1KEORI2AehWnmqyLrmssjwXRvcnXQFsE4v8tNg+hiiTeeI0hOxkZRuO/qXx7rBUIr/6ykW/sunIcdWZ5QoagRTU/REy0uPuLqtc2spaBUcgVgZ90bPawfBCqN2haFGlV+/OsBjyXXiWjfTw6a0M/jyeovv72ZsSy9p</CipherValue>
</CipherData>
</EncryptedData>
</connectionStrings>
</configuration>
--------------------------------------------------------------------
このようにして作成したweb.confgはそのまま運用サーバ上に配置して利用することができます。
参考:
保護された構成を使用した構成情報の暗号化
http://msdn2.microsoft.com/ja-jp/library/53tyfkaw.aspx
How To: Encrypt Configuration Sections in ASP.NET 2.0 Using RSA
http://channel9.msdn.com/wiki/default.aspx/Channel9.HowToEncryptConfigurationSectionsUsingRsaInAspNet20
◆ この記事についてのご意見、ご質問は以下のフォーラムにお願いします ◆
http://dotnetfan.org/forums/603/ShowPost.aspx