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
レジストリ エントリの設定を増加して、ユーザーの要求ヘッダーがこれらの値を超えないようにします。 適切な設定を決定するには、次の計算を使用します。
次の記事で説明するフォーマットを使用して、ユーザーの Kerberos トークンのサイズを計算します。
ユーザーが多数のグループに属している場合の Kerberos 認証の問題サーバー上の
MaxFieldLength
とMaxRequestBytes
の値を 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 認証の問題」を参照してください。