HTTP 要求に対する HTTP 400 正しくない要求 (要求ヘッダーが長すぎます) の応答

Kerberos 認証を必要とする HTTP 要求が、インターネット インフォメーション サービス (IIS) でホストされ、Kerberos 認証を使用するように構成されている Web サイトに送信されると、HTTP 要求ヘッダーが非常に長くなります。 この記事は、HTTP 要求ヘッダーが長すぎる場合に発生する HTTP 400 エラーを回避するのに役立ちます。

元の製品バージョン: Windows Server 2016
元の KB 番号: 2020943

現象

Kerberos 認証を必要とする HTTP 要求は、ブラウザーから IIS でホストされている Web サイトに送信されます。 Web サイトは、Kerberos 認証を使用するように構成されています。 ただし、必要な Web ページを受信する代わりに、次のようなエラー メッセージが表示されます。

HTTP 400 - 正しくない要求 (要求ヘッダーが長すぎます)

この応答は、Windows リモート管理 (WinRM) を含む任意の HTTP 要求によって生成される可能性があります。

原因

この問題は、ユーザーが多くの Active Directory ユーザー グループのメンバーである場合に発生する可能性があります。

サーバーへの HTTP 要求には、WWW-Authenticate ヘッダーに Kerberos トークンが含まれています。 ヘッダー サイズは、ユーザー グループの数と共に増加します。 HTTP ヘッダーまたはパケット サイズがサーバーで構成されている制限を超えて増加した場合、サーバーは要求を拒否し、応答としてエラー メッセージを送信することがあります。

回避策 1: Active Directory グループの数を減少させる

ユーザーがメンバーである Active Directory グループの数を減少させます。

回避策 2: MaxFieldLength レジストリ エントリと MaxRequestBytes レジストリ エントリを設定する

サーバー上の MaxFieldLength レジストリ エントリと MaxRequestBytes レジストリ エントリの設定を増加して、ユーザーの要求ヘッダーがこれらの値を超えないようにします。 適切な設定を決定するには、次の計算を使用します。

  1. 次の記事で説明するフォーマットを使用して、ユーザーの Kerberos トークンのサイズを計算します。
    ユーザーが多数のグループに属している場合の Kerberos 認証の問題

  2. サーバー上の MaxFieldLengthMaxRequestBytes の値を 4/3 * T バイトに設定します。ここで、T はユーザーのトークン サイズ (バイト単位) です。 HTTP は、base64 エンコードを使用して Kerberos トークンをエンコードします。

    注:

    これにより、トークン内の 3 バイトごとに 4 つの base64 でエンコードされたバイトに置き換えられます。 レジストリに加えられた変更は、HTTP サービスを再起動するまで有効になりません。 さらに、IIS サービスなどの関連サービスを再起動する必要がある場合があります。

アプリケーション環境によっては、Kerberos ではなく Windows NT LAN Manager (NTLM) を使用するように Web サイトを構成することで、この問題を回避することもできます。 一部のアプリケーション環境では、委任に Kerberos 認証を使用する必要があります。 Kerberos 認証は NTLM よりもセキュリティが高いと考えています。 また、セキュリティと委任の影響を考慮する前に、Kerberos 認証を無効にしないことをお勧めします。

詳細

既定では、MaxFieldLength レジストリ エントリはありません。 このエントリは、各 HTTP 要求ヘッダーの最大サイズ制限を指定します。 MaxRequestBytes レジストリ エントリは、要求行とヘッダーの合計サイズの上限を指定します。 通常、このレジストリ エントリは、MaxRequestBytes レジストリ エントリと共に構成されます。 MaxRequestBytes 値が MaxFieldLength 値よりも低い場合、MaxFieldLength 値が調整されます。 大規模な Active Directory 環境では、これらの両方のエントリの値が十分に高い値に設定されていない場合、ログオン エラーが発生する可能性があります。

IIS 6.0 以降の場合、 MaxFieldLength レジストリ キーと MaxRequestBytes レジストリ キーは次のサブ キーにあります。
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HTTP\Parameters

次の表に示すように、キー値を設定します。

名前 値の種類 値のデータ
MaxFieldLength DWORD (4/3 * T バイト) + 200
MaxRequestBytes DWORD (4/3 * T バイト) + 200

次の表に示すように、レジストリ キーを最大値に設定することもできます。 レジストリ設定を変更する前に、潜在的なセキュリティ上の影響をすべて考慮してください。

名前 値の種類 値のデータ
MaxFieldLength DWORD 65536 (12 進数) または 10000 (16 進数)
MaxRequestBytes DWORD 16777216 (12 進数) または 1000000 (16 進数)

重要

これらのレジストリ キーの変更は、非常に危険であると見なす必要があります。 これらのキーを使用すると、より大きな HTTP パケットを IIS に送信できます。 これにより、Http.sys により多くのメモリが使用される可能性があります。 そのため、このような変更により、悪意のある攻撃に対するコンピューターの脆弱性が増加する可能性があります。

MaxFieldLength が最大値の 64KB に設定されている場合、MaxTokenSize レジストリ値は 3/4 * 64 = 48 KB に設定する必要があります。 MaxTokenSize 設定の詳細については、「ユーザーが多数のグループに属している場合の Kerberos 認証の問題」を参照してください。

関連情報