Apigee Edge 4.53.01 での Nginx 1.26 の変更

Nginx 1.26 の変更の概要

Nginx 1.26 のリリースに伴い、セキュリティを強化し、HTTP 標準への準拠を確保するために、いくつかの重要な変更が導入されました。主な更新内容は次のとおりです。

ヘッダー名と値の空白文字の処理

セキュリティを強化するため、RFC 7230 への準拠が強化されました。特に、ヘッダー内の空白文字の処理に関する準拠が強化されています。これらの変更について詳しくは、付録をご覧ください。

Content-Length ヘッダーと Transfer-Encoding ヘッダーの処理

リクエスト スマグリング攻撃で使用される一般的な手法の 1 つに、Content-Length ヘッダーと Transfer-Encoding ヘッダーの両方を含む HTTP リクエストを送信する方法があります。Apigee Edge はこのような攻撃に対してすでに強化されていますが、Nginx は両方のヘッダーを含むリクエストを明示的にブロックするようになりました。このようなリクエストが送信されると、Nginx は 400 Bad Request エラーを返します。

サポートされている暗号

このリリースでは、ノースバウンド リクエストでサポートされる暗号のリストが変更される可能性があります。ルーターホストで OpenSSL がサポートする暗号を確認して、使用可能な暗号の最新リストを取得できます。

サポートされている鍵のサイズ

以前は、2,048 ビット未満の RSA 鍵、DSA 鍵、DH 鍵、および 224 ビット未満の ECC 鍵はデフォルトで受け入れられていました。ただし、この更新により、このような鍵は、ノースバウンド リクエストの双方向 TLS 接続と一方向 TLS 接続の両方で許可されなくなります。

付録

ヘッダー内の空白文字

主な変更点は次の 3 つです。

  1. 以前は許可されていた特定のヘッダー名が、Nginx 1.26 では許可されなくなりました。これらのヘッダーを含むリクエストは、400 Bad Request エラーになります。
  2. 以前は許可されていた特定のヘッダー値が、Nginx 1.26 では許可されなくなりました。これらのヘッダーを含むリクエストも 400 Bad Request エラーになります。
  3. 以前は Nginx で受け入れられていたものの、メッセージ プロセッサのダウンストリームで障害を引き起こしていた一部のヘッダーが、Nginx で直接拒否されるようになりました。これらのヘッダーは引き続き API の失敗につながりますが、HTTP 失敗メッセージは変更されます。

以下のセクションでは、許可されていないさまざまなヘッダー名とヘッダー値の例を示します。ここに挙げているものはあくまで例であり、あらゆるケースを網羅するものではありません。ヘッダーについては、RFC 7230 のガイドラインに準拠することをおすすめします。

ヘッダー名の変更

このセクションでは、Nginx 1.20.1 では許可されていたが、Nginx 1.26 では許可されなくなったさまざまなヘッダー名を示します。

シナリオ ヘッダー名の例
ヘッダー名の先頭、末尾、または間に制御文字がある { '\u0001'Header0, Value0 }
{ Header6'\u0002', Value6 }
{ Header'\u0005'4, Value4 }
ヘッダー名の先頭と末尾の空白文字 {"Header2 ", "Value2"}
{" Header3", "Value3"}
{" Header4 ", "Value4"}
ヘッダー名の先頭と末尾の HTAB {"\tHeader11", "Value11"}
{"Header12\t", "Value12"}
{"\tHeader13\t", "Value13"}
ヘッダー名に HTAB と WS の組み合わせが先頭または末尾にある {"\t Header24", "Value24"}
{" \tHeader25", "Value25"}
{"Header26 \t", "Value26"}
{"Header27\t ", "Value27"}
ヘッダー名の直後に WS または一連の WS が続く NewLine(\n) {"Header\n 57Mutiline", "Value57"}
{"Header\n 58Mutiline", "Value58"}
ヘッダー名の間に改行(\n)があり、その直後に HTAB または一連の HTAB が続く {"Header\n\t73", "Value73"}
{"Header\n\t\t74", "Value74"}
ヘッダー名の間に改行(\r)と改行(\n)があり、その直後に HTAB または一連の HTAB が続く {"Header\r\n\t69", "Value69"}
{"Header\r\n\t\t70", "Value70"}
ヘッダー名の直後に WS または一連の WS が続く改行(\r)改行(\n) {"Header\r\n 71", "Value71"}
{"Header\r\n 72", "Value72"}

ヘッダー値の変更

このセクションでは、Nginx 1.20.1 では許可されていたが、Nginx 1.26 では許可されていないさまざまなヘッダー値を示します。

シナリオ
HEADERVALUE の間に \r\n または \r\n と WS または HTAB の組み合わせが許可されています {"Header47", "Value47\r\n MultiLine"},
{"Header48", "Value48\r\n MultiLine"},
{"Header49b", "Value49b\r\n \r\nMultiLine"},
{"Header50", "Value50 \r\n MultiLine"},
{"Header51", "Value51\r\n\tMultiLine"},
{"Header52", "Value52\r\n\t\tMultiLine"},
{"Header53", "Value53\t\r\n\tMultiLine"}
HEADERVALUE の間に \n または \n と WS または HTAB の組み合わせが許可されます {"Header61", "Value\n 61Multiline"},
{"Header62", "Value\n 63Multiline"},
{"Header65", "Value\n\t65"},
{"Header66", "Value\n\t\t66"},
{"Header67", "Value\n 67"},
{"Header68", "Value\n 68"}

HTTP 失敗レスポンスの変更

このセクションでは、以前の Nginx では許可されていたが、アップストリームの Message Processor では拒否され、400 ステータス コードが返されたヘッダーについて説明します。ただし、Nginx 1.26 では、このようなヘッダーは Nginx で直接エラーを引き起こし、リクエストが Message Processor に転送されなくなります。

このようなヘッダーを送信するクライアントの場合、HTTP ステータス コードは 400 のままになります。ただし、エラーがメッセージ プロセッサではなく Nginx によって生成されるため、HTTP レスポンスの本文が変更される可能性があります。

シナリオ
HEADERNAME の間に HTAB または WS がある

Message Processor はこのようなリクエストを拒否します。Nginx 1.26 では、これらのリクエストは Nginx 自体によって拒否されます。API コンシューマーは、本文に Nginx エラー メッセージを含む 400 エラー レスポンスを受け取ります。

{"Header 5", "Value5"},
{"Header\t14", "Value14"},
{"Header\t 32", "Value32"},
{"Header \t33", "Value33"},
{"Header- 36", "Value36"},
{"Header-\t40", "Value40"},
{"Header 4a", "Value4a"},
{"Header\t 59", "Value59"},
{"Header\t 60", "Value60"}