Web アプリケーションのセキュリティに関する基本的な対策
更新 : 2007 年 11 月
安全な Web アプリケーションを作成することは、非常に大きな課題です。安全な Web アプリケーションを作成するためには、セキュリティの脆弱性を理解する必要があります。さらに、Windows、.NET Framework、および ASP.NET の各セキュリティ機能を理解しておく必要があります。そして最後に、これらのセキュリティ機能を使用して各種の脅威に対抗するための方法を理解することが必要です。
セキュリティについて十分な経験がなくても、Web アプリケーションを保護するためのいくつかの基本的な対策を行うことが必要です。すべての Web アプリケーションに適用される最小限のセキュリティ ガイドラインを次に示します。このガイドラインに従ってください。
Web アプリケーションのセキュリティに関する一般的推奨事項
アプリケーションを最小限の権限で実行する
ユーザーを知る
悪意のあるユーザー入力に対して防御する
データベースに安全にアクセスする
安全なエラー メッセージを作成する
機密情報を安全に保持する
Cookie を安全に使用する
サービス不能の脅威を防御する
メモ : より安全な ASP.NET Web アプリケーションのデザイン、開発、構成、および配布に役立つ、包括的で詳細なセキュリティ ガイダンスについては、Microsoft Patterns and Practices Web サイトで提供されているセキュリティ モジュールを参照してください。
Web アプリケーションのセキュリティに関する一般的推奨事項
悪意のあるユーザーがコンピュータに簡単にアクセスする方法があれば、周到に用意されたアプリケーションのセキュリティでさえも突破されます。次のガイドラインに従ってください。
バックアップを頻繁に行い、バックアップを物理的に安全な場所に保管してください。
承認されていないユーザーが Web サーバー コンピュータに触れたり、電源を切ったり、持ち出したりすることを防ぐために安全な場所に設置してください。
FAT32 ではなく Windows NTFS ファイル システムを使用してください。NTFS では本質的に FAT32 よりも高度なセキュリティが確保されます。詳細については、Windows のドキュメントを参照してください。
Web サーバー コンピュータおよび同じネットワーク上にあるすべてのコンピュータを厳密なパスワードで保護してください。
IIS を保護してください。詳細については、Microsoft TechNet Security Center Web サイトを参照してください。
使用していないポートを閉じ、使用していないサービスをオフにしてください。
着信トラフィックと発信トラフィックを監視するウイルス チェッカーを実行してください。
人目につきやすい場所にユーザーがパスワードを書き留めておくことを禁止するポリシーの確立を行ってください。
ファイアウォールを使用してください。推奨事項については、Microsoft のセキュリティ サイトの Microsoft Firewall Guidelines を参照してください。
Microsoft およびその他の販売元から提供される最新のセキュリティ パッチをインストールしてください。たとえば、Microsoft TechNet Security Center Web サイトには全 Microsoft 製品についての最新セキュリティ情報が掲載されています。他の販売元も同様のサイトを用意しています。
Windows イベントログ機能を使用し、ログを頻繁にチェックして怪しい動作の有無を確認してください。これは、システムに繰り返しログオンしようとする試みや Web サーバーに集中している要求を含みます。
アプリケーションを最小限の権限で実行する
アプリケーションを実行すると、アプリケーションはローカル コンピュータ (およびリモート コンピュータ) 上で特定の権限を持つコンテキスト内で動作します。アプリケーション ID の設定の詳細については、「ASP.NET プロセス ID の構成」を参照してください。最低限の特権で実行する場合には、次のガイドラインに従います。
システム ユーザー (administrator) の ID を使用してアプリケーションを実行しないでください。
最小限の実用的な権限を持つユーザーのコンテキスト内でアプリケーションを実行してください。
アプリケーションに必要なすべてのリソースに対してアクセス許可 ACL (Access Control List) を設定してください。最小限の設定を使用します。たとえば、アプリケーションで実用的であれば、ファイルを読み取り専用に設定します。ASP.NET アプリケーションの ID に必要な最小限の ACL アクセス許可の一覧については、「ASP.NET の必須アクセス制御リスト (ACL)」を参照してください。
Web アプリケーションのファイルを、アプリケーション ルートの下に格納してください。アプリケーション内のファイルにアクセスするためのパスを指定するオプションを、ユーザーに与えないでください。これにより、ユーザーはサーバーのルートにアクセスできなくなります。
ユーザーを知る
多くのアプリケーションでは、ユーザーはサイトに匿名でアクセスします (資格情報を指定する必要がありません)。この場合、アプリケーションは、あらかじめ定義されているユーザーのコンテキスト内で動作することによって、リソースにアクセスします。既定では、このコンテキストとして、ローカル ASPNET ユーザー (Windows 2000 または Windows XP) か、または Web サーバー コンピュータ上の NETWORK SERVICE ユーザー (Windows Server 2003) が使用されます。認証されているユーザーへのアクセスを制限するには、次のガイドラインに従ってください。
アプリケーションがイントラネット アプリケーションの場合は、Windows 統合セキュリティを使用するように設定します。その結果、ユーザーのログオン資格情報を使用してリソースにアクセスできます。詳細については、「ASP.NET の偽装」を参照してください。
ユーザーから資格情報を収集する必要がある場合は、いずれかの ASP.NET 認証方法を使用します。例については、「メンバシップを使用したユーザーの管理」を参照してください。
悪意のあるユーザー入力に対して防御する
原則として、ユーザーからの入力が安全であるとは想定しないでください。悪意のあるユーザーにとっては、クライアントからアプリケーションに危険性を含んだ情報を送信するのは簡単なことです。悪意のある入力に対して防御するには、次のガイドラインに従ってください。
ASP.NET Web ページでユーザー入力にフィルタをかけて、スクリプトが含まれている HTML タグの有無をチェックしてください。詳細については、「方法 : HTML エンコーディングを文字列に適用して Web アプリケーションをスクリプトによる攻略から保護する」を参照してください。
フィルタ処理されていないユーザー入力をエコー (表示) しないでください。信頼できない情報を表示する前に、HTML をエンコードして危険性を含むスクリプトを表示文字列に変換します。
フィルタ処理されていないユーザー入力をデータベースに格納しないでください。
ユーザーからの HTML を受け入れる場合は、手動でフィルタ処理をしてください。フィルタには、受け入れる HTML を明示的に定義します。悪意のある入力をすべて想定することは非常に困難なので、悪意のある入力だけを除去しようとするフィルタを作成しないでください。
HttpRequest オブジェクト内の HTTP 要求ヘッダーから受け取る情報が安全であると想定しないでください。クエリ文字列 や Cookie 等に対して保護手段を用意します。ブラウザからサーバーにアプリケーションにとって重要な情報を (ユーザー エージェント情報) 送信する場合は、その情報は偽装される可能性があることに注意してください。
ブラウザからアクセスできる場所にはできるだけ重要な情報 (隠しフィールドや Cookie) を格納しないでください。たとえば、パスワードは Cookie に格納しないでください。
メモ : ビューステートは、エンコードされて隠しフィールドに格納されます。既定では、ビューステートが改変されていないかどうかをページが判定できるように MAC (Message Authentication Code) が隠しフィールドに含まれます。ビューステートに機密情報が格納される場合、ページの ViewStateEncryptionMode プロパティを true.に設定することにより、暗号化してください。
データベースに安全にアクセスする
一般に、データベースには独自のセキュリティ機能が用意されています。安全な Web アプリケーションにとって重要な側面は、アプリケーションがデータベースに安全にアクセスする方法をデザインすることです。次のガイドラインに従ってください。
データベースに固有のセキュリティ機能を使用して、データベースのリソースにアクセスできるユーザーを制限してください。追加のセキュリティ対策は、データベースおよびアプリケーションに依存します。
アプリケーションで実用的な場合は、統合セキュリティを使用して、Windows で認証されたユーザーだけがデータベースにアクセスできるようにします。統合セキュリティは、明示的な資格情報をデータベースに渡すよりも安全です。
アプリケーションで匿名アクセスを許可する場合は、アクセス許可を制限したユーザーを 1 つ作成し、このユーザーとして接続してクエリを実行します。
ユーザー入力を伴う文字列を連結した SQL ステートメントを作成しないでください。その代わりにパラメータ付きのクエリを作成し、ユーザー入力を使用してパラメータ値を設定します。
データベース ログイン資格情報として使用するためにユーザー名とパスワードをどこかに格納しておく必要がある場合には、Web.config ファイルに格納し、保護された構成を使用して、このファイルをセキュリティで保護します。詳細については、「保護された構成を使用した構成情報の暗号化」を参照してください。
データへの安全なアクセスの詳細については、「データ アクセスのセキュリティ保護」と「ADO.NET アプリケーションのセキュリティ保護」を参照してください。
安全なエラー メッセージを作成する
常に注意を払わないと、悪意のあるユーザーは表示されるエラー メッセージからアプリケーションに関する重要な情報を推測してしまいます。次のガイドラインに従ってください。
悪意のあるユーザーにとって有益になる情報 (たとえばユーザー名) をエコーするエラー メッセージを書かないでください。
詳細なエラーをユーザーに表示しないようにアプリケーションを設定してください。デバッグ用に詳細なエラー メッセージを表示する場合は、ユーザーが Web サーバーに対してローカルであることを最初に確認します。詳細については、「方法 : 安全なエラー メッセージを表示する」を参照してください。
サーバーからの例外を表示できるユーザーを制御するには、customErrors 構成要素を使用します。
データベース アクセスなどのエラーが発生しやすい状況に対して、カスタム エラー処理を作成してください。詳細については、「ASP.NET のページとアプリケーションにおけるエラー処理」を参照してください。
機密情報の保護
機密情報とは、非公開にする必要がある情報を表します。代表的な機密情報には、パスワードや暗号キーがあります。悪意のあるユーザーが機密情報を入手できる場合は、機密情報として保護されているデータが危殆化されます。次のガイドラインに従ってください。
アプリケーションがブラウザとサーバーとの間で重要な情報を転送する場合は、SSL (Secure Sockets Layer) の使用を検討してください。SSL でサイトをセキュリティ保護する方法については、マイクロソフト サポート技術情報 (https://support.microsoft.com) - JP307267「HOW TO: SSL を使用して XML Web サービスをセキュリティ保護する方法」を参照してください。
保護された構成を使用して、Web.config ファイルや Machine.config ファイルなどの構成ファイルの機密情報を保護します。詳細については、「保護された構成を使用した構成情報の暗号化」を参照してください。
機密情報をどこかに格納する必要がある場合は、第三者が表示できないと思われる形式 (たとえばサーバー コード) であっても Web ページ内には格納しないでください。
System.Security.Cryptography 名前空間で提供される厳密な暗号化アルゴリズムを使用します。
Cookie を安全に使用する
Cookie を使用すると、ユーザー固有の情報を手軽に利用できます。しかし、Cookie はブラウザのコンピュータに送信されるため、なりすましやその他の悪意のある使用に対して無防備です。次のガイドラインに従ってください。
重要な情報は Cookie に格納しないでください。たとえば、ユーザーのパスワードは一時的にであっても Cookie に格納しないでください。基本的に、アプリケーションの安全性を脅かすような情報は Cookie に格納しないでください。代わりに、情報が格納されているサーバー上の場所への参照を Cookie に格納します。
Cookie の有効期限はできるだけ短く設定してください。できれば永続的な Cookie は使用しないでください。
Cookie 内の情報を暗号化することを検討してください。
サービス不能の脅威を防御する
悪意のあるユーザーがアプリケーションを危殆化させる間接的な方法の 1 つに、アプリケーションを利用不可能にする方法があります。悪意のあるユーザーは、アプリケーションに大きな負荷をかけることによって、他のユーザーにサービスを提供できないようにしたり、アプリケーションをクラッシュさせたりすることがあります。次のガイドラインに従ってください。
エラー処理 (たとえば tryブロックと catch ブロック) を使用してください。finally ブロックを使用して、障害時にリソースを解放するようにします。
プロセス スロットリングを使用するように IIS を設定して、アプリケーションが不相応な CPU 時間を使用することを防止してください。
ユーザー入力を使用したり格納したりする前にそのサイズ制限をテストしてください。
データベース クエリに対してサイズ上の安全対策を講じてください。たとえば、クエリ結果を ASP.NET Web ページに表示する前に、レコード数が妥当であることを確認します。
アプリケーションにファイルのアップロード機能が含まれている場合は、ファイルのアップロードに関してサイズ上の制限を設定してください。Web.config ファイルで次の構文を使用すると、制限を設定できます (ここで、maxRequestLength 値はKB 単位で指定します)。
<configuration> <system.web> <httpRuntime maxRequestLength="4096" /> </system.web> </configuration>
RequestLengthDiskThreshold プロパティを使用して、大規模なアップロードとフォーム ポストのメモリ オーバーヘッドを減らすこともできます。