日々様々なトラブルにハマっている、困ったシステム管理者の奮闘日記です。

ASP.NETでのデータベース接続文字列の記述場所

最近、仕事関連でASP.NET2.0をいぢってます。

システム管理者の目でいぢってて気がついたのですが、
ASP.NET2.0からデータベースの接続文字列を、Web.configの「connectionStrings」セクションに記述できるようになっているのですね。
で、MS SQL ServerなんかでWindows認証する場合以外は、接続文字列中にデータベースへの接続時のユーザ名とパスワードをweb.configファイル中に記述してしまうことになります。
具体例はこんな感じ。

<configuration>
:
<connectionStrings>
 <add name="xxsystem"
      providerName="system.data.mysqlclients"
      connectionString="Database=xxsystem;Data Source=DBサーバ; User Id=ユーザ名;Password=パスワード"
 />
</connectionStrings>

ところが、このweb.configファイルはデフォルト平文なので、Webサーバのコンソールを扱う権限のある人であれば簡単にweb.configの設定情報を参照してデータベースの接続ユーザ名とパスワードを知ることができてしまいます。
これはセキュリティ上問題です。

この問題の回避策として、Microsoftから「aspnet_regiis」というツールが提供されているので、これを使ってweb.configの重要な部分を暗号化できるそうです。
参照元:知識.com様
http://www.e-chishiki.com/jpn/articles/information_security/application_security/cryptography/encrypting_web_config

しかし、ここで問題点。

例えば、テスト環境のデータベースに接続して一時的にテストしたい場合、

  1. 本番環境のweb.configをバックアップ
  2. 一旦web.configの暗号化を解除
  3. connectionStringsのDatabase、またはData Sourceの部分をテスト環境に書き換え
  4. 再度web.configの暗号化
  5. テストが終了したらバックアップしておいたweb.configに置き換え

という流れになり、非常にめんどくさいことになります。
また、web.configの管理をしっかりしていないと、どれがテスト環境用でどれが本番環境用だったかわからなくなる、といった情けない事態にならないとは限りません。

そこで、やってみたのが以下の手段。

  1. データベース接続用のvbモジュールファイルを作成(ASP.NETの言語にVisual Basicを使用する場合)。
  2. vbモジュールに、Public Const でユーザ名とパスワードを定数で記述。
  3. web.configのconnectionStringsのユーザ名とパスワードに該当する部分をダミーで記述。
  4. vbモジュールにweb.configからconnectionStringsを取得した後、ダミーのユーザ名とパスワードを2.で定義したユーザ名とパスワードにreplaceする関数を記述。
  5. データベースに接続する際には、4.の関数を呼び出すようにする。

この方法だと、web.configを暗号化する必要がないので、テスト環境に切り替え時もweb.configを直接書き換えることで対処できる。
ただし、本番環境とテスト環境のデータベース接続ユーザ名とパスワードは同一にしておかないといけないけど。

参考までに上記のモジュール例を。

web.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
:
<connectionStrings>
 <add name="xxsystem"
      providerName="system.data.mysqlclients"
      connectionString="Database=xxsystem;Data Source=localhost; User Id=username;Password=passwd"
 />
</connectionStrings>

mDbConnect.vb

Module mDbConnect
  Public Const DB_USERNAME = "USER01"
  Public Const DB_PASSWORD = "Pass01"
  :
  Public Function fncGetDbConnectionString() As String

    Dim strConnString = ConfigurationManager.ConnectionStrings("helpdesk").ConnectionString

    strConnString = Replace(strConnString, "username", DB_USERNAME)
    strConnString = Replace(strConnString, "passwd", DB_PASSWORD)

    Return strConnString

  End Function

データベース接続記述部分(MySQL使用)

Imports MySql.Data.MySqlClient
 :
 Dim objConn As MySqlConnection
 :
 ' データベース接続
 objConn = New MySqlConnection(fncGetDbConnectionString)
 :

関数じゃなくってクラスにしようかとも思ったのだが、ま、いいか。
あ、当然vbモジュールは本番環境のWebサーバに置いちゃだめよ。


You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

AddThis Social Bookmark Button

Leave a Reply