サービス拒否は、メッセージを処理できない方法でシステムに負荷がかかったり、処理速度が非常に遅くなったりした場合に発生します。
過剰なメモリ消費量
一意のローカル名、名前空間、またはプレフィックスが多数含まれる XML ドキュメントを読み取ると、問題が発生する可能性があります。 XmlReaderから派生したクラスを使用していて、各項目のLocalName、Prefix、またはNamespaceURIプロパティを呼び出すと、返された文字列がNameTableに追加されます。 NameTableが保持するコレクションのサイズが小さくなり、文字列ハンドルの仮想 "メモリ リーク" が作成されることはありません。
軽減策は次のとおりです。
NameTable クラスから派生し、最大サイズ クォータを適用します。 ( NameTable の使用を防いだり、 NameTable がいっぱいになったときにを切り替えたりすることはできません。
前述のプロパティを使用しないでください。可能な場合は、IsStartElement メソッドで MoveToAttribute メソッドを使用してください。これらのメソッドは文字列を返さないため、NameTable コレクションをオーバーフィルする問題を回避します。
悪意のあるクライアントが過剰なライセンス要求をサービスに送信する
悪意のあるクライアントが過剰なライセンス要求でサービスを攻撃すると、サーバーが過剰なメモリを使用する可能性があります。
軽減策: LocalServiceSecuritySettings クラスの次のプロパティを使用します。
MaxCachedCookies:
SPNego
またはSSL
ネゴシエーションの後にサーバーがキャッシュする時間制限付きSecurityContextToken
の最大数を制御します。IssuedCookieLifetime:
SPNego
またはSSL
ネゴシエーションの後にサーバーが発行するSecurityContextTokens
の有効期間を制御します。 サーバーは、この期間のSecurityContextToken
をキャッシュします。MaxPendingSessions: サーバーで確立されているが、アプリケーション メッセージが処理されていないセキュリティで保護された会話の最大数を制御します。 このクォータにより、クライアントがサービスでセキュリティで保護された会話を確立できなくなるため、サービスはクライアントごとに状態を維持しますが、使用することはありません。
InactivityTimeout: メッセージ交換のためにクライアントからアプリケーション メッセージを受信することなく、サービスが安全な会話を維持する最大時間を制御します。 このクォータにより、クライアントがサービスでセキュリティで保護された会話を確立できなくなるため、サービスはクライアントごとに状態を維持しますが、使用することはありません。
WSDualHttpBinding またはデュアル カスタム バインドにはクライアント認証が必要
既定では、 WSDualHttpBinding でセキュリティが有効になっています。 ただし、 ClientCredentialType プロパティを None に設定してクライアント認証を無効にすると、悪意のあるユーザーが 3 番目のサービスに対するサービス拒否攻撃を引き起こす可能性があります。 これは、悪意のあるクライアントが 3 つ目のサービスにメッセージのストリームを送信するようにサービスに指示する可能性があるために発生する可能性があります。
これを軽減するには、プロパティを None
に設定しないでください。 また、デュアル メッセージ パターンを持つカスタム バインドを作成する場合も、この可能性に注意してください。
監査イベント ログを入力できます
悪意のあるユーザーが監査が有効であることを認識した場合、その攻撃者は、監査エントリが書き込まれる原因となる無効なメッセージを送信する可能性があります。 この方法で監査ログが入力されると、監査システムは失敗します。
これを軽減するには、 SuppressAuditFailure プロパティを true
に設定し、イベント ビューアーのプロパティを使用して監査動作を制御します。 イベント ビューアーを使用してイベント ログを表示および管理する方法の詳細については、「 イベント ビューアー」を参照してください。 詳細については、「 監査」を参照してください。
IAuthorizationPolicy の無効な実装により、サービスが応答しなくなる可能性があります
IAuthorizationPolicy インターフェイスの誤った実装で Evaluate メソッドを呼び出すと、サービスが応答しなくなる可能性があります。
軽減策: 信頼されたコードのみを使用します。 つまり、記述してテストしたコード、または信頼できるプロバイダーから取得したコードのみを使用します。 IAuthorizationPolicyの信頼されていない拡張機能を、十分に考慮せずにコードに接続することを許可しないでください。 これは、サービス実装で使用されるすべての拡張機能に適用されます。 WCF は、拡張ポイントを使用して接続されているアプリケーション コードと外部コードを区別しません。
Kerberos の最大トークン サイズにサイズ変更が必要な場合がある
クライアントが多数のグループに属している場合 (実際の数はグループによって異なりますが、約 900 個)、メッセージ ヘッダーのブロックが 64 KB を超えると問題が発生する可能性があります。 その場合は、Kerberos トークンの最大サイズを増やすことができます。 また、より大きな Kerberos トークンに対応するために、WCF メッセージの最大サイズを増やす必要がある場合もあります。
自動登録の結果、コンピューターのサブジェクト名が同じ複数の証明書が作成される
自動登録 は、証明書のユーザーとコンピューターを自動的に登録する Windows Server 2003 の機能です。 コンピューターが機能が有効になっているドメイン上にある場合、新しいマシンがネットワークに参加するたびに、クライアント認証の目的を持つ X.509 証明書が自動的に作成され、ローカル コンピューターの個人用証明書ストアに挿入されます。 ただし、自動登録では、キャッシュに作成されるすべての証明書に同じサブジェクト名が使用されます。
影響を受けるのは、WCF サービスが自動登録を使用するドメインで開くことができない可能性があるということです。 これは、コンピューターの完全修飾ドメイン ネーム システム (DNS) 名を持つ複数の証明書が存在するため、既定のサービス X.509 資格情報の検索条件があいまいである可能性があるために発生します。 1 つの証明書は自動登録から作成されます。もう 1 つの証明書は、自己発行の証明書である可能性があります。
これを軽減するには、 <serviceCredentials>でより正確な検索条件を使用して、使用する正確な証明書を参照します。 たとえば、 FindByThumbprint オプションを使用し、一意の拇印 (ハッシュ) で証明書を指定します。
自動登録機能の詳細については、「 Windows Server 2003 での証明書の自動登録」を参照してください。
承認に使用される複数の代替サブジェクト名の最後
まれに、X.509 証明書に複数の代替サブジェクト名が含まれており、代替サブジェクト名を使用して承認すると、承認が失敗する可能性があります。
ACL を使用して構成ファイルを保護する
CardSpace で発行されたトークンのコード ファイルと構成ファイルでは、必須および省略可能な要求を指定できます。 これにより、セキュリティ トークン サービスに送信される RequestSecurityToken
メッセージに対応する要素が出力されます。 攻撃者はコードまたは構成を変更して必須またはオプションの要求を削除し、セキュリティ トークン サービスがターゲット サービスへのアクセスを許可しないトークンを発行する可能性があります。
軽減するには:構成ファイルを変更するためにコンピューターへのアクセスが必要です。 構成ファイルをセキュリティで保護するには、ファイル アクセス制御リスト (ACL) を使用します。 WCF では、このようなコードを構成から読み込む前に、コードをアプリケーション ディレクトリまたはグローバル アセンブリ キャッシュに配置する必要があります。 ディレクトリ ACL を使用してディレクトリをセキュリティで保護します。
サービスのセキュリティで保護されたセッションの最大数に達しました
クライアントがサービスによって正常に認証され、セキュリティで保護されたセッションがサービスと共に確立されると、クライアントがセッションを取り消すか、セッションの有効期限が切れるまで、サービスはセッションを追跡します。 確立されたすべてのセッションは、サービスとのアクティブな同時セッションの最大数の制限に対してカウントされます。 この制限に達すると、そのサービスで新しいセッションを作成しようとするクライアントは、1 つ以上のアクティブなセッションの有効期限が切れるか、クライアントによって取り消されるまで拒否されます。 クライアントは 1 つのサービスに対して複数のセッションを持つ場合があり、それらの各セッションは制限にカウントされます。
注
ステートフル セッションを使用する場合、前の段落は適用されません。 ステートフル セッションの詳細については、「 方法: セキュリティで保護されたセッションのセキュリティ コンテキスト トークンを作成する」を参照してください。
これを軽減するには、SecurityBindingElement クラスの SecurityBindingElement プロパティを設定して、アクティブなセッションの最大数とセッションの最大有効期間の制限を設定します。