次の方法で共有


ASP.NET Web アプリケーションのセキュリティに関する基本的な対策

アプリケーションのセキュリティに関する経験や知識があまりない場合でも、Web アプリケーションの保護を強化するために基本的な対策は実施する必要があります。すべての Web アプリケーションに当てはまる、セキュリティに関する最小限のガイドラインをこのトピックの以下のセクションに示します。安全なコードの記述とアプリケーションのセキュリティ保護のためのベスト プラクティスの詳細については、Michael Howard と David LeBlanc 共著『Writing Secure Code』、および「Microsoft Patterns and Practices」のガイダンスを参照してください。

  • Web アプリケーションのセキュリティに関する一般的推奨事項

  • アプリケーションを最小限の権限で実行する

  • ユーザーを知る

  • 悪意のあるユーザー入力に対して防御する

  • データベースに安全にアクセスする

  • 安全なエラー メッセージを作成する

  • 機密情報の保護

  • Cookie を安全に使用する

  • サービス拒否の脅威を防御する

Web アプリケーションのセキュリティに関する一般的推奨事項

悪意のあるユーザーがコンピュータに簡単にアクセスする方法があれば、周到に用意されたアプリケーションのセキュリティでさえも突破されます。Web アプリケーションのセキュリティに関する一般的推奨事項は、次のとおりです。

  • データのバックアップを頻繁に行い、バックアップを物理的に安全な場所に保管してください。

  • 承認されていないユーザーが Web サーバーにアクセスしたり、電源を切ったり、持ち出したりすることを防ぐために、Web サーバーを安全な場所に設置してください。

  • FAT32 ではなく Windows NTFS ファイル システムを使用してください。NTFS では本質的に FAT32 よりも高度なセキュリティが確保されます。詳細については、Windows ヘルプ ドキュメントを参照してください。

  • Web サーバー コンピュータおよび同じネットワーク上にあるすべてのコンピュータを厳密なパスワードで保護してください。

  • インターネット インフォメーション サービス (IIS: Internet Information Services) を保護するために推奨される手順を実行してください。詳細については、「Windows Server TechCenter for IIS」を参照してください。

  • 使用していないポートを閉じ、使用していないサービスをオフにしてください。

  • サイトのトラフィックを監視するウイルス チェッカーを実行してください。

  • ファイアウォールを使用してください。推奨事項については、Microsoft のセキュリティ Web サイトの「Microsoft Firewall Guidelines」を参照してください。

  • 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 フォーム認証の概要」を参照してください。

悪意のあるユーザー入力に対して防御する

原則として、ユーザーからの入力が安全であるとは想定しないでください。悪意のあるユーザーにとっては、クライアントからアプリケーションに危険性を含んだ情報を送信するのは簡単なことです。悪意のある入力に対して防御を強化するには、次のガイドラインに従ってください。

  • フォームでユーザー入力にフィルタをかけて、スクリプトが含まれている HTML タグの有無をチェックしてください。詳細については、「方法 : HTML エンコーディングを文字列に適用して Web アプリケーションをスクリプトによる攻略から保護する」を参照してください。

  • フィルタ処理されていないユーザー入力をエコー (表示) しないでください。信頼できない情報を表示する前に、HTML をエンコードして危険性を含むスクリプトを表示文字列に変換します。

  • 同様に、フィルタ処理されていないユーザー入力をデータベースに格納しないでください。

  • ユーザーからの HTML を受け入れる場合は、手動でフィルタ処理をしてください。フィルタには、受け入れる HTML を明示的に定義します。悪意のある入力をすべて想定することは非常に困難なので、悪意のある入力だけを除去しようとするフィルタを作成しないでください。

  • ヘッダーから (通常は Request オブジェクト経由で) 受け取る情報が安全であると想定しないでください。クエリ文字列 や Cookie 等に対して保護手段を用意します。ブラウザからサーバーにアプリケーションにとって重要な情報を (ユーザー エージェント情報) 送信する場合は、その情報は偽装される可能性があることに注意してください。

  • ブラウザからアクセスできる場所にはできるだけ重要な情報 (隠しフィールドや Cookie) を格納しないでください。たとえば、パスワードは Cookie に格納しないでください。

    メモ :

    ビューステートは、エンコードされて隠しフィールドに格納されます。既定では、ビューステートが改変されていないかどうかをページが判定できるように MAC (Message Authentication Code) が隠しフィールドに含まれます。

データベースに安全にアクセスする

一般に、データベースには独自のセキュリティ機能が用意されています。Web アプリケーションのセキュリティにとって重要な側面は、アプリケーションがデータベースに安全にアクセスする方法をデザインすることです。次のガイドラインに従ってください。

  • データベースに固有のセキュリティ機能を使用して、データベースのリソースにアクセスできるユーザーを制限してください。追加のセキュリティ対策は、データベースおよびアプリケーションに依存します。

    • アプリケーションで実用的な場合は、Windows 統合セキュリティを使用して、Windows で認証されたユーザーだけがデータベースにアクセスできるようにします。統合セキュリティは、SQL Server の標準セキュリティを使用するよりも安全です。

    • アプリケーションで匿名アクセスを許可する場合は、アクセス許可を制限したユーザーを 1 つ作成し、このユーザーとして接続してクエリを実行します。

  • ユーザー入力を伴う文字列を連結した SQL ステートメントを作成しないでください。その代わりにパラメータ付きのクエリを作成し、ユーザー入力を使用してパラメータ値を設定します。

  • データベースのログイン資格情報としてユーザー名およびパスワードをどこかに格納する必要がある場合は、安全な方法で格納してください。実際的な方法としては、情報を暗号化またはハッシュします。詳細については、「データの暗号化と復号化」を参照してください。

データへの安全なアクセスの詳細については、「ADO.NET アプリケーションのセキュリティ保護」を参照してください。

安全なエラー メッセージを作成する

常に注意を払わないと、悪意のあるユーザーは表示されるエラー メッセージからアプリケーションに関する重要な情報を推測してしまいます。次のガイドラインに従ってください。

  • 悪意のあるユーザーにとって有益になる情報 (たとえばユーザー名) をエコーするエラー メッセージを書かないでください。

  • 詳細なエラーをユーザーに表示しないようにアプリケーションを設定してください。デバッグ用に詳細なエラー メッセージを表示する場合は、ユーザーが Web サーバーに対してローカルであることを最初に確認します。詳細については、「方法 : 安全なエラー メッセージを表示する」を参照してください。

  • サーバーからの例外を表示できるユーザーを制御するには、customErrors 構成要素を使用します。

  • データベース アクセスなどのエラーが発生しやすい状況に対して、カスタム エラー処理を作成してください。

機密情報の保護

機密情報とは、非公開にする必要がある情報を表します。代表的な機密情報には、パスワードや暗号キーがあります。悪意のあるユーザーが機密情報を入手できる場合は、機密情報として保護されているデータが危殆化されます。次のガイドラインに従ってください。

  • アプリケーションがブラウザとサーバーとの間で重要な情報を転送する場合は、SSL (Secure Sockets Layer) の使用を検討してください。SSL を使用してサイトを暗号化する方法については、Microsoft サポート技術情報の文書 Q307267「How to: Secure XML Web Services with Secure Sockets Layer in Windows 2000」を参照してください。

  • 保護された構成を使用して、Web.config ファイルや Machine.config ファイルなどの構成ファイルの機密情報を保護します。詳細については、「保護された構成を使用した構成情報の暗号化」を参照してください。

  • 機密情報をどこかに格納する必要がある場合は、第三者が表示できないと思われる形式 (たとえばサーバー コード) であっても Web ページ内には格納しないでください。

  • System.Security.Cryptography 名前空間で提供される厳密な暗号化アルゴリズムを使用します。

Cookie を使用すると、ユーザー固有の情報を手軽に利用できます。しかし、Cookie はブラウザのコンピュータに送信されるため、なりすましやその他の悪意のある使用に対して無防備です。次のガイドラインに従ってください。

  • 重要な情報は Cookie に格納しないでください。たとえば、ユーザーのパスワードは一時的にであっても Cookie に格納しないでください。原則として、Cookie には機密情報を格納しないでください。代わりに、情報が格納されているサーバー上の場所への参照を Cookie に格納します。

  • Cookie の有効期限はできるだけ短く設定してください。できれば永続的な Cookie は使用しないでください。

  • Cookie 内の情報を暗号化することを検討してください。

  • Cookie の Secure プロパティと HttpOnly プロパティを true に設定することをお勧めします。

サービス拒否の脅威を防御する

悪意のあるユーザーがアプリケーションを危殆化させる間接的な方法の 1 つに、アプリケーションを利用不可能にする方法があります。悪意のあるユーザーは、アプリケーションに大きな負荷をかけることによって、他のユーザーにサービスを提供できないようにしたり、アプリケーションをクラッシュさせたりすることがあります。次のガイドラインに従ってください。

  • 使用するすべてのリソースを閉じるかまたは解除してください。たとえば、データ接続とデータ リーダーを常に閉じるようにしたり、ファイルを使用した後は必ずファイルを閉じるようにします。

  • エラー処理 (try/catch ブロックなど) を使用してください。finally ブロックを使用して、障害時にリソースを解放するようにします。

  • スロットリングを使用するように IIS を設定して、アプリケーションが不相応な量の CPU を使用することを防止してください。

  • ユーザー入力を使用したり格納したりする前にそのサイズ制限をテストしてください。

  • データベース クエリにサイズ保護を設定し、大規模なクエリがシステム リソースをすべて消費することを防止してください。

  • アプリケーションにファイルのアップロード機能が含まれている場合は、ファイルのアップロードに関してサイズ上の制限を設定してください。Web.config ファイルで次のコード例のような構文を使用すると、制限を設定できます (ここで、maxRequestLength 値は KB 単位で指定します)。

    <configuration>
        <system.web>
            <httpRuntime maxRequestLength="4096" />
        </system.web>
    </configuration>
    

RequestLengthDiskThreshold プロパティを使用して、大規模なアップロードとフォーム ポストのメモリ オーバーヘッドを減らすこともできます。

参照

概念

Web アプリケーションのセキュリティ上の脅威の概要

ASP.NET Web アプリケーションのセキュリティ

セキュリティ参考文献