印刷用ページ      送信     
クリックして評価とフィードバックをお寄せください
MSDN
MSDN ライブラリ
テクニカルドキュメント
セキュリティ
チェックリスト
 チェックリスト: ASP.NET をセキュリティ保護する
チェックリスト: ASP.NET をセキュリティ保護する
公開日: 2004年9月7日 | 最終更新日: 2004年9月7日
トピック

チェックリストの使用方法
 チェックリストの使用方法
設計の考慮事項
 設計の考慮事項
アプリケーション カテゴリの考慮事項 アプリケーション カテゴリの考慮事項
構成ファイルの設定 構成ファイルの設定

チェックリストの使用方法

これは、モジュール 10「セキュリティ保護された ASP.NET ページとコントロールを構築する」、モジュール 19「ASP.NET アプリケーションと Web サービスをセキュリティ保護する」、およびモジュール 20「複数の Web アプリケーションをホストする」に対応するチェックリストです。このチェックリストは、ASP.NET アプリケーションのセキュリティ保護に役立てることもできます。また対応するモジュールのスナップショットとしても使用できます。

設計の考慮事項

チェック

説明

セキュリティの決定は、クライアント側の検証に依存せずにサーバー側で作成する必要があります。

Web サイトは、パブリック アクセス領域と認証アクセスを必要とする制限領域に分かれています。この 2 つの領域間を移動する場合に、重要な資格情報をやり取りしないでください。

ASP.NET の Web アプリケーションからリモートのリソースにアクセスするために使用する ID を明確に特定しています。

ネットワーク上および永続的な格納域で資格情報、認証チケット、およびその他の機密情報をセキュリティ保護するメカニズムを特定しています。

安全な例外管理の方法を特定しています。アプリケーションに例外が発生した場合は、安全に失敗します。

サイトに、ページとディレクトリに対する細分化された承認チェックを設定しています。

Web コントロール、ユーザー コントロール、およびリソース アクセス コードは、セキュリティを細分化して保護するために個々のアセンブリに分割しています。

アプリケーション カテゴリの考慮事項

入力検証

チェック

説明

ユーザー入力の種類、長さ、形式、および範囲を検証しています。入力が有効で安全な既知のデータであるかどうかをチェックし、次に悪意があるかまたは危険なデータかどうかをチェックします。

文字列フォーム フィールドへの入力は、RegularExpressionValidator コントロールなどによる正規表現を使用して検証しています。

通常の HTML コントロール、クエリ文字列、Cookie、およびその他のフォームへの入力は、Regex クラスまたは各自のカスタム認証コードを使用して検証しています。

入力する必要があるデータには、RequiredFieldValidator コントロールを使用しています。

サーバー コントロールの範囲チェックには、RangeValidator コントロールを使用しています。

自由形式の入力は校正して悪意のあるデータを削除しています。

入力ファイル名は正しい形式で、アプリケーションのコンテキストにおいて検証可能で有効です。

入力内容を含む出力は、HtmlEncode および UrlEncode を使用してエンコードしています。

MapPath は、アプリケーション間のマッピングを適切に制限しています。

サーバーに文字のエンコードが設定されています (ISO-8859-1 を推奨)。

ASP.NET version 1.1 の validateRequest オプションを有効にしています。

URLScan を Web サーバーにインストールしています。

多層防御のために HttpOnly Cookie オプションを使用して、クロスサイト スクリプティングを防止しています (Internet Explorer 6 SP1 以降のみ)。

SQL パラメータをデータ アクセス コードで使用して、データの長さと種類を検証し、SQL インジェクションを防止しています。

認証

チェック

説明

サイトは、制限領域とパブリック領域に分かれています。

サイトがセキュリティ保護されたフォルダと保護されていないフォルダに分かれている場合は、絶対 URL を使用して移動しています。

資格情報および認証 Cookie の保護に SSL (Secure Sockets Layer) を使用しています。

SSL を使用して Cookie を保護していない場合は、slidingExpiration 属性は "false" に設定し、認証 Cookie のタイムアウトを有限に設定しています。

フォーム認証 Cookie は、requireSSL 属性または Secure Cookie プロパティを使用して HTTPS 接続に制限しています。

認証 Cookie は暗号化し、整合性をチェックしています (protection="All")。

永続的な認証 Cookie は使用していません。

アプリケーション Cookie に一意のパスと名前の組み合わせを指定しています。

個人用 Cookie は認証 Cookie と区別しています。

パスワードは直接ユーザー ストアに保存せず、代わりに salt 付きのパスワード ダイジェストを保存しています。

固定の ID を使用する場合、偽装資格情報は構成ファイル内で Aspnet_setreg.exe を使用して暗号化されています。

認証のために強力なパスワード ポリシーを実装しています。

Forms 認証の

<forms>
要素では、
<credentials>
要素は使用していません (テストのみに使用)。

承認

チェック

説明

ページとディレクトリへのアクセス制御に URL 承認を使用しています。

ファイル承認は Windows 認証と共に使用しています。

クラスおよびそのメンバへのアクセスをセキュリティ保護するために、プリンシパル アクセス許可要求を使用しています。

細分化された承認が必要な場合は、明示的な役割チェックを使用しています。

構成管理

チェック

説明

HttpForbiddenHandler を使用して、構成ファイルが取得されるのをブロックしています。

ASP.NET の実行には、最小権限アカウントを使用しています。

カスタム アカウントの資格情報を使用する場合は、

<processModel>
要素に Aspnet_setreg.exe を使用して暗号化しています。

マシン全体にポリシーを適用するために、Machine.config の allowOveride="false" を使用して Web.config の設定をロックしています。

機密性の高いデータ

チェック

説明

ワイヤ上の機密性の高いデータは、SSL を使用して保護されています。

機密性の高いデータは、ページ間で転送せずに、サーバー側の状態管理機能を使用して保守しています。

機密性の高いデータは、Cookie、隠しフォーム フィールド、またはクエリ文字列に保存していません。

機密性の高いデータを含むページの出力キャッシュは、オフにしています。

Web.config および Machine.config ファイルでテキスト形式のパスワードは使用していません。資格情報の暗号化には Aspnet_setreg.exe を使用しています。

セッション管理

チェック

説明

セッションの Cookie は、認証されたアクセスを必要とするすべてのページについて SSL を使用して保護されています。

セッション状態サービスを使用しない場合は無効にしています。

セッション状態サービスを使用する場合は、最小権限アカウントで実行しています。

Microsoft® SQL Server 状態データベースには、Windows 認証を使用して接続しています。

SQL Server の状態データへのアクセスを制限しています。

接続文字列は、Aspnet_setreg.exe を使用して暗号化しています。

状態ストアへの通信チャネルを暗号化しています (IPSec または SSL)。

パラメータ改ざん

チェック

説明

ビュー ステートは、メッセージ確認コード (MAC) を使用して保護されています。

サーバーの機密情報を含むクエリ文字列をハッシュしています。

すべての入力パラメータを検証しています。

Page.ViewStateUserKey を使用して、ワンクリック攻撃を防止しています。

例外管理

チェック

説明

構造化例外処理を使用しています。

例外の詳細ログをサーバーに記録しています。

無害なメッセージを含む一般的なエラー ページをクライアントに返しています。

ページ レベルまたはアプリケーション レベルのエラー ハンドラを実装しています。

アプリケーションはエラーと例外状態を区別します。

監査とログ記録

チェック

説明

ASP.NET プロセスは、実行時に新しいイベント ソースを作成でき、インストール時にアプリケーション イベント ソースを作成できるように構成されています。

構成ファイルの設定

チェック

説明

<trace/>
運用サーバーでは、トレースは無効にしています。

<trace enabled="false">

<globalization>
要求と応答のエンコードは、適切に構成されています。

<httpRuntime>
maxRequestLength は、サイズが非常に大きいファイルのアップロードを禁止するように構成されています (オプション)。

<compilation>
運用サーバーでは、デバッグ コンパイルは次のように設定して無効にしています。
debug="false"

<compilation debug="false" . . ./>

<pages>
アプリケーションがビュー ステートを使用しない場合は、enableViewState を "false" に設定しています。

<pages enableViewState="false" . . ./>

アプリケーションがビュー ステートを使用する場合は、enableViewState を "true" に設定し enableViewStateMac を "true" に設定して、ビュー ステートの変更を検出します。

<pages enableViewState="true" enableViewStateMac="true" />

<customErrors>
カスタム エラー ページをクライアントに返しています。また、mode="On" を設定して、例外の詳細は返さないようにしています。

<customErrors mode="On" />

一般的なエラー ページは defaultRedirect 属性によって指定しています。

<customErrors mode="On" defaultRedirect="/apperrorpage.htm" />

<authentication>
認証モードは、アプリケーションの要件をサポートするために適切に構成されています。特定の認証タイプを使用するために、

<location>
要素に allowOverride="false" を指定しています。
<location path="" allowOverride="false">  
<system.web>    
<authentication mode="Windows" />  
</system.web></location>

<forms>
Web サイトは、パブリック領域とアクセス制限領域に分かれています。
Forms 認証の構成はセキュリティ保護されています。

<forms loginUrl="Restricted\login.aspx"       
protection="All"       
requireSSL="true"       
timeout="10"       
name="AppNameCookie"       
path="/FormsAuth"       
slidingExpiration="true" />

認証 Cookie は暗号化し、整合性をチェックしています (protection)。
認証 Cookie クッキーには SSL が必要です (requireSSL)。
SSL を使用しない場合は、変化する有効期限を "false" に設定します (slidingExpiration)。
セッションの有効期限を制限します (timeout)。
Cookie に一意の名前とパスを指定します (name と path)。

<credentials> 要素は使用しません。
										
		

<identity>
偽装 ID を使用する場合、偽装 ID はレジストリ内で Aspnet_setreg.exe を使用して暗号化されています。

<identity impersonate="true"          
userName="registry:HKLM\SOFTWARE\YourApp\
identity\ASPNET_SETREG,userName"          
password="registry:HKLM\SOFTWARE\YourApp\
identity\ASPNET_SETREG,password"/>

<authorization>
役割名の形式が正しいことを検証しています。

<machineKey>
複数の ASP.NET Web アプリケーションを同じ Web サーバーに展開する場合は、"IsolateApps" の設定を使用して、必ず各 Web アプリケーションに個別のキーが生成されるようにしています。

<machineKey validationKey="AutoGenerate,IsolateApps"
decryptionKey="AutoGenerate,IsolateApps"      
validation="SHA1" />

ASP.NET Web アプリケーションを Web ファームで実行する場合は、特定のマシン キーを使用し、これらのキーをファームのすべてのサーバーにコピーします。
ビュー ステートが有効になっている場合、validation 属性は "SHA1" に設定しています。
アプリケーションに対して Forms 認証 Cookie を暗号化する場合は、validation 属性を "3DES" に設定します。

<sessionState>
mode="StateServer" の場合、資格情報は Aspnet_setreg.exe を使用して暗号化し、レジストリに保存しています。
mode="SQLServer" の場合、Windows 認証を使用して状態ストア データベースに接続し、資格情報は Aspnet_setreg.exe を使用して暗号化し、レジストリに保存します。

<httpHandlers>
未使用のファイルの種類は、HttpForbiddenHandler にマップし、HTTP を経由してファイルが取得されないようにしています。例:

<add verb="*" path="*.rem"            
type="System.Web.HttpForbiddenHandler"/> 

<processModel>
ASP.NET プロセスの実行には、ASPNET などの最小権限アカウントを使用しています。

<processModel userName="Machine" password="AutoGenerate"

ASP.NET プロセスを実行するためにシステム アカウントは使用しません。
"オペレーティング システムの一部として機能" 権限は、プロセス アカウントに与えていません。

<processModel  
userName="registry:HKLM\SOFTWARE\MY_SECURE_APP\  
processmodel\ASPNET_SETREG,userName"  
password="registry:HKLM\SOFTWARE\MY_SECURE_APP\  
processmodel\ASPNET_SETREG,password" . . ./>

アプリケーションが Enterprise Services を使用する場合、comAuthenticationLevel および comImpersonationLevel は適切に構成されています。
リモート アプリケーションがすべてのメソッド呼び出しを認証するように、呼び出しレベルの認証は最小限に設定します。
インフラストラクチャ チャネル セキュリティ (IPSec) がない場合、PktPrivacy を使用してデータを暗号化してワイヤ上のデータの改ざんを防止します。
PktIntegrity を使用してデータを暗号化せずにデータの改ざんを防止します (攻撃者はネットワーク モニタによってデータを盗聴できます)。

<webServices>
未使用のプロトコルは無効にしています。
WSDL (Web Services Description Language) の自動生成は無効にしています (オプション)。

Web ファームの考慮事項

チェック

説明

セッション状態 - サーバー アフィニティを回避するために、ASP.NET セッション状態は ASP.NET SQL Server 状態データベースの処理外またはリモート マシンで動作する out-of-process 状態サービスで保守しています。

暗号化と検証 - Forms 認証 Cookie とビュー ステートを暗号化および検証するためのキーは、Web ファームのすべてのサーバーで同一です。

DPAPI - DPAPI とマシン キーを使用してファームのすべてのサーバーがアクセスする共通データを暗号化することはできません。リモート サーバーの共有データを暗号化するには、3DES などの代わりの実装を使用します。

複数のアプリケーションのホスト

チェック

説明

アプリケーションに固有のマシン キーがあります。

<machineKey>
に IsolateApps を使用するか、またはアプリケーションごとに
<machineKey>
要素を使用します。
<machineKey validationKey="AutoGenerate,IsolateApps" 
decryptionKey="AutoGenerate,IsolateApps" . . . />

各アプリケーションに対して、Forms 認証 Cookie のための一意のパスと名前の組み合わせを有効にしています。

Microsoft Windows® Server 2003 のアプリケーション分離には、複数のプロセス (IIS 6.0 アプリケーション プール) を使用しています。

Windows 2000 のアプリケーション分離には、複数の匿名ユーザー アカウント (および偽装) を使用しています。

Web ファームのすべてのサーバーに対して共通のマシン キーを有効にしています。

単一のサーバーで複数のアプリケーションをホストする場合は、各アプリケーションに個別のマシン キーを使用しています。

プロセス分離およびシステム リソースへのアクセスを制限するために、コード アクセス セキュリティの信頼レベルを使用しています (.NET Framework version 1.1 が必要です)。

ACL とアクセス許可

チェック

説明

ASP.NET の一時ファイル

%windir%\Microsoft.NET\Framework\{version}Temporary ASP.NET Files

ASP.NET プロセス アカウントおよび偽装された ID: フル コントロール

一時ディレクトリ

(%temp%)

ASP.NET プロセス アカウント: フル コントロール

.NET Framework ディレクトリ

%windir%\Microsoft.NET\Framework\{version}

ASP.NET プロセス アカウントおよび偽装された ID:
読み取りと実行
フォルダの内容の一覧表示

.NET Framework 構成ディレクトリ

%windir%\Microsoft.NET\Framework\{version}\CONFIG

ASP.NET プロセス アカウントおよび偽装された ID:
読み取りと実行
フォルダの内容の一覧表示
読み取り

Web サイトのルート

C:\inetpub\wwwroot

または、デフォルト Web サイトが ASP.NET プロセス アカウントをポイントするパス:
フル コントロール

システム ルート ディレクトリ

%windir%\system32

ASP.NET プロセス アカウント: 読み取り

グローバル アセンブリ キャッシュ

%windir%\assembly

プロセス アカウントおよび偽装された ID: 読み取り

コンテンツ ディレクトリ

C:\inetpub\wwwroot\YourWebApp

プロセス アカウント:
読み取りと実行
フォルダの内容の一覧表示
読み取り
注: .NET Framework version 1.0 では、コンテンツ ディレクトリからファイル システムのルート ディレクトリまでのすべての親ディレクトリにも上記のアクセス許可が必要です。親ディレクトリは、次のとおりです。

C:\
C:\inetpub\
C:\inetpub\wwwroot\

アプリケーションの Bin ディレクトリ

チェック

説明

IIS Web アクセス許可は構成されています。
Bin ディレクトリには、読み取り、書き込み、およびディレクトリ参照のアクセスは許可していません。
実行のアクセス許可は、[なし] に設定されています。

すべてのアクセスが拒否されるように、認証設定は削除されています。


© 2008 Microsoft Corporation.All rights reserved. 使用条件  |  商標  |  プライバシー
Page view tracker