公開日: 2004年9月7日
| 最終更新日:
2004年9月7日
トピック
チェックリストの使用方法
これは、モジュール 10「セキュリティ保護された ASP.NET ページとコントロールを構築する」、モジュール 19「ASP.NET
アプリケーションと Web サービスをセキュリティ保護する」、およびモジュール 20「複数の Web
アプリケーションをホストする」に対応するチェックリストです。このチェックリストは、ASP.NET
アプリケーションのセキュリティ保護に役立てることもできます。また対応するモジュールのスナップショットとしても使用できます。
設計の考慮事項
| .gif) | セキュリティの決定は、クライアント側の検証に依存せずにサーバー側で作成する必要があります。 |
| .gif) | Web サイトは、パブリック
アクセス領域と認証アクセスを必要とする制限領域に分かれています。この 2
つの領域間を移動する場合に、重要な資格情報をやり取りしないでください。 |
| .gif) | ASP.NET の Web アプリケーションからリモートのリソースにアクセスするために使用する
ID を明確に特定しています。 |
| .gif) |
ネットワーク上および永続的な格納域で資格情報、認証チケット、およびその他の機密情報をセキュリティ保護するメカニズムを特定しています。 |
| .gif) | 安全な例外管理の方法を特定しています。アプリケーションに例外が発生した場合は、安全に失敗します。 |
| .gif) | サイトに、ページとディレクトリに対する細分化された承認チェックを設定しています。 |
| .gif) | Web コントロール、ユーザー コントロール、およびリソース アクセス
コードは、セキュリティを細分化して保護するために個々のアセンブリに分割しています。 |
アプリケーション カテゴリの考慮事項
入力検証
| .gif) |
ユーザー入力の種類、長さ、形式、および範囲を検証しています。入力が有効で安全な既知のデータであるかどうかをチェックし、次に悪意があるかまたは危険なデータかどうかをチェックします。 |
| .gif) | 文字列フォーム フィールドへの入力は、RegularExpressionValidator
コントロールなどによる正規表現を使用して検証しています。 |
| .gif) | 通常の HTML
コントロール、クエリ文字列、Cookie、およびその他のフォームへの入力は、Regex
クラスまたは各自のカスタム認証コードを使用して検証しています。 |
| .gif) | 入力する必要があるデータには、RequiredFieldValidator
コントロールを使用しています。 |
| .gif) | サーバー コントロールの範囲チェックには、RangeValidator
コントロールを使用しています。 |
| .gif) | 自由形式の入力は校正して悪意のあるデータを削除しています。 |
| .gif) | 入力ファイル名は正しい形式で、アプリケーションのコンテキストにおいて検証可能で有効です。 |
| .gif) | 入力内容を含む出力は、HtmlEncode および UrlEncode
を使用してエンコードしています。 |
| .gif) | MapPath は、アプリケーション間のマッピングを適切に制限しています。 |
| .gif) | サーバーに文字のエンコードが設定されています (ISO-8859-1 を推奨)。 |
| .gif) | ASP.NET version 1.1 の validateRequest
オプションを有効にしています。 |
| .gif) | URLScan を Web サーバーにインストールしています。 |
| .gif) | 多層防御のために HttpOnly Cookie オプションを使用して、クロスサイト
スクリプティングを防止しています (Internet Explorer 6 SP1 以降のみ)。 |
| .gif) | SQL パラメータをデータ アクセス コードで使用して、データの長さと種類を検証し、SQL
インジェクションを防止しています。 |
認証
| .gif) | サイトは、制限領域とパブリック領域に分かれています。 |
| .gif) | サイトがセキュリティ保護されたフォルダと保護されていないフォルダに分かれている場合は、絶対
URL を使用して移動しています。 |
| .gif) | 資格情報および認証 Cookie の保護に SSL (Secure Sockets Layer)
を使用しています。 |
| .gif) | SSL を使用して Cookie を保護していない場合は、slidingExpiration
属性は "false" に設定し、認証 Cookie のタイムアウトを有限に設定しています。 |
| .gif) | フォーム認証 Cookie は、requireSSL 属性または Secure Cookie
プロパティを使用して HTTPS 接続に制限しています。 |
| .gif) | 認証 Cookie は暗号化し、整合性をチェックしています
(protection="All")。 |
| .gif) | 永続的な認証 Cookie は使用していません。 |
| .gif) | アプリケーション Cookie に一意のパスと名前の組み合わせを指定しています。 |
| .gif) | 個人用 Cookie は認証 Cookie と区別しています。 |
| .gif) | パスワードは直接ユーザー ストアに保存せず、代わりに salt 付きのパスワード
ダイジェストを保存しています。 |
| .gif) | 固定の ID を使用する場合、偽装資格情報は構成ファイル内で Aspnet_setreg.exe
を使用して暗号化されています。 |
| .gif) | 認証のために強力なパスワード ポリシーを実装しています。 |
| .gif) | Forms 認証の <forms> 要素では、<credentials> 要素は使用していません (テストのみに使用)。 |
承認
| .gif) | ページとディレクトリへのアクセス制御に URL 承認を使用しています。 |
| .gif) | ファイル承認は Windows 認証と共に使用しています。 |
| .gif) | クラスおよびそのメンバへのアクセスをセキュリティ保護するために、プリンシパル
アクセス許可要求を使用しています。 |
| .gif) | 細分化された承認が必要な場合は、明示的な役割チェックを使用しています。 |
構成管理
| .gif) | HttpForbiddenHandler
を使用して、構成ファイルが取得されるのをブロックしています。 |
| .gif) | ASP.NET の実行には、最小権限アカウントを使用しています。 |
| .gif) | カスタム アカウントの資格情報を使用する場合は、<processModel> 要素に Aspnet_setreg.exe
を使用して暗号化しています。 |
| .gif) | マシン全体にポリシーを適用するために、Machine.config の allowOveride="false"
を使用して Web.config の設定をロックしています。 |
機密性の高いデータ
| .gif) | ワイヤ上の機密性の高いデータは、SSL を使用して保護されています。 |
| .gif) | 機密性の高いデータは、ページ間で転送せずに、サーバー側の状態管理機能を使用して保守しています。 |
| .gif) | 機密性の高いデータは、Cookie、隠しフォーム
フィールド、またはクエリ文字列に保存していません。 |
| .gif) | 機密性の高いデータを含むページの出力キャッシュは、オフにしています。 |
| .gif) | Web.config および Machine.config
ファイルでテキスト形式のパスワードは使用していません。資格情報の暗号化には Aspnet_setreg.exe を使用しています。 |
セッション管理
| .gif) | セッションの Cookie は、認証されたアクセスを必要とするすべてのページについて SSL
を使用して保護されています。 |
| .gif) | セッション状態サービスを使用しない場合は無効にしています。 |
| .gif) | セッション状態サービスを使用する場合は、最小権限アカウントで実行しています。 |
| .gif) | Microsoft® SQL Server 状態データベースには、Windows
認証を使用して接続しています。 |
| .gif) | SQL Server の状態データへのアクセスを制限しています。 |
| .gif) | 接続文字列は、Aspnet_setreg.exe を使用して暗号化しています。 |
| .gif) | 状態ストアへの通信チャネルを暗号化しています (IPSec または SSL)。 |
パラメータ改ざん
| .gif) | ビュー ステートは、メッセージ確認コード (MAC) を使用して保護されています。 |
| .gif) | サーバーの機密情報を含むクエリ文字列をハッシュしています。 |
| .gif) | すべての入力パラメータを検証しています。 |
| .gif) | Page.ViewStateUserKey を使用して、ワンクリック攻撃を防止しています。 |
例外管理
| .gif) | 構造化例外処理を使用しています。 |
| .gif) | 例外の詳細ログをサーバーに記録しています。 |
| .gif) | 無害なメッセージを含む一般的なエラー ページをクライアントに返しています。 |
| .gif) | ページ レベルまたはアプリケーション レベルのエラー ハンドラを実装しています。 |
| .gif) | アプリケーションはエラーと例外状態を区別します。 |
監査とログ記録
| .gif) | ASP.NET プロセスは、実行時に新しいイベント
ソースを作成でき、インストール時にアプリケーション イベント ソースを作成できるように構成されています。 |
構成ファイルの設定
| .gif) | <trace/> 運用サーバーでは、トレースは無効にしています。
<trace enabled="false"> |
| .gif) | <globalization> 要求と応答のエンコードは、適切に構成されています。 |
| .gif) | <httpRuntime> maxRequestLength
は、サイズが非常に大きいファイルのアップロードを禁止するように構成されています (オプション)。
|
| .gif) | <compilation> 運用サーバーでは、デバッグ コンパイルは次のように設定して無効にしています。
debug="false"
<compilation debug="false" . . ./> |
| .gif) | <pages> アプリケーションがビュー ステートを使用しない場合は、enableViewState を
"false" に設定しています。
<pages enableViewState="false" . . ./> アプリケーションがビュー ステートを使用する場合は、enableViewState を "true" に設定し
enableViewStateMac を "true" に設定して、ビュー ステートの変更を検出します。
<pages enableViewState="true" enableViewStateMac="true" /> |
| .gif) | <customErrors> カスタム エラー ページをクライアントに返しています。また、mode="On"
を設定して、例外の詳細は返さないようにしています。
<customErrors mode="On" /> 一般的なエラー ページは defaultRedirect 属性によって指定しています。
<customErrors mode="On" defaultRedirect="/apperrorpage.htm" /> |
| .gif) | <authentication>
認証モードは、アプリケーションの要件をサポートするために適切に構成されています。特定の認証タイプを使用するために、<location> 要素に allowOverride="false"
を指定しています。
<location path="" allowOverride="false">
<system.web>
<authentication mode="Windows" />
</system.web></location> |
| .gif) | <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> 要素は使用しません。 |
| .gif) | <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"/> |
| .gif) | <authorization> 役割名の形式が正しいことを検証しています。 |
| .gif) | <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" に設定します。 |
| .gif) | <sessionState> mode="StateServer"
の場合、資格情報は Aspnet_setreg.exe を使用して暗号化し、レジストリに保存しています。 mode="SQLServer"
の場合、Windows 認証を使用して状態ストア データベースに接続し、資格情報は Aspnet_setreg.exe
を使用して暗号化し、レジストリに保存します。 |
| .gif) | <httpHandlers> 未使用のファイルの種類は、HttpForbiddenHandler
にマップし、HTTP を経由してファイルが取得されないようにしています。例: <add verb="*" path="*.rem"
type="System.Web.HttpForbiddenHandler"/> |
| .gif) | <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
を使用してデータを暗号化せずにデータの改ざんを防止します (攻撃者はネットワーク モニタによってデータを盗聴できます)。 |
| .gif) | <webServices> 未使用のプロトコルは無効にしています。 WSDL
(Web Services Description Language) の自動生成は無効にしています (オプション)。 |
Web ファームの考慮事項
| .gif) | セッション状態 - サーバー アフィニティを回避するために、ASP.NET
セッション状態は ASP.NET SQL Server 状態データベースの処理外またはリモート マシンで動作する
out-of-process 状態サービスで保守しています。 |
| .gif) | 暗号化と検証 - Forms 認証 Cookie とビュー
ステートを暗号化および検証するためのキーは、Web ファームのすべてのサーバーで同一です。 |
| .gif) | DPAPI - DPAPI とマシン
キーを使用してファームのすべてのサーバーがアクセスする共通データを暗号化することはできません。リモート
サーバーの共有データを暗号化するには、3DES などの代わりの実装を使用します。 |
複数のアプリケーションのホスト
| .gif) | アプリケーションに固有のマシン キーがあります。 <machineKey> に IsolateApps
を使用するか、またはアプリケーションごとに <machineKey> 要素を使用します。 <machineKey validationKey="AutoGenerate,IsolateApps"
decryptionKey="AutoGenerate,IsolateApps" . . . /> |
| .gif) | 各アプリケーションに対して、Forms 認証 Cookie
のための一意のパスと名前の組み合わせを有効にしています。 |
| .gif) | Microsoft Windows® Server 2003
のアプリケーション分離には、複数のプロセス (IIS 6.0 アプリケーション プール) を使用しています。 |
| .gif) | Windows 2000 のアプリケーション分離には、複数の匿名ユーザー アカウント
(および偽装) を使用しています。 |
| .gif) | Web ファームのすべてのサーバーに対して共通のマシン キーを有効にしています。 |
| .gif) | 単一のサーバーで複数のアプリケーションをホストする場合は、各アプリケーションに個別のマシン
キーを使用しています。 |
| .gif) | プロセス分離およびシステム リソースへのアクセスを制限するために、コード アクセス
セキュリティの信頼レベルを使用しています (.NET Framework version 1.1 が必要です)。 |
ACL とアクセス許可
| .gif) | ASP.NET の一時ファイル %windir%\Microsoft.NET\Framework\{version}Temporary ASP.NET Files ASP.NET プロセス アカウントおよび偽装された ID: フル コントロール |
| .gif) | 一時ディレクトリ (%temp%) ASP.NET プロセス アカウント: フル コントロール |
| .gif) | .NET Framework ディレクトリ %windir%\Microsoft.NET\Framework\{version} ASP.NET プロセス アカウントおよび偽装された ID: 読み取りと実行 フォルダの内容の一覧表示 |
| .gif) | .NET Framework 構成ディレクトリ %windir%\Microsoft.NET\Framework\{version}\CONFIG ASP.NET プロセス アカウントおよび偽装された ID: 読み取りと実行 フォルダの内容の一覧表示
読み取り |
| .gif) | Web サイトのルート C:\inetpub\wwwroot または、デフォルト Web サイトが ASP.NET プロセス アカウントをポイントするパス: フル コントロール |
| .gif) | システム ルート ディレクトリ %windir%\system32 ASP.NET プロセス アカウント: 読み取り |
| .gif) | グローバル アセンブリ キャッシュ %windir%\assembly プロセス アカウントおよび偽装された ID: 読み取り |
| .gif) | コンテンツ ディレクトリ C:\inetpub\wwwroot\YourWebApp プロセス アカウント: 読み取りと実行 フォルダの内容の一覧表示 読み取り 注: .NET
Framework version 1.0 では、コンテンツ ディレクトリからファイル システムのルート
ディレクトリまでのすべての親ディレクトリにも上記のアクセス許可が必要です。親ディレクトリは、次のとおりです。 C:\
C:\inetpub\
C:\inetpub\wwwroot\ |
アプリケーションの Bin ディレクトリ
| .gif) | IIS Web アクセス許可は構成されています。 Bin
ディレクトリには、読み取り、書き込み、およびディレクトリ参照のアクセスは許可していません。 実行のアクセス許可は、[なし]
に設定されています。 |
| .gif) | すべてのアクセスが拒否されるように、認証設定は削除されています。 |