web-dev-qa-db-ja.com

複雑な構成でIISアプリケーションを保護する

私は少しピクルスになっています。

(別のマシン上の)SQLデータベースにアクセスするIISアプリケーションがあります。これはすでに次のことを意味します:

a)IISアプリケーションには、パスワードを含むデータベースへの接続文字列が必要です
b)IISアプリケーションは、SQLデータベースにアクセスできるADIDを使用して実行する必要があります

オプションb)はより安全なようです。

ただし、2番目の要件があります:
前述のデータベースには、AES暗号化された機密情報が含まれています。 IISアプリケーションはAESキーをローカルに保存し、DPAPIを使用して暗号化します(プレーンテキストでの保存を避けるため)。ただし、DPAPIには小さな問題があります。

1)ApplicationPoolIdentityロールを使用してIISアプリケーションを実行させると、DPAPIは正常に機能します
2)IISアプリケーションを特定のADユーザーとして実行させると、IISRESET後にDPAPIがデータの復号化に失敗します

ご覧のとおり、b)は1)と競合し、a)は2)と競合します。

この問題にどのように取り組むべきですか?

1
Shaamaan

DPAPIは、実際には2つの非常に単純な関数呼び出し( CryptProtectData および CryptUnprotectData )を介して機能します。

簡単に言うと、CryptProtectDataにはユーザーまたはシステムの2つの操作モードがあります。ユーザーモード(デフォルト)を使用する場合、データは現在のユーザーログオンデータを使用して暗号化されます。つまり、CryptProtectDataを呼び出したのと同じユーザーコンテキストから、同じデータに対してのみCryptUnprotectDataを正常に呼び出すことができます。 (「システム」モードでは、同じマシンで実行されているプロセスはデータを復号化できますが、別のシステムからは復号化できません。データがデータベースにある場合はあまり良くありません)。

つまり、特定のADユーザーアカウントを使用してSQLサーバーデータベース内のデータを最初に暗号化した場合、このユーザーを使用してデータにアクセスすることに永続的に制限されます。 (これは、アプリケーションによっては欠陥または機能と見なされる場合があります)。

それはあなたにとってどういう意味ですか?アプリケーションの動作方法を変更できるか、暗号化されたデータを完全にリセットする意思がない限り、Webアプリケーションプロセスで使用されるIDを変更することはできません。

ただし、これは安全である必要はありません。WebアプリケーションがASP.NETアプリであり、web.configファイルに格納されている接続文字列を標準的な方法で使用している場合は、 DAPIも同様ですが、今回はシステムへのデリゲートを使用します。 Microsoftには その方法についてかなり長い説明があります

最後に、この種の問題を解決する通常の方法が常にあります。アプリケーション開発者に連絡してください。サポートされているものとその方法を正確に伝えることができます。必要に応じて、設定したセキュリティ目標を達成するためにシステムに必要な変更を加えることもできます。

編集:あなたの場合に考慮しなければならない追加の要素があります:DAPIを使用する場合、暗号化に使用されるマスターキーは ユーザープロファイルに保存

つまり、仮想ユーザーアカウント(AppPoolidentityでWebアプリを実行するときに作成されたアカウント)を使用している場合、実際のプロファイルが作成されていないため、DAPIは実際には永続化または再読み込みされません。説明した問題が発生します。IISresetにより、アプリケーションは永続化できないため、マスター暗号化キーが失われます。

これを解決するには、WebアプリケーションプールのNetworkServiceIDに切り替えるように切り替えることができます。仮想アカウントによって提供されるユーザーの分離は失われますが、それを超えると、同じように機能するはずです。 Microsoft これも提案します Webアプリケーションプールの「LoadUserProfile」プロパティを確認しますが、それを変更することで問題が自然に解決するかどうかは疑わしいです。試してみてください。 NetworkServiceも使用します。

1
Stephane