接続情報の保護
アプリケーションのセキュリティを実現するうえで、データ ソースへのアクセスを保護することは、最も重要な目標の 1 つです。 保護されていない接続文字列は脆弱性を招く原因になります。 接続情報をテキスト形式で保存したり、メモリ内に保持したりすると、システム全体のセキュリティが損なわれる可能性があります。 ソース コードに組み込まれた接続文字列は、Ildasm.exe (IL Disassembler) を使って、コンパイル済みアセンブリの共通中間言語 (CIL) を表示することで読み取ることができます。
接続文字列に関係したセキュリティ上の脆弱性は、使用されている認証の種類、メモリやディスクへの接続文字列の保存方法、実行時に接続文字列を作成する際の手法などから発生します。
重要
Microsoft では、使用可能な最も安全な認証フローを使用することをお勧めします。 Azure SQL に接続する場合は、Azure リソースの管理 ID が推奨される認証方法です。
Windows 認証の使用
データ ソースへのアクセスを制限するには、ユーザー ID、パスワード、データ ソース名などの接続情報をセキュリティで保護する必要があります。 ユーザー情報の漏洩を防ぐためにも、オンプレミス データ ソースに対して、Windows 認証 (「統合セキュリティ」とも呼ばれます) を使用することが推奨されます。 (ただし、Azure SQL に接続するときは、Azure リソースのマネージド ID を使用する必要があります。) Windows 認証は、Integrated Security
キーワードまたは Trusted_Connection
キーワードを使用して接続文字列で指定されるため、ユーザー ID とパスワードを使用する必要がなくなります。 Windows 認証を使用した場合、ユーザーは Windows によって認証され、サーバー リソースやデータベース リソースへのアクセスは Windows のユーザーおよびグループに付与された権限によって制御されます。
Windows 認証が使用できない場合、ユーザーの資格情報を接続文字列に含めることになるため、十分な注意が必要です。 ASP.NET アプリケーションでは、Windows アカウントを、データベースやその他のネットワーク リソースに接続する際の固定 ID として構成できます。 web.config ファイルの identity 要素で権限の借用を有効にし、ユーザー名とパスワードを指定します。
<identity impersonate="true"
userName="MyDomain\UserAccount"
password="*****" />
固定 ID アカウントには、権限の低いアカウント、つまり、データベースに対する必要な権限だけが付与されたアカウントを使用してください。 さらに、ユーザー名とパスワードがクリア テキストで表示されないよう、構成ファイルを暗号化する必要があります。
重要
Microsoft では、使用可能な最も安全な認証フローを使用することをお勧めします。 この手順で説明されている認証フローでは、アプリケーションで非常に高い信頼度が要求されるため、他のフローには存在しないリスクが伴います。 このフローは、マネージド ID など、より安全なフローが実行可能ではない場合にのみ使用してください。
UDL (Universal Data Link) ファイルの使用回避
OleDbConnection の接続文字列を UDL (Universal Data Link) ファイルに保存することは避けてください。 UDL はクリア テキストで保存され暗号化できません。 UDL ファイルは、アプリケーションにとって外部ファイルをベースにしたリソースであるため、.NET Framework ではセキュリティ保護も暗号化もされません。
接続文字列ビルダーを使用したインジェクション攻撃の防止
ユーザー入力から文字列を動的に連結することによって接続文字列を構築している場合、接続文字列のインジェクション攻撃を受ける可能性があります。 ユーザー入力の検証や悪意のある文字のエスケープを怠ると、機密データなど、サーバー上のリソースへのアクセスを攻撃者に許してしまうことも考えられます。 こうした問題を解消するために、ADO.NET 2.0 では、接続文字列の構文を検証し、余分なパラメーターの追加を防ぐ新しい接続文字列ビルダー クラスが導入されました。 詳細については、「接続文字列ビルダー」をご覧ください。
Persist Security Info=False
を使用します
Persist Security Info
の既定値は false です。すべての接続文字列には、この既定値を使用することをお勧めします。 Persist Security Info
を true
または yes
に設定すると、ユーザー ID やパスワードなどのセキュリティ関連情報を、接続を開いた後にその接続から取得できます。 Persist Security Info
を false
または no
に設定した場合、その情報を使って接続を開いた後で、セキュリティ情報が破棄されるため、信頼できないソースによってセキュリティ関連情報がアクセスされることを確実に防ぐことができます。
構成ファイルの暗号化
接続文字列は構成ファイルに保存することもでき、そうすることで、アプリケーションのコードに接続文字列を組み込むことを避けられます。 構成ファイルは、.NET Framework が基本的な要素を定義するために使用する標準的な XML ファイルです。 通常、構成ファイル内の接続文字列は、app.config (Windows アプリケーションの場合) または web.config ファイル (ASP.NET アプリケーションの場合) の <connectionStrings> 要素に格納されます。 構成ファイルへの接続文字列の格納、構成ファイルからの接続文字列の取得、および暗号化については、「接続文字列と構成ファイル」を参照してください。