Share via


セキュリティ保護された ASP.NET アプリケーションの構築 : 認証、認定、および通信のセキュリティ保護 1 章 はじめに

patterns and practices home

J.D. Meier, Alex Mackman, Michael Dunner and Srinath Vasireddy
Microsoft Corporation

November 2002
日本語版最終更新日 2003 年 3 月 17 日

適用対象:
    Microsoft® ASP.NET

全体の概要については、「セキュリティ保護された ASP.NET アプリケーションの構築」の開始ページを参照してください。

要約 : この章では、このガイドの対象範囲と構成を定義し、その目的について説明します。また、主要な用語を説明したうえで、後続の章で紹介する内容に適用される主要な原則について説明します。

目次

今日の接続環境
このガイドの範囲
このガイドの目的
このガイドの利用方法
このガイドの構成
主要な用語
原則
まとめ

セキュリティで保護された分散型 Web アプリケーションを作成することは困難な作業です。作成したアプリケーションのセキュリティは、最も脆弱なリンク先のセキュリティと同レベルになってしまうからです。分散アプリケーションにはさまざまな可動部分があり、これらの部分をセキュリティで保護された状態で相互に動作させるには、製品とテクノロジの両方に関する生きた知識が必要になります。

さまざまなテクノロジの統合、最新のシステム状態の維持、競争相手に一歩でも先んじる手段など、管理担当者には考慮しなければならない点が既にたくさんあります。もしまだセキュリティで保護されたアプリケーションを作成する方法を知らないとして、それを学習するために自らの時間と努力を費やすことができるでしょうか。言い換えれば、そのような時間と努力を費やさないままでいられるのでしょうか。

今日の接続環境

セキュリティで保護されたアプリケーションを作成する方法を既に知っているとして、.NET Web アプリケーションを作成する際に今知っていることを適用できるでしょうか。また、今日の Web ベースの分散アプリケーション環境にその知識を活用できるでしょうか。現実の環境では、Web サービスによってビジネスと別のビジネスが、さらにビジネスと顧客がつなぎ合わされ、アプリケーションによってイントラネット、エクストラネット、インターネットなどを利用するユーザーにさまざまな種類のサービスが提供されています。

まず、この現在の接続環境の基本的な特徴を検討してみましょう。

  • Web サービスでは、SOAP、拡張マークアップ言語 (XML)、ハイパーテキスト転送プロトコル (HTTP) などの標準が使用されていますが、基本的にはプレーン テキストを使用して、機密情報を含む可能性のあるデータがやり取りされています。
  • インターネットの企業-消費者間アプリケーションでは、Web を介して機密データがやり取りされています。
  • エクストラネットの企業間取引アプリケーションでは、信頼の境界があいまいになっており、自分の組織のアプリケーションは、パートナー企業の別のアプリケーションから呼び出される可能性があります。
  • イントラネットのアプリケーションも、給与管理や人事管理 (HR) アプリケーションの機密性を考慮すると、常に危険と隣り合わせの状態にあるといえます。このようなアプリケーションは、不正を働く管理者や待遇に不満をいだく従業員がいる企業では、特に攻撃されやすいものとなります。

このガイドの範囲

このガイドでは、以下の内容について詳細に説明します。

  • 認証 (アプリケーションのクライアントを識別)
  • 認定 (これらのクライアントのアクセス制御)
  • セキュリティで保護された通信 (メッセージの機密性を維持し、それらが認証されていない第三者により改変されないことを保証)

なぜ、認証、認定、およびセキュリティで保護された通信が主要な内容になるのでしょうか。

セキュリティの内容は広い範囲に及びます。調査によれば、認証と認定を早い段階で設計に取り入れておくと、アプリケーションの脆弱性の割合を低く抑えられることがわかっています。作成するアプリケーション、および複数のアプリケーションの層でやり取りされる資格情報などの機密データを保護するため、セキュリティで保護された通信は、分散アプリケーションのセキュリティ強化上、非常に重要な要素です。

このガイドの目的

このガイドは、セキュリティの初歩を紹介するものではありません。また、Microsoft .NET フレームワークのセキュリティ リファレンスでもありません。これについては、MSDN ライブラリから入手できる「.NET Framework Software Development Kit (SDK)」を利用してください。詳細については、このガイドの参照のパートを参照してください。このガイドでは、これまでのドキュメントには記載されていない内容を中心に、開発現場、顧客のフィードバック、および Microsoft 製品チームの意見から収集した共通の推奨事項や証明済みの技術へのアプローチ方法を、シナリオ別に紹介します。

このガイドの情報は、以下の内容の理解に役立つよう作成されています。

  • アプリケーションのセキュリティ基準の向上
  • 認証を実行する必要のある場所とその方法の把握
  • 認定を実行する必要のある場所とその方法の把握
  • エンド ユーザーからアプリケーションへの通信と、複数のアプリケーションの層の間の通信で、セキュリティで保護する必要のある場所とその方法の把握
  • 一般的な注意点とその回避方法の把握
  • 認証と認定に関する主な危険とその緩和方法の把握
  • 単に稼働させるためだけのセキュリティ設定の回避
  • さまざまなセキュリティ機能を使用する方法とその時期の把握
  • 心配、不確実性、および疑念の軽減
  • 最良の実践と予測可能な結果の助長

このガイドの利用方法

このガイドは、モジュール形式で作成されています。そのため、必要な章を選択して参照することができます。たとえば、特定のテクノロジにより実現される詳細なセキュリティ機能について知りたい場合は、このガイドのパート III (第 8 章から 12 章) に直接進み、ASP.NET、Enterprise Services、Web サービス、.NET リモート処理、およびデータ アクセスの詳細な内容を参照できます。

ただし、セキュリティ モデルの説明と、利用できる主要なテクノロジおよびセキュリティ サービスの識別に役立つ情報が含まれているため、最初はパート I (第 1 章から 4 章) から読むことをお勧めします。アプリケーション開発者は、必ず第 3 章に目を通してください。この章には、Web アプリケーションの各層に広がる認証と認定の設計に関する重要な知識が含まれます。パート I には、このガイドの残りの部分を十分に理解するために必要となる基礎的な内容が記載されています。

パート II (第 5 章から 7 章) のイントラネット、エクストラネット、およびインターネットに関する章では、特定のアプリケーション シナリオにおけるセキュリティ保護について説明しています。アプリケーションで採用する現在または将来のアーキテクチャと展開パターンを理解している場合は、このパートを読むことで、関連するセキュリティ問題と、特定のシナリオにおけるセキュリティ保護に必要な基本構成手順を把握できます。

最後のパート IV にある追加情報と参考資料は、特定のテクノロジ分野の理解に役立ちます。また、このパートには、可能な限り短い期間で実用的なセキュリティ ソリューションを開発できるよう、作業方法をまとめたドキュメントも含まれています。

このガイドの構成

このガイドは、4 つのパートに分かれています。論理的な区分けを使用することで、より簡単に内容を理解できるようになっています。

パート I : セキュリティ モデル

パート I では、このガイドの残りの部分の基礎となる内容を説明します。パート I で紹介される概念、原則、およびテクノロジを理解することで、後続の章を十分に理解できるようになります。パート I には、以下の章が含まれます。

  • 第 1 章 はじめに
  • 第 2 章 ASP.NET アプリケーションのセキュリティ モデル
  • 第 3 章 認証と認定
  • 第 4 章 セキュリティで保護された通信

パート II : アプリケーション シナリオ

大部分のアプリケーションは、イントラネット、エクストラネット、またはインターネット アプリケーションに分類されます。このパートでは、一般的なアプリケーション シナリオを、このカテゴリごとに 1 つずつ紹介します。各シナリオの主要な特徴を説明したうえで、セキュリティ上の潜在的な脅威を分析します。

次に、各アプリケーション シナリオについて、最適な認証、認定、およびセキュリティで保護された通信を構成し、実装する方法を紹介します。各シナリオには、詳細な分析、認識すべき注意点、およびよくある質問とその回答 (FAQ) についての節も含まれます。パート II には、以下の章が含まれます。

  • 第 5 章 イントラネット セキュリティ
  • 第 6 章 エクストラネット セキュリティ
  • 第 7 章 インターネット セキュリティ

パート III : 各層の保護

このパートでは、セキュリティで保護された .NET 接続型 Web アプリケーションに関連する個々の層およびテクノロジについての詳細情報を紹介します。パート III には、以下の章が含まれます。

  • 第 8 章 ASP.NET セキュリティ
  • 第 9 章 Enterprise Services セキュリティ
  • 第 10 章 Web サービス セキュリティ
  • 第 11 章 .NET リモート処理のセキュリティ
  • 第 12 章 データ アクセス セキュリティ

各章では、特定のテクノロジに適用されるセキュリティ アーキテクチャを簡単に説明します。各テクノロジにおける認証および認定の戦略を、構成可能なセキュリティ オプション、プログラムによるセキュリティ オプション、特定の戦略を採用する時期を決める際に実行すべき推奨事項と共に解説します。

また、各テクノロジにとって最適な認証、認定、およびセキュリティで保護された通信のオプションを選択、実装できるように、その手順と洞察を含めています。さらに、特定のテクノロジに固有の追加情報も含まれます。各章の最後には、推奨事項の要約が記載されています。

パート IV : 参照

このパートでは、ここまでに説明された技術、戦略、およびセキュリティ ソリューションについて理解を深めるための追加情報を紹介します。詳細な作業方法が手順を追って解説されているため、特定のセキュリティ ソリューションを実装することができます。このパートには、以下の内容が含まれます。

  • 第 13 章 セキュリティのトラブルシューティング
  • 作業の手引き
  • ベース構成
  • 構成ストアとツール
  • 参照リンク集
  • 動作のしくみ
  • ASP.NET の ID マトリックス
  • キーと証明書
  • .NET Web アプリケーションのセキュリティ
  • 用語集

主要な用語

ここでは、ガイド全体で使用される主要なセキュリティ用語のいくつかを説明します。完全な用語集は、このガイドの参照のパートにありますが、以下の用語の意味をよく理解しておいてください。

  • 認証 アプリケーションのクライアントを明確に識別すること。クライアントには、エンドユーザー、サービス、プロセス、またはコンピュータが含まれます。
  • 認定 アプリケーション内で参照と実行が許可される認証済みクライアントを定義すること。
  • セキュリティで保護された通信 メッセージの機密性を維持すると同時に、それらがネットワークでの移動中に改変されないことを保証すること。
  • 偽装 クライアントの代わりにリソースにアクセスするため、サーバー アプリケーションが使用する技術。クライアントのセキュリティ コンテキストは、サーバーが実行するアクセス検証で使用されます。
  • 委任 クライアントの代わりに作業を実行するサーバー プロセスが、リモート コンピュータ上のリソースにアクセスできるようにするための偽装の拡張形式。この機能は、Microsoft? Windows? 2000 以上のオペレーティング システムの Kerberos によりネイティブな形で提供されます。NTLM により提供されるような従来の偽装は、単一のネットワーク ホップにのみ対応します。NTLM 偽装が使用される場合、クライアント コンピュータとサーバー コンピュータ間で使用されるホップは 1 つであるため、偽装中のサーバーのアクセスは、ローカル リソースのみに制限されます。
  • セキュリティ コンテキスト プロセスまたはスレッドによるセキュリティ関連の動作に影響するセキュリティ設定のコレクションを示す包括的な用語。プロセスのセキュリティ コンテキストは、プロセスのログオン セッションおよびアクセス トークンの複数の属性が組み合わされることで構成されます。
  • ID 一意に身元を識別できるユーザーまたはサービスの特徴。一般的には、管理者名/ユーザー名の形式による表示名として示されます。

原則

後続の章で紹介する内容に適用される主要な原則がいくつかあります。これらの原則の要約は、以下のとおりです。

  • 最低限の特権の原則を適用すること スクリプトや実行コードを稼働させるプロセスは、最低限の特権を持つアカウントで実行し、第三者がこのプロセスに侵入した場合の被害を小さく抑えます。悪意のあるユーザーがサーバー プロセスにコードを注入したとき、そのプロセスに付与されている特権によってユーザーが実行できる操作の種類は大きく変化します。追加の信頼およびより高度な特権を必要とするコードは、別のプロセス内に分離してください。 ASP.NET 開発チームは、ASPNET アカウントの使用により ASP.NET アカウントを最低限の特権で実行することを決定しました。.NET フレームワークのベータ リリースでは、ASP.NET は本質的にセキュリティ保護性の低い設定である SYSTEM として稼働していました。
  • 重層的セキュリティを使用すること 各層にチェック ポイントを、アプリケーションにサブシステムを設けてください。チェック ポイントとは、次の下位ストリーム層にアクセスできるユーザーが認証および認定されたユーザーであることを保証するゲートキーパーです。
  • ユーザーによる入力を信頼しないこと アプリケーションにユーザーの入力を基に行う操作をさせる場合は、それらの入力は事前に十分に検証されている必要があります。この検証には、特殊文字の検出も含まれます。この予防措置により、偶発的な誤用や、システムに悪意あるコマンドを注入しようとする人物による意図的な攻撃からアプリケーションを保護できます。よくある攻撃には、SQL コード注入、スクリプト注入、およびバッファ オーバーフローがあります。
  • 安全な既定を使用すること 開発者の間で一般的に行われていることとして、アプリケーションを簡単に稼働させるためセキュリティ設定を低くするというものがあります。アプリケーションの機能的な要求により、既定のセキュリティ設定を低くしたり、変更したりする必要がある場合は、変更を行う前にその影響をテストし、その重要性を把握するようにしてください。
  • 不明瞭なセキュリティに依存しないこと 機密情報を保護するために、紛らわしい変数名を使用したり、ファイルを不自然な場所に格納しても、セキュリティは確保されません。データを保護するには、プラットフォームの機能または実証済みの技術を使用する方が有効です。
  • ゲートでチェックを行うこと ユーザーのセキュリティ コンテキストは、認定のために必ずしもバックエンドまでフローさせる必要はありません。これは、分散システムにおいては一般的にあまり良い方法ではありません。ゲートでクライアントを検証するとは、つまり、認証の最初のポイント (たとえば、Web サーバー上の Web アプリケーション内) でユーザーを認定し、そのユーザーにアクセスを許可するリソースと操作 (通常、下位ストリームのサービスにより提供される) の種類を決定するということです。堅牢な認証および認定の戦略をゲートに適用しておけば、最初の呼び出し元のセキュリティ コンテキストをアプリケーションのデータ層全体に伝達する必要はありません。
  • 外部システムはセキュリティで保護されていないと仮定すること 自社所有のシステムでない限り、セキュリティが確保されていると考えないでください。
  • 外部との接触範囲を狭くすること 不必要な情報を外部に公開することは避けてください。不必要な情報の公開は、さらなる脆弱性を生み出すドアを自ら開けることになります。また、エラーは慎重に処理し、エンド ユーザーに返すエラー メッセージでは必要以上の情報を公開しないようにしてください。
  • 障害発生後もセキュリティ保護状態を確保すること アプリケーションに障害が発生した場合でも、機密データが未保護状態にならないようにしてください。また、エラー メッセージに必要以上に詳細な情報、つまり、攻撃者がアプリケーション内の脆弱性を見つけ出すことができるような内容を含めないようにしてください。詳細なエラー情報は、Windows のイベント ログに書き込むようにします。
  • 最も脆弱なリンク先と同じ程度のセキュリティであることを認識すること セキュリティは、アプリケーションの各層すべてに関連する問題です。
  • 使用しないのであれば、無効にすること アプリケーションが必要としないモジュールおよびコンポーネントを無効化することにより、潜在的な攻撃ポイントを取り除くことができます。たとえば、アプリケーションで出力キャッシュの機能を使用しない場合は、ASP.NET の出力キャッシュ モジュールを無効化してください。このようにすれば、将来セキュリティ上の脆弱性がこのモジュールに見つかった場合でも、アプリケーションは安全です。

まとめ

この章では、後続の章の理解に役立つ基礎的な内容を説明しました。また、ガイドの目的と、全体的な構成を紹介しました。この章に記載のある主要な用語や原則は、後続の章全体で頻繁に使用および参照されるため、よく理解しておいてください。