ロールのセキュリティ保護
更新 : 2007 年 11 月
ロール管理を使用すると、"ロール" と呼ばれるカテゴリを作成し、それに基づいてアプリケーションの承認を管理できます。ユーザーをロールに割り当てると、ユーザー名の代わりに、またはユーザー名に加えて、ロールに基づいて Web アプリケーションの各部分や機能へのアクセスを制御できます。たとえば、従業員アプリケーションでは、マネージャ、従業員、ディレクタなどのロールを作成し、それぞれのロールごとに異なる権限を指定できます。
ユーザーは複数のロールに所属できます。たとえば、サイトがディスカッション フォーラムである場合、一部のユーザーはメンバとモデレータの両方のロールに属する場合があります。各ロールはサイト上で異なる特権を持つように定義できます。その場合、両方のロールに属するユーザーは両方の特権セットを持つことになります。
コーディングと構成に関する推奨手順に従うと、アプリケーションのセキュリティを改善できますが、Microsoft Windows や Microsoft Internet Information Services (IIS) の最新のセキュリティ更新プログラムと共に Microsoft SQL Server、Active Directory、またはその他のロール データ ソースの更新プログラムを使用して、アプリケーション サーバーを常に最新の状態に維持することも大切です。
安全なコードの記述とアプリケーションのセキュリティ保護のためのベスト プラクティスの詳細については、Michael Howard と David LeBlanc 共著『Writing Secure Code』、および Microsoft Patterns and Practices に示すガイダンス (https://www.microsoft.com/resources/practices/default.mspx) を参照してください。
セキュリティで保護されたロール マネージャの構成
既定では、ロール マネージャ機能は、ロール マネージャを使用しないアプリケーションのセキュリティを向上するために、ASP.NET アプリケーションでは無効になっています。ロール マネージャ機能が有効な場合、既定の構成設定は、最も安全な値に設定されます。ロール マネージャの構成設定と既定値の詳細については、「roleManager 要素 (ASP.NET 設定スキーマ)」を参照してください。
構成値の保護
アプリケーションの構成ファイル内に機密情報を格納する場合は、プロテクト構成を使用して機密情報を暗号化する必要があります。特に慎重を要する情報としては、machineKey 構成要素に格納される暗号キーや、connectionStrings 構成要素に格納されるデータ ソース接続文字列などがあります。詳細については、「保護された構成を使用した構成情報の暗号化」を参照してください。
暗号化キーのセキュリティ保護とハッシュ
Cookie にキャッシュされたロール名は、roleManager の cookieProtection 属性を All に設定して保護することをお勧めします。指定された暗号化アルゴリズムの暗号化キー値は、machineKey 構成要素に格納されます。強力な暗号化を実現するには、選択した暗号化アルゴリズムに対して適切な長さの値がランダムに生成される暗号化キーを指定します。
複数のアプリケーションをホストするサーバーの場合には、アプリケーションごとに一意の暗号化キーを定義する必要があります。また、安全性は低下しますが、代わりに単一の暗号化キーを定義し、そのキーで IsolateApps オプションを指定することもできます。
ホスト サーバーでは、オーバーライド権限を拒否することで、マシン構成からの構成設定をオーバーライドする機能を制限することもできます。この作業には、アプリケーションの Web.config ファイルで暗号化キーを再定義できないようにすることが含まれます。
ロール データ ソースへの接続のセキュリティ保護
接続文字列
前述したように、SQL Server、Active Directory、またはその他のデータ ソース アプリケーションへのアクセスに使用する接続文字列を保護することは重要です。データベース サーバーへの安全な接続を維持するには、プロテクト構成を使用して構成ファイルで接続文字列情報を暗号化する必要があります。詳細については、「保護された構成を使用した構成情報の暗号化」を参照してください。
統合セキュリティを使用した SQL Server への接続
SQL Server を実行するコンピュータに接続する際は、接続文字列の安全が損なわれてユーザー ID とパスワードが公開される可能性を回避するために、統合セキュリティを使用する必要があります。統合セキュリティを使用する接続を指定して、SQL Server を実行するコンピュータに接続すると、ロール マネージャ機能はプロセスの ID に戻ります。ASP.NET を実行するプロセス (アプリケーション プールなど) の ID は、必ず既定のプロセス アカウントまたは制限付きのユーザー アカウントになるようにしておく必要があります。詳細については、「ASP.NET の偽装」を参照してください。
SQL Server データベースへのアクセス許可
ロールのユーザー情報を格納するための SQL Server データベースには、必要な機能と参照範囲だけにユーザー アクセスを制限できるデータベース ロールとビューが含まれるようにします。SQL Server ロール データベースへの接続に使用するユーザー ID には、必要最小限の権限を割り当てます。詳細については、「SQL Server 向けアプリケーション サービス データベースのロールとビュー」を参照してください。
SQL Server Express ワーカー プロセス ID
SQL Server Express 2005 は、SQL Server が接続ユーザーの ID として動作するワーカー プロセスを起動できる新しい操作モードを搭載しています。この機能は、"実行時のユーザー" モードと呼ばれます。この操作モードは、IIS を使用したデスクトップ開発には適していますが、信頼されていない、複数のカスタマ コード ベースをホストする Web サーバーでワーカー プロセスを起動するのは適切ではありません。相互に信頼されないアプリケーションを含む共有ホスト サーバーでは、"実行時のユーザー" 機能を明示的に無効にする必要があります。この機能を無効にするには、SQL Express インスタンス (osql –E –S .\sqlexpress など) に接続し、次の Transact-SQL コマンドを発行します。
EXEC sp_configure 'show advanced option', '1'
GO
RECONFIGURE WITH OVERRIDE
GO
EXEC sp_configure 'user instances enabled', 0
GO
RECONFIGURE WITH OVERRIDE
GO
承認ストアのセキュリティ保護
AuthorizationStoreRoleProvider の使用時にデータ ソースのセキュリティを向上するには、ファイル ベースの承認ストアではなく Active Directory サーバーにロール情報を格納する必要があります。これにより、万一 Web サーバーの安全が損なわれた場合でも、ポリシーストア ファイルにアクセスされることは防止できます。
Active Directory サーバーに接続すると、ロール マネージャ機能はプロセスの ID に戻ります。ASP.NET を実行するプロセス (アプリケーション プールなど) の ID は、必ず既定のプロセス アカウントまたは制限付きのユーザー アカウントになるようにしておく必要があります。詳細については、「ASP.NET の偽装」を参照してください。また、Active Directory 承認ストアのアカウントには、ASP.NET アプリケーションによって必要とされる特定の承認マネージャ アプリケーションまたはスコープへのアクセスのみに限定されたアクセス許可を割り当てる必要があります。
Active Directory サーバーへの接続を保護するには、IPSec (Internet Protocol Security) などのネットワーク暗号化ツールを使用する必要があります。
ロール Cookie のセキュリティ保護
roleManager の cacheRolesInCookie 属性を true に設定すると、ユーザーのロール名をセッション Cookie にキャッシュしてパフォーマンスを向上できます。ロール名は既定でも暗号化形式で格納されますが、ロール Cookie のセキュリティを補強するために、cookieRequireSSL 属性に true を設定し、SSL が有効になっているときしかロールをセッション Cookie にキャッシュしないようにしてください。これにより、ロール Cookie がネットワークをとおして公開されることがなくなり、アプリケーションに対する再生攻撃で使用されるのを防止できます。
アプリケーション間での Cookie の共有の防止
roleManager 要素の cacheRolesInCookie 属性を true に設定し、cookiePath 属性に複数のアプリケーションへのパスを設定すると、同一のロール Cookie が複数のアプリケーションに送信されます。各アプリケーションの machineKey 構成要素に同じ暗号化情報を指定すると、ロール Cookie を複数のアプリケーションで共有できます。
複数のアプリケーションによるロール名 Cookie の共有を回避するには、各アプリケーションの machineKey 構成要素にそれぞれ別々の暗号化キーを指定し、各アプリケーションの cookiePath 属性に特定のアプリケーション パスを設定し、ApplicationName プロパティにアプリケーションの一意の値を設定します。
ロールを使用する Web ページのセキュリティ保護
ログオン ページなど、重要情報を処理するアプリケーション ページは、標準の Web セキュリティ メカニズムを使用して保護する必要があります。このメカニズムには、SSL (Secure Sockets Layer) を使用したり、ユーザー情報の更新やユーザーの削除のような重要な操作を行うときにユーザーのログオンを求めたりするなどの措置が含まれます。
さらに、パスワードや場合によってはユーザー名などの機密機能データがクリア テキストでページに公開されないようにする必要があります。そのような情報を表示するページには SSL を使用し、認証されたユーザーのみが閲覧できるようにします。また、機密機能データを Cookie に格納したり、セキュリティで保護されていない接続を通じて送信したりしないようにします。
サービス拒否攻撃に対するセキュリティ
更新や大規模な検索操作を実行するメソッドを複数のクライアントが同時に呼び出すと、ロール データ ソースの応答性が低下する可能性があります。サービス拒否攻撃を受ける可能性を最小限に抑えるには、データベースの更新や検索を実行するメソッドを利用する ASP.NET ページに対しては管理ユーザーしかアクセスできないように制限し、一般のユーザーに対しては、ロール メンバシップの検証ができる ASP.NET ページだけを公開するようにします。
エラー メッセージとイベント
例外
機密情報が望ましくないソースに公開されることを防ぐには、詳細なエラー情報を表示しないようにするか、またはクライアントが Web サーバーそのものであるときだけ詳細なエラー メッセージ情報を表示するように、アプリケーションを構成する必要があります。詳細については、「customErrors 要素 (ASP.NET 設定スキーマ)」を参照してください。
イベント ログ
サーバーが Windows Server 2003 を実行している場合、イベント ログをセキュリティ保護したり、イベント ログのサイズや保持期間などのパラメータを設定したりすることによって、アプリケーションのセキュリティを強化し、アプリケーションに対する間接的なサービス拒否攻撃を防ぐことができます。
トレース情報
Web サーバーは、ロールマネージャ機能に関連する特定のアクションをトレースし、トレース情報をログ ファイルに格納するように設定できます。トレース ログ ファイルにはユーザー名やロール名などの機密情報が格納されることがあるので、トレースを有効にする機能に対するアクセスを管理者だけに制限するのに加え、トレース ログ ファイルの場所を設定する機能およびトレース ログ ファイルにアクセスする機能に対するアクセスも制限する必要があります。
カスタムのロール プロバイダ
カスタムのロール プロバイダを作成する際には、データベースの操作時の SQL 注入攻撃などの攻撃を回避するために、必ずセキュリティ上の推奨事項に従ってください。カスタムのロール プロバイダを利用する際には、セキュリティ上の推奨事項に従ってプロバイダを必ず点検してください。
カルチャに依存した文字の操作
SQL Server のロール プロバイダまたはカスタムのロール プロバイダを使用する場合、カルチャに依存した形式でロール データを格納するようにデータ ソースを構成することがあります。ただし、ASP.NET は、authorization 構成要素で指定されたロール名と、カルチャに依存しないデータ ソースのロール名を常に評価します。したがって、未認証のロール名がカルチャに依存しない扱いの場合、承認済みロールの名前と同じなので、未認証のユーザーに意図しないアクセス許可が付与される可能性があります。ユーザーが未承認のアクセス権を取得しないように、カルチャに依存しないと評価されるときにロール名が一意になるようにします。