Upgrade to Pro — share decks privately, control downloads, hide ads and more …

NGINXENG JP#2 - 3-NGINX Plus・プロダクトのアップデート

hiropo20
January 26, 2023

NGINXENG JP#2 - 3-NGINX Plus・プロダクトのアップデート

■NGINX-エンジニアリング勉強会#2
https://nginx-eng.connpass.com/event/270365/

その他のイベント資料や動画などイベントページをご覧ください。

hiropo20

January 26, 2023
Tweet

More Decks by hiropo20

Other Decks in Technology

Transcript

  1. ©2022 F5 2 NGINXとは HTTPS/gRPC App TCP/UDP SMTP HTML File

    WEBサーバ / Path Routing / キャッシュ / 通信の細かな制御により、 高速 安定 高機能 高機能なReverse Proxy / キャッシュサーバ Load Balancing / API Gateway として利用可能 アップデート内容を ご紹介いたします
  2. ©2022 F5 4 NGINXが提供するソフトウェア NGINX Plus NGINX OSSをベースに、さらなるエンタープライズユースに対応したソフトウェア (分散・冗長性・JWT制御・API制御 に加え、各種セキュリティモジュールの利用が可能)

    NGINX Management Suite NGINX統合管理ソフトウェア。NGINX PlusによるAPI管理 NGINX Instance Manager NGINX OSS、NGINX Plusの統合管理。ヒストリカルなAPM機能、コンフィグ・証明書管理、 管理対象のNGINX OSS / NGINX Plusに対するAPI制御機能を提供 NGINX App Protect WAF F5が提供する、ミッションクリティカル環境に最適な高速な高品質なWAF NGINX App Protect DoS 従来のツールでは検知できないレイヤー7のDoS脅威から高度な保護を提供 NGINX Ingress Controller Kubernetes環境での高度な通信制御を提供。NGINX機能をIngressリソースを通じて管理可能。 NGINX Service Mesh NGINX Plusによるコンテナ間の制御を提供するシンプルなサービスメッシュソリューション NGINX for Azure NGINX PlusをAzureからSaaS環境として提供、コンフィグを貼り付けるだけで活用が可能 All-In-One SW Overview NGINX OSS Dev/Opsに最適な、超軽量・高速・多機能なAll-In-One Software NGINX Unit 動的かつ分散アプリケーション環境向けに設計されたアプリケーションサーバ NJS (NGINX JavaScript) NGINXの機能を拡張するJavaScript言語のサブセットモジュール NJS Open Source Security Container SaaS
  3. ©2022 F5 5 主要NGINXソフトウェアの構成イメージ App Proxy Client App NJS オンプレミス

    クラウド・コンテナ K8S(コンテナ・NIC) NGINX OSS 環境 App HTTP gRPC etc TCP/ UDP NGINX Plus App オンプレミス クラウド・コンテナ K8S(コンテナ・NIC) App WAF DOS NJS HTTP gRPC etc TCP/ UDP NGINX Unit App オンプレミス クラウド・コンテナ K8S(コンテナ) JS Ruby Go Java Perl PHP Python HTTP NGINX Ingress Controller Pod K8S(NIC) Pod WAF DOS NJS HTTP SMTP etc TCP/ UDP NGINX Service Mesh K8S(NSM) C HTTP gRPC TCP/ UDP Container Container C JWT/OIDC/ActiveHC/ Cookie Persistence/ より詳細なMetrics/ メーカーSupport OSS
  4. ©2022 F5 7 NGINX OSS – リリースサイクル NGINX OSSは、mainline(奇数)とstable(偶数)の二種類に分かれます 毎年4月にmainlineからstableをforkします。以降のリリースVersionが新しい番号へ更新されます

    NGINX Plusは、NGINX OSSと別のレポジトリで管理されています。mainlineからforkされます NGINXはmainlineの利用を推奨しますが、更新頻度などの観点からstableの利用も可能です 1year 1year ここが「mainline」 頻繁な機能追加
  5. ©2022 F5 8 R26 R27 R28 NGINX Plusは、NGINXメインラインでテスト・実証された、すべてのOSS新機能を取り入れます。 NGINX Plusは、年3回バイナリパッケージがリリースされます。

    NGINX Plusは、エンタープライズ向けの追加機能と商用サポート(英語、日本語)が含まれています。 NGINX Plusは、リリースから2年間サポートされます。 NGINX Plus – リリースサイクル https://docs.nginx.com/nginx/releases/ N+は「mainline」を Mergeしている 1.21.5 1.21.6 1.23.2
  6. ©2022 F5 10 NGINX Plus リリース情報 https://docs.nginx.com/nginx/releases/ https://www.nginx.co.jp/blog/nginx-plus-r28-released/ https://www.nginx.com/blog/nginx-plus-r28-released/ 日本語翻訳

    少し時間を開けて日本語 Verが公開されます NGINX Plus リリース紹介Blog NGINX Plus リリースノート ご紹介スライドもご用意してますので気になる リリースがあればお気軽にご連絡ください
  7. ©2022 F5 12 NGINX OSS / Plus – リリースサイクル https://docs.nginx.com/nginx/releases/

    1.21.3 1.21.5 R25 R26 1.19.10 R24 2021/4/28 9/28 2022/2/15 2021/4/20 2022/5/24 1.19.5 R23 1.19.10 R22 2020/6/9 12/8 1.23.2 R28 1.21.6 R27 2022/6/28 11/29 7/21 5/25 1.21.0 1.23.0 m m S S 1.17.10 1.19.10 1.21.6 1.22.0 1.20.0 5/26 1.19.0 2020/4/21 1.18.0 S m fork fork fork
  8. ©2022 F5 13 NGINX OSS / Plus リリース:R22 https://www.nginx.com/blog/nginx-plus-r22-released/ 1.21.3

    1.21.5 R25 R26 1.19.10 R24 2021/4/28 9/28 2022/2/15 2021/4/20 2022/5/24 1.19.5 R23 12/8 1.23.2 R28 1.21.6 R27 2022/6/28 11/29 7/21 5/25 1.21.0 1.23.0 m m S S 1.17.10 1.19.10 1.21.6 1.22.0 1.20.0 5/26 1.19.0 2020/4/21 1.18.0 S m fork fork fork 1.19.10 R22 2020/6/9 • クライアント証明書認証の強化 • OCSP対応の追加 • NGINX JavaScriptモジュールの強化 • バグ修正とJavaScriptモジュールのイン ポートやヘッダーオブジェクトのアクセス が追加されました • 複数IdPに対するOpenID Connectのサポート • OCSP対応の追加 • NGINX Plus ダッシュボードの強化 • リクエストとコネクション制限のチャート • OIDCアクティビティに関するメトリクス • Support Platform • Alpine Linux 3.9, 3.10, 3.11 • Amazon Linux (2018.03+), Amazon Linux 2 LTS • CentOS 6.5+, 7.4+, 8.0+ • Debian 9, 10 • FreeBSD 11.3+, 12.1+ • Oracle Linux 6.5+, 7.4+ • RHEL 6.5+, 7.4+, 8.0+ • SUSE Linux Enterprise Server 12, 15 • Ubuntu 16.04 LTS, 18.04 LTS, 19.10, 20.04 LTS • Support 終了 • Alpine Linux 3.8
  9. ©2022 F5 14 NGINX OSS / Plus リリース:R23 https://www.nginx.co.jp/blog/nginx-plus-r23-released/ 1.21.3

    1.21.5 R25 R26 1.19.10 R24 2021/4/28 9/28 2022/2/15 2021/4/20 2022/5/24 1.19.10 R22 2020/6/9 1.23.2 R28 1.21.6 R27 2022/6/28 11/29 7/21 5/25 1.21.0 1.23.0 m m S S 1.17.10 1.19.10 1.21.6 1.22.0 1.20.0 5/26 1.19.0 2020/4/21 1.18.0 S m fork fork fork 1.19.5 R23 12/8 • NGINX JavaScriptモジュールの強化 • バッファモジュールを追加 • クエリ文字列モジュールを追加 • gRPC アクティブヘルスチェックのサポート • 非特権インストールのサポート • 権限のない(non-root)ユーザーによるNGINX Plusのインストール方法を提供します • OpenID Connect PKCEのサポート • 動的モジュールの更新 • SPNEGOモジュールのサポート • Prometheus-njsで追加メトリクスを提供 • 新しいproxy_cookie_flagsディレクティブ追 加、set_cookie_flagモジュールの非対応化。 NGINX PlusR26で削除される予定です • その他、SSL Cipher追加、TLS機能追加、Cache 機能追加など • Support Platform • Alpine Linux 3.10, 3.11, 3.12 • Amazon Linux (2018.03+), Amazon Linux 2 LTS • CentOS 7.4+, 8.0+ • Debian 9, 10 (aarch64, x86_64) • FreeBSD 11.2+, 12.0+ • Oracle Linux 7.4+ • RHEL 7.4+, 8.0+ • SUSE Linux Enterprise Server 12, 15 • Ubuntu 16.04 LTS, 18.04 LTS, 20.04LTS (aarch64, x86_64) • Support 終了 • Alpine Linux 3.9 • CentOS/Oracle Linux/RHEL 6.5 • Ubuntu 19.10
  10. ©2022 F5 15 NGINX OSS / Plus リリース:R24 https://www.nginx.com/blog/nginx-plus-r24-released/ fork

    1.21.3 1.21.5 R25 R26 9/28 2022/2/15 2021/4/20 2022/5/24 1.19.5 R23 1.19.10 R22 2020/6/9 12/8 1.23.2 R28 1.21.6 R27 2022/6/28 11/29 7/21 5/25 1.21.0 1.23.0 m m S S 1.17.10 1.19.10 1.21.6 1.22.0 1.20.0 5/26 1.19.0 2020/4/21 1.18.0 S m fork fork 1.19.10 R24 2021/4/28 • NGINX JavaScriptモジュールの強化 • HTTPレスポンスのHeader/Bodyのフィルタ • 処理中に外部へHTTPリクエストを可能に • Encrypted JSON Web Token(JWE)のサポート • HTTP/2に関するディレクティブの統合 • HTTP/1.1, HTTP/2のコネクション管理の効率化 • ヘルスチェックステータスのログレベル変更 • NGINX Plusで利用するリポジトリの変更 • plus-pkgs.nginx.com -> pkgs.nginx.com/plus • Support Platform • Alpine Linux 3.10, 3.11, 3.12, 3.13 • Amazon Linux (2018.03+), Amazon Linux 2 LTS • CentOS 7.4+, 8.0+ (aarch64, x86_64, ppc64le) • Debian 10 (aarch64, x86_64) • FreeBSD 11.2+, 12.0+, 13(amd64) • Oracle Linux 7.4+ • RHEL 7.4+, 8.0+ • SUSE Linux Enterprise Server 12, 15 SP2 • Ubuntu 16.04 LTS, 18.04 LTS, 20.04LTS (aarch64, x86_64) • Support 終了 • Debian 9
  11. ©2022 F5 16 NGINX OSS / Plus リリース:R25 https://www.nginx.co.jp/blog/nginx-plus-r25-released/ 1.21.5

    R26 1.19.10 R24 2021/4/28 2022/2/15 2021/4/20 2022/5/24 1.19.5 R23 1.19.10 R22 2020/6/9 12/8 1.23.2 R28 1.21.6 R27 2022/6/28 11/29 7/21 5/25 1.21.0 1.23.0 m m S S 1.17.10 1.19.10 1.21.6 1.22.0 1.20.0 5/26 1.19.0 2020/4/21 1.18.0 S m fork fork fork 1.21.3 R25 9/28 • NGINX JavaScirptモジュールの機能強化 • JavaScriptES6との互換性を強化 • Encrypted JSON Web Token(JWE)の拡張 • NGINX Plus REST APIで取得できるステータスの 追加 • 2xx,4xx,5xx の詳細なステータスをカウント • アップストリーム用 共有メモリゾーン使用容量 の増加 • Proxy用の動的SSL/TLSクライアント証明書のサ ポート • HTTPリクエスト処理のセキュリティ強化 • TCP/UDP(stream)のHealtch Check持続性を拡張 • Cookie-Flagモジュールの廃止 • Support Platform • Alpine Linux 3.11, 3.12, 3.13, 3.14 • Amazon Linux 2 LTS • CentOS 7.4+, 8.0+ (aarch64, x86_64, ppc64le) • Debian 10, 11 (aarch64, x86_64) • FreeBSD 12.1+, 13(amd64) • Oracle Linux 7.4+ • RHEL 7.4+, 8.0+ • SUSE Linux Enterprise Server 12, 15 SP2 • Ubuntu 18.04 LTS, 20.04LTS (aarch64, x86_64) • Support 終了 • Alpine Linux 3.10 • Amazon Linux (2018.03+) • FreeBSD 11.4+ • Ubuntu 16.04 LTS
  12. ©2022 F5 17 NGINX OSS / Plus リリース:R26 https://www.nginx.co.jp/blog/nginx-plus-r26-released/ 1.21.3

    R25 1.19.10 R24 2021/4/28 9/28 2021/4/20 2022/5/24 1.19.5 R23 1.19.10 R22 2020/6/9 12/8 1.23.2 R28 1.21.6 R27 2022/6/28 11/29 7/21 5/25 1.21.0 1.23.0 m m S S 1.17.10 1.19.10 1.21.6 1.22.0 1.20.0 5/26 1.19.0 2020/4/21 1.18.0 S m fork fork fork 1.21.5 R26 2022/2/15 • TLSハンドシェイクの強化 • StreamのALPNに関する制御の提供 • TLSネゴシエーション NPNのサポート終了 • NGINX JavaScriptモジュールの強化 • async, awaitキーワード, Promiseオブジェク トサポート, WebCrypto APIによる新しい暗 号機能の追加 • StreamモジュールでのTCP Half Closeサポート • Perl正規表現モジュールPCRE2に対応 • JSON KeyキャッシングによるJWT検証の高速化 • JSON Web Key Set (JWKS)をメモリにキャッ シュし、検証を高速化 • IBM Z (s390x) アーキテクチャーのサポート • CentOS 8.1 +、RHEL8.1、Ubuntu 20.04を搭載 したIBM Z(s390x)アーキテクチャをサポート • Support Platform • Alpine Linux 3.12, 3.13, 3.14, 3.15 • Amazon Linux 2 LTS • CentOS 7.4+, 8.1+ (aarch64, x86_64, ppc64le, s390x) • Debian 10, 11 (aarch64, x86_64) • FreeBSD 12.1+, 13(amd64) • Oracle Linux 7.4+ • RHEL 7.4+, 8.1+ • SUSE Linux Enterprise Server 12, 15 SP2 • Ubuntu 18.04 LTS, 20.04LTS (aarch64, x86_64, s390x) • Support 終了 • Alpine Linux 3.11
  13. ©2022 F5 18 NGINX OSS / Plus リリース:R27 https://www.nginx.co.jp/blog/nginx-plus-r27-released/ 1.21.3

    1.21.5 R25 R26 1.19.10 R24 2021/4/28 9/28 2022/2/15 2021/4/20 2022/5/24 1.19.5 R23 1.19.10 R22 2020/6/9 12/8 1.23.2 R28 11/29 7/21 5/25 1.21.0 1.23.0 m m S S 1.17.10 1.19.10 1.21.6 1.22.0 1.20.0 5/26 1.19.0 2020/4/21 1.18.0 S m fork fork fork 1.21.6 R27 2022/6/28 • Kernel TLS 対応 • Active Health Check用のKeepAliveコネクション • NGINX Plus REST API version 8 - SSL統計情報の強化 • JWT検証時のerrorコードカスタマイズ • Prometheus-njs-moduleの強化 • Support Platform • Alpine Linux 3.13, 3.14, 3.15, 3.16 • Amazon Linux 2 LTS • CentOS 7.4+ (aarch64, x86_64) • Debian 10, 11 (aarch64, x86_64) • FreeBSD 12.1+, 13 (amd64) • Oracle Linux 7.4+, 8.1+ (x86_64, aarch64) • RHEL 7.4+, 8.1+, 9.0+ (aarch64, x86_64, s390x) • SUSE Linux Enterprise Server 12, 15 SP2 • Ubuntu 18.04 LTS, 20.04 LTS, 22.04 LTS (aarch64, x86_64, s390x) • Support 終了 • Alpine Linux 3.12 • CentOS 8 • Power 8アーキテクチャ • Debian 10は次期バージョンでサポート終 了予定
  14. ©2022 F5 19 NGINX OSS / Plus リリース:R28 https://www.nginx.co.jp/blog/nginx-plus-r28-released/ 1.21.3

    1.21.5 R25 R26 1.19.10 R24 2021/4/28 9/28 2022/2/15 2021/4/20 2022/5/24 1.19.5 R23 1.19.10 R22 2020/6/9 12/8 1.21.6 R27 2022/6/28 7/21 5/25 1.21.0 1.23.0 m m S S 1.17.10 1.19.10 1.21.6 1.22.0 1.20.0 5/26 1.19.0 2020/4/21 1.18.0 S m fork fork fork • NGINX Plus 追加のTLSメトリクス • PROXY プロトコル v2 TLVのサポート • Stickey Cookie パラメータ追加 • SameStite属性をCookieへ追加可能に • NGINX Plus サポートOSの追加 • AlmaLinux / Rockey Linux 8 および 9上で NGINX Plusが利用可能に 1.23.2 R28 11/29 • Support Platform • AlmaLinux 8, 9 • Alpine Linux 3.13, 3.14, 3.15, 3.16, 3.17 • Amazon Linux 2 LTS • CentOS 7.4+ • Debian 11 • FreeBSD 12.1+, 13 (amd64) • Oracle Linux 7.4+, 8.1+, 9.0+ • RHEL 7.4+, 8.1+, 9.0+ • Rocky Linux 8, 9 • SUSE Linux Enterprise Server 12, 15 SP2 • Ubuntu 18.04 LTS, 20.04 LTS, 22.04 LTS • Support 終了 • Debian 10 • NGINX JavaScriptモジュールの強化 • 0.7.5 から 0.7.8 で行われた変更の反映 • その他、NGINX OSSの機能変更 • ssl_session_cacheディレクティブの共有 キャッシュで、TLS セッションチケットの キーが自動的にローテートされる • いくつかのTLS/SSLエラーを、critからinfoに 引き下げ
  15. NGINX Plus Release 26 (R26) NGINX open source build 1.21.5

    2022/2/15 F5ネットワークスジャパン合同会社
  16. ©2022 F5 22 NGINX Plus R26 の新機能 JSON KeyキャッシングによるJWT検証の高速化 •

    JSON Web Key Set (JWKS)のインメモリキャッシュを導入, JWT検証のオーバーヘッドを大幅に削減. NGINX JavaScriptモジュールの機能強化 • async, awaitキーワード, Promiseオブジェクトサポート, WebCrypto APIによる新しい暗号機能の追加. https://www.nginx.com/blog/nginx-plus-r26-released/ TLSハンドシェイクの強化 • Stream用のALPNサポートが強化されました.
  17. ©2022 F5 23 NGINX Plus R26 の変更点 https://www.nginx.com/blog/nginx-plus-r26-released/ NGINX JavaScpriptモジュール変更点

    • js_include が削除され js_import に置き換わりました. Cookie-Flagモジュールについて • サードパーティのCookie-FlagモジュールはNGINX Plus R23で非推奨となり、 NGINX Plus R26の動的モジュールのリポジトリから削除されました. set_cookie_flag は proxy_cookie_flags に置き換えが可能です. TLSネゴシエーション NPNプロトコルのサポート終了 • TLS及びHTTP/2接続確立にはRFC 7301 Application Layer Protocol Negotiation (ALPN) の利用を推奨します.
  18. ©2022 F5 24 NGINX Plus R26 の変更点 https://www.nginx.com/blog/nginx-plus-r26-released/ NGINX Plusソフトウェアリポジトリについて

    • R24リリース時にリポジトリが再編成され NGINX Plusインストール手順が変更されました. plus-pkgs.nginx.com から pkgs.nginx.com を参照する必要があります. • 参考URL: https://support.f5.com/csp/article/K01118005
  19. ©2022 F5 25 NGINX Plus R26 のその他 機能強化 https://www.nginx.com/blog/nginx-plus-r26-released/ IBM

    Z (s390x) アーキテクチャーのサポート • CentOS 8.1 +、RHEL8.1、Ubuntu 20.04を搭載したIBM Z(s390x)アーキテクチャでNGINX Plusをサポート StreamモジュールでのTCP Half Closeサポート • 新しいproxy_half_closeディレクティブにより利用可能 PCRE2ライブラリのサポート • Perl互換正規表現 PCREとPCRE2を両方サポートするようになりました
  20. ©2022 F5 26 NGINX Plus R26 でのサポートシステムの変更 • サポートシステム •

    Alpine Linux 3.12, 3.13, 3.14, 3.15 • Amazon Linux 2 LTS • CentOS 7.4+, 8.1+ (aarch64, x86_64, ppc64le, s390x) • Debian 10, 11 (aarch64, x86_64) • FreeBSD 12.1+, 13(amd64) • Oracle Linux 7.4+ • RHEL 7.4+, 8.1+ • SUSE Linux Enterprise Server 12, 15 SP2 • Ubuntu 18.04 LTS, 20.04LTS (aarch64, x86_64, s390x) • サポート終了 • Alpine Linux 3.11
  21. ©2022 F5 27 JSON Key キャッシングによる高速なJWT検証 • JSON Web Tokenを検証する場合、NGINXは

    JSON Web Key Set (JWKS)を使用してTokenの署名を 検証や復号化します。JWKSは、構成ファイルに保存やHTTPリクエストを介して外部サービスから 取得することも可能です。JWKSをメモリにキャッシュするといくつかの利点があります。 http { server { listen 127.0.0.1:8080; auth_jwt "closed site"; auth_jwt_key_cache 12h; auth_jwt_key_file conf.d/jwk.json; location / { proxy_pass http://my_backend; } } } • CPU使用率の大幅な削減 • リクエスト待ち時間の短縮 • キャッシュ処理の一環として JWKSキーがJSON形式からバイナリ形式に変換しJWT検証の最適化 JWKSをメモリにキャッシュするには、auth_jwt_key_cache ディレクティブで有効期限を指定します。
  22. ©2022 F5 28 JSON Key キャッシングによる高速なJWT検証 • JWKSを外部サーバーから取得する場合には、NGINX標準のコンテンツキャッシュ機能を利用すること 推奨します。proxy_cache_use_stale ディレクティブはJWKSリフレッシュ中に期限切れのJWKSを引き

    続き利用するようNGINX Plusに指示することができます。 http { proxy_cache_path /var/cache/nginx/jwk levels=1 keys_zone=jwk:64k max_size=1m; server { listen 127.0.0.1:8080; auth_jwt "closed site"; auth_jwt_key_cache 3h; auth_jwt_key_request /_jwks_uri; location / { proxy_pass http://my_backend; } location = /_jwks_uri { internal; proxy_cache jwk; # Cache the JWK Set recieved from IdP proxy_cache_valid 200 12h; # How long to consider keys "fresh" proxy_cache_use_stale error timeout updating; # Use old JWK Set if cannot reach IdP proxy_ssl_server_name on; # For SNI to the IdP proxy_method GET; # In case client request was non-GET proxy_set_header Content-Length ""; # '' proxy_pass https://idp-jwk-endpoint; proxy_ignore_headers Cache-Control Expires Set-Cookie; # Does not influence caching } } }
  23. ©2022 F5 29 JSON Key キャッシングによる高速なJWT検証 • JWKSキャッシングに加えてコンテンツキャッシング利用の利点は2つあります。 • 復元力

    JWKSは有効期限が切れている場合でもキャッシュから取得できます。 これにより、JWKSプロバイダーが利用できなくなった場合にも活用できますが セキュリティリスクが高まるというトレードオフがあります。 • 認証サーバーへの影響 キャッシュされたJWKSの有効期限は、JWKSキャッシングとコンテンツキャッシングを組み合わせるか によって認証サーバーに異なる影響を与えます。 JWKSキャッシュグのみの場合、期限切れのJWKSの新しいバージョンがキャッシュされるまで 全ての認証リクエストが認証サーバーに転送されます。認証サーバーの応答が遅いJWKSに対して HTTPリクエストが増加しますので認証サービスの負荷を上げる可能性があります。 コンテンツキャッシュが有効になっている場合、JWKSに対する1つのリクエストが認証サーバに 転送され、コンテンツキャッシュに保存されるまで後続のリクエストはキューに入れられます。 これにより認証サービスの負荷が低下します。
  24. ©2022 F5 30 JSON Key キャッシングによる高速なJWT検証 • JWKSキャッシングに加えてコンテンツキャッシング利用の利点は2つあります。 • 復元力

    JWKSは有効期限が切れている場合でもキャッシュから取得できます。 これにより、JWKSプロバイダーが利用できなくなった場合にも活用できますが セキュリティリスクが高まるというトレードオフがあります。 • 認証サーバーへの影響 キャッシュされたJWKSの有効期限は、JWKSキャッシングとコンテンツキャッシングを組み合わせるか によって認証サーバーに異なる影響を与えます。 JWKSキャッシュグのみの場合、期限切れのJWKSの新しいバージョンがキャッシュされるまで 全ての認証リクエストが認証サーバーに転送されます。認証サーバーの応答が遅いJWKSに対して HTTPリクエストが増加しますので認証サービスの負荷を上げる可能性があります。 コンテンツキャッシュが有効になっている場合、JWKSに対する1つのリクエストが認証サーバに 転送され、コンテンツキャッシュに保存されるまで後続のリクエストはキューに入れられます。 これにより認証サービスの負荷が低下します。
  25. ©2022 F5 31 強化されたTLSハンドシェイク • ALPACA攻撃などのTLSに対する攻撃が増加しています。脆弱性から積極的に防御する取り組みとして NGINXよるTLS接続の処理を強化しました。 • Application Layer

    Protocol Negotiation (ALPN) は、TLSハンドシェイクのオプションの拡張機能であり TLSハンドシェイク中にクライアントとサーバーが確立する暗号化セッションで利用されるL7プロトコル を選択するために使用されます。ALPNの最も一般的な使用例は、HTTP/1.xからHTTP/2へアップグレード ネゴシエーションをすることです。
  26. ©2022 F5 32 強化されたTLSハンドシェイク • NGINX Plusは、クライアントと確立されているセッションのNGINXコンフィグコンテキストと 一致しないプロトコルをALPN経由で提案があった場合、TLSハンドシェイクを拒否するようになりました。 例えば、NGINX httpコンテキストで定義されたバーチャルサーバーにはHTTP

    ALPNプロトコルIDが 必要となり、mailコンテキストの場合にはSMTP、POP、IMAPのプロトコルIDが必要となります。 • NGINX Plus R26の $ssl_alpn_protocol で、ネゴシエートされたプロトコルをキャプチャするための 変数が同導入されています。 このコンフィグでは、アクセスログエントリにALPN変数を含めることが可能です。 log_format alpn '$time_iso8601 client=$remote_addr method=$request_method ' 'uri=$request_uri status=$status alpn=$ssl_alpn_protocol'; server { listen 443 ssl http2; ssl_certificate /etc/ssl/www.example.com.crt; ssl_certificate_key /etc/ssl/www.example.com.key; root /usr/share/nginx/html; access_log /var/log/nginx/access.log alpn; }
  27. ©2022 F5 33 強化されたTLSハンドシェイク • コンテキスト内の新しい ssl_alpn ディレクティブはNGINX Plusが受け入れるプロトコルを定義します。 新しいクライアントによって提示されたプロトコルをNGINX

    Plusが考慮するようになります。 stream { upstream filer { server 10.0.0.100:990; server 10.0.0.110:990; } server { listen 990 ssl; ssl_certificate /usr/local/nginx/conf/cert.pem; ssl_certificate_key /usr/local/nginx/conf/cert.key; proxy_pass filer; ssl_alpn ftp; # Accept only ALPN/FTP connections } }
  28. ©2022 F5 34 NGINX JavaScriptモジュールの強化 NGINX JavaScriptモジュール(njs)がバージョン0.7.2に更新され、機能拡張が行われました • ECMA Script

    6で導入された async と await キーワードと Promise オブジェクトの非同期関数サポート • WebCrypto APIの実装 WebCryptoAPIを使用した新しい暗号化関数 • NGINX JavaScriptは、WebCryptoAPIを介して拡張暗号化機能にアクセスできるようになりました。 一般的なNGINX Java Script暗号化のユースケースは次の通りです。 • 安全なセッションIDの乱数生成 • メッセージ、データ、及びCookieの暗号化と復号化 • デジタル署名の作成または検証
  29. ©2022 F5 35 NGINX JavaScriptモジュールの強化 require('crypto'); function random(r) { const

    buffer = crypto.getRandomValues(new Uint32Array(8)); return r.return(200, buffer.toString()); } export default { random } js_import conf.d/random_number.js; server { listen 80; location / { js_content random_number.random; } } NGINXからの呼び出し $ curl 127.0.0.1 23225320050,3668407277,1101267190,2061939102,2687933029,2361833213,32543985,4162087386 出力結果 WebCryptoの getRandomValues関数は安全な乱数とWebCrypto全般を使い始めるための エントリーポイントです。関数は非常にシンプルで直接結果を返します。
  30. ©2022 F5 36 NGINX JavaScriptモジュールの強化 async function host_hash(r) { let

    hash = await crypto.subtle.digest('SHA-512', r.headersIn.host); r.setReturnValue(Buffer.from(hash).toString('hex')); } export default { host_hash } js_import host from conf.d/host.js; js_set $hosthash host.host_hash; server { listen 80; location / { return 200 $hosthash; } } より強力な暗号化関数は非同期で動作するものがあります。crypto.subtle.diges関数を呼び出すと、 非同期関数でラップされない限り利用可能であることは保証されません。 ayncと awaitキーワードを使用して関数をラップしハッシュ変数に結果が格納されるようにします。 NGINXからの呼び出し curl -H "Host: example.com" 127.1 # e8e624a82179b53b78364ae14d14d63dfeccd843b026bc8d959ffe0c39fc4ded1f4dcf4c8ebe871e657a12db6f11c 3af87c9a1d4f2b096ba3deb56596f06b6f4 出力結果
  31. NGINX Plus Release 27 (R27) NGINX open source build 1.21.6

    2022/06/28 F5ネットワークスジャパン合同会社
  32. ©2022 F5 38 NGINX Plus R27 の新機能 Active Health Check用のKeepAliveコネクション

    • Upstreamサーバの数が多い場合に接続を再利用することでCPU利用率を大幅に削減できます. NGINX Plus REST API version 8 - SSL統計情報の強化 • HTTP/Stream Upstreamとserver zoneで情報を取得できるようになりました. https://www.nginx.com/blog/nginx-plus-r27-released/ Kernel TLS 対応 • FreeBSD 13, RHEL 9.0+, Ubuntu 22.04 LTSでkTLSをサポート
  33. ©2022 F5 39 NGINX Plus R27 の新機能 JWT検証時のerrorコードカスタマイズ • auth_jwt_requireディレクティブにerrorパラメータを追加.

    https://www.nginx.com/blog/nginx-plus-r27-released/ Prometheus-njs-moduleの強化 • NGINX Plus REST API version 7をサポート • upstream/server/location zoneのHTTPステータスコード • /stream/limit_conns, /http/limit_conns/, /http/limit_req/ データ対応
  34. ©2022 F5 40 NGINX Plus R27 でのサポートシステムの変更 • サポートシステム •

    Alpine Linux 3.13, 3.14, 3.15, 3.16 • Amazon Linux 2 LTS • CentOS 7.4+ (aarch64, x86_64) • Debian 10, 11 (aarch64, x86_64) • FreeBSD 12.1+, 13 (amd64) • Oracle Linux 7.4+, 8.1+ (x86_64, aarch64) • RHEL 7.4+, 8.1+, 9.0+ (aarch64, x86_64, s390x) • SUSE Linux Enterprise Server 12, 15 SP2 • Ubuntu 18.04 LTS, 20.04 LTS, 22.04 LTS (aarch64, x86_64, s390x) • サポート終了 • Alpine Linux 3.12 • CentOS 8 • Power 8アーキテクチャ • Debian 10は次期バージョンでサポート終了予定 https://docs.nginx.com/nginx/technical-specs/
  35. ©2022 F5 41 Active Health Check用のKeepAliveコネクション • 以前までのリリースではAcitve Health Checkにて都度接続を行っておりリソースに負担をかける

    可能性があります. Active Health Check用のアップストリームサーバー間のKeepAlive接続により、 リバースプロキシと負荷分散のユースケースのパフォーマンスが大幅に向上します. http { upstream backend { zone backend 1m; server 10.0.0.1; server 10.0.0.2; } server { location / { proxy_http_version 1.1; proxy_set_header Connection ""; proxy_pass https://backend; health_check keepalive_time=60s interval=1s; } } } • HTTPS経由のプロキシの場合には大幅にCPU負荷削減 • health_checkディレクティブに keepalive_time を追加することで有効
  36. ©2022 F5 42 Kernel TLSのサポート • Kernel TLS(kTLS)を実装すると、ユーザースペースとカーネル間のコピー操作 の必要性が大幅に減少するため、静的コンテンツを提供する際のパフォーマン スが向上します。

    • FreeBSD13, Ubuntu 22.04, RHEL 9+でサポート • OpenSSL 3.0+暗号化ライブラリを利用 • NGINX PlusはOpenSSL 3.0+ライブラリに対応 http { sendfile on; server { listen 443 ssl; ssl_certificate ssl/example.crt; ssl_certificate_key ssl/example.key; ssl_conf_command Options KTLS; ssl_protocols TLSv1.3; location / { root /data; } } }
  37. ©2022 F5 43 SSL統計情報の強化 - NGINX Plus REST API NGINX

    Plusがリバースプロキシまたはロードバランサーとしてデプロイされると、NGINX Plus APIは 各Upstream SeverとVirtual Serverのトラフィック、応答コード、及び遅延に関する豊富なメトリック セットを提供し、顧客がサーバーのパフォーマンスの可視化とモニタリングをできるようにします。 /api/8/http/upstreams/upstream1/servers/0 { "peers": [ { "id": 0, "server": "127.0.0.1:8081", "name": "127.0.0.1:8081", "backup": false, "weight": 1, "state": "up", "active": 0, "ssl": { "handshakes": 4, "handshakes_failed": 0, "session_reuses": 2 }, "requests": 4, "header_time": 4, "response_time": 4, ... } ] } /api/8/http/server_zones/srv | jq { "processing": 0, "requests": 7, "responses": { "1xx": 0, "2xx": 7, "3xx": 0, "4xx": 0, "5xx": 0, "codes": { "200": 7 }, "total": 7 }, "discarded": 0, "received": 546, "sent": 1134, "ssl": { "handshakes": 7, "handshakes_failed": 0, "session_reuses": 0 } } Upstream Server Zone
  38. ©2022 F5 44 JWT検証時のerrorコードカスタマイズ location / { auth_jwt "closed site";

    auth_jst_key_file /path/to/jwks; auth_jwt_require $req1 $req2 error=403; # return 403 on failure } auth_jwt_requirディレクティブでJWT検証の失敗に対して返されるエラーコードは 常に401(Unauthorized)でした。errorパラメータを追加することで401または403に設定すること が可能になりました。 例えば認証失敗(JWTが無効)と認可失敗(必須クレームがない)を区別して伝えることができます。 エラーコードに対してカスタマイズされたページを返したりリダイレクト処理することも可能です。 locationに複数のauth_jwt_requireディレクティブがある場合、それらは記述された順番に評価されます。 処理は最初の失敗で停止し、指定されたエラーコードが返されます。
  39. ©2022 F5 45 NGINX JavaScript, Prometheus-njsモジュールの強化 NGINX Plus R27には、FetchAPIの動作を微調整するための次のディレクティブが導入されています。 •

    js_fetch_buffer_size – 読み取りと書き込みに使用されるバッファサイズを設定します。 • js_fetch_max_response_buffer_size – FetchAPIで受信する応答の最大サイズを設定します。 • js_fetch_timeout – 2つの連続する読み取りまたは書き込み操作間の読み取りと書き込みのタイムアウトを定義し ます(応答全体ではありません)。タイムアウト期間内にデータが送信されない場合、接続は閉じられます。 • js_fetch_verify - HTTPSサーバー証明書の検証を有効または無効にします。 16進数で出力されるバージョン番号 • 新しいnjs.version_numberオブジェクトは、njsモジュールのバージョンを16進数として出力します。 (既存のnjs.versionオブジェクトはバージョンを文字列として返します) Prometheus-njsモジュールが追加メトリクスに対応 • /http/limit_conns • /http/limit_reqs • /http/server_zones, /http/upstreams, HTTPステータスコード数を出力するフィールド • /stream/limit_conns
  40. ©2022 F5 46 NGINX Plus R27 のその他 機能強化 NGINXPlus APIのバージョン変更

    • バージョン番号が7から8に更新, 新しいSSL統計情報の強化が追加されています。 Linux EPOLLEXCLUSIVE モード • NGINX Plus R27 は、Linux カーネルで EPOLLEXCLUSIVE モードが使用されている場合 NGINX ワーカープロセス間でより均等に接続を分散します。
  41. NGINX Plus Release 28 (R28) NGINX open source build 1.23.2

    2022/11/29 F5ネットワークスジャパン合同会社
  42. ©2022 F5 48 NGINX Plus R28 の新機能 NGINX Plus 追加のTLSメトリクス

    • ハンドシェイクエラーや証明書検証の失敗が報告されるようになりました. NGINX Plus サポートOSの追加 • AlmaLinux / Rockey Linux 8 および 9上でNGINX Plusインストールしていただけます. https://www.nginx.com/blog/nginx-plus-r28-released/ PROXY プロトコル v2 TLVのサポート • AWS/GCP/Azureでのサービス固有識別子をバックエンドサービスに転送をサポート. Stickey Cookie パラメータ追加 • 値や変数でSameStite属性をCookieへ追加可能になりました.
  43. ©2022 F5 49 NGINX Plus R28 でのサポートシステムの変更 • サポートシステム •

    AlmaLinux 8, 9 • Alpine Linux 3.13, 3.14, 3.15, 3.16, 3.17 • Amazon Linux 2 LTS • CentOS 7.4+ • Debian 11 • FreeBSD 12.1+, 13 (amd64) • Oracle Linux 7.4+, 8.1+, 9.0+ • RHEL 7.4+, 8.1+, 9.0+ • Rocky Linux 8, 9 • SUSE Linux Enterprise Server 12, 15 SP2 • Ubuntu 18.04 LTS, 20.04 LTS, 22.04 LTS • サポート終了 • Debian 10 https://docs.nginx.com/nginx/technical-specs/
  44. ©2022 F5 50 NGINX Plus 追加のTLSメトリクス • NGINX Plus R28は,

    システム全体, クライアント側, およびサーバー側のレベルで追加のTLS 統計 を収集し, プロキシ構成の SSL/TLS 関連エラーのトラブルシューティングや, クライアントおよ びアップストリーム サーバーへの接続に重要なモニタリングを提供します.
  45. ©2022 F5 51 NGINX Plus 追加のTLSメトリクス • NGINX Plus R28は,

    システム全体, クライアント側, およびサーバー側のレベルで追加のTLS 統計 を収集し, プロキシ構成の SSL/TLS 関連エラーのトラブルシューティングや, クライアントおよ びアップストリーム サーバーへの接続に重要なモニタリングを提供します. $ curl 127.0.0.1:8080/api/8/ssl { "handshakes": 32, "session_reuses": 0, "handshakes_failed": 8, "no_common_protocol": 4, "no_common_cipher": 2, "handshake_timeout": 0, "peer_rejected_cert": 0, "verify_failures": { "no_cert": 0, "expired_cert": 2, "revoked_cert": 1, "hostname_mismatch": 2, "other": 1 } } /api/8/http/server_zones/s9 { ... "ssl": { "handshakes": 0, "session_reuses": 0, "handshakes_failed": 1, "no_common_protocol": 0, "no_common_cipher": 1, "handshake_timeout": 0, "peer_rejected_cert": 0, "verify_failures": { "no_cert": 0, "expired_cert": 0, "revoked_cert": 0, "other": 0 } } } /api/8/http/upstreams/u2 { "peers": [ { "id": 0, "server": "127.0.0.1:8082", "name": "127.0.0.1:8082", ... "ssl": { "handshakes": 1, "session_reuses": 0, "handshakes_failed": 0, "no_common_protocol": 0, "handshake_timeout": 0, "peer_rejected_cert": 0, "verify_failures": { "expired_cert": 1, "revoked_cert": 0, "hostname_mismatch": 0, "other": 0 }
  46. ©2022 F5 52 NGINX Plus 追加のTLSメトリクス • NGINX Plus R28は,

    システム全体, クライアント側, およびサーバー側のレベルで追加のTLS 統計 を収集し, プロキシ構成の SSL/TLS 関連エラーのトラブルシューティングや, クライアントおよ びアップストリーム サーバーへの接続に重要なモニタリングを提供します. • NGINX Plus のREST APIとライブアクティビティモニタリングダッシュボードが更新され 下記の新しい SSL セッション データが表示されます. − handshake_timeout – ハンドシェイク タイムアウトによるハンドシェイク失敗の数 − no_common_cipher – ハンドシェイクの当事者間で共通の暗号がないために失敗したハンドシェイクの数 (アップストリーム サーバーへの接続については適用されないため収集されません) − no_common_protocol – 当事者間に共通のプロトコルがないために失敗したハンドシェイクの数 − peer_rejected_cert – 相手がNGINX Plusによって提示された証明書を拒否し、適切な警告メッセージを提供したために失敗したハンドシェイクの数 − ssl_verify_client[ HTTP ][ Stream ] ディレクティブを使用したクライアントへの接続用 − プロトコル固有のディレクティブを使用したサーバーへの接続の場合: − grpc_ssl_verify − proxy_ssl_verify[ HTTP ][ STREAM ] − uwsgi_ssl_verify − expired_cert – ピアが期限切れの証明書を提示 − hostname_mismatch – サーバーの証明書がホスト名と一致しない (クライアントへの接続用に収集されない) − no_cert – クライアントは必要に応じて証明書を提供しませんでした (アップストリーム サーバーへの接続のために収集されませんでした) − revoked_cert – ピアが失効した証明書を提示 − other – 他の証明書検証の失敗に対する明示的なカウンター
  47. ©2022 F5 53 Cloud Private Services での PROXY Protocol v2

    TLV のサポート • アマゾン ウェブ サービス (AWS)、Google クラウド プラットフォーム (GCP)、および Microsoft Azure の 3 つの主要なクラウド プロバイダーは、それぞれ「プライベート サービス」を提供しており、外部クライ アントをインターネットに公開することなくサービスアクセスできるようにすることができます。 • 各サービスは、PROXY プロトコル v2 ヘッダーのType-Length-Value (TLV)ベクトルで表されるクライアント 識別子を使用します。サービス固有の識別子は次のとおりです。 • AWS プライベートリンク –PP2_SUBTYPE_AWS_VPCE_ID • GCP プライベート サービス コネクト –pscConnectionId • Microsoft Azure プライベート リンク –PP2_SUBTYPE_AZURE_PRIVATEENDPOINT_LINKID フィールド 長さ (オクテット) 説明 タイプ 1 PP2_TYPE_AWS( 0xEA) 長さ 2 値の長さ 値 1 PP2_SUBTYPE_AWS_VPCE_ID( 0x01) さまざま (値の長さから 1 を引いた 値) エンドポイントの ID AWS の PROXY プロトコル v2
  48. ©2022 F5 54 Cloud Private Services での PROXY Protocol v2

    TLV のサポート • アマゾン ウェブ サービス (AWS)、Google クラウド プラットフォーム (GCP)、および Microsoft Azure の 3 つの主要なクラウド プロバイダーは、それぞれ「プライベート サービス」を提供しており、外部クライ アントインターネットに公開することなくサービスアクセスできるようにすることができます。 map $proxy_protocol_tlv_aws_vpce_id $not_allowed_vpc_id { "12341234" 0; "12345678" 0; default 1; } server { listen 127.0.0.1:8080 proxy_protocol; location / { if ($not_allowed_vpc_id) { return 401; } add_header X-AWS-VPC-LINK-ID $proxy_protocol_tlv_aws_vpce_id; proxy_pass http://u; } } NGINX Plus R28は TLV をデコードし、エンドポイント ID を変数でバックエンド アプリケーションに $proxy_protocol_tlv_aws_vpce_id で渡します。
  49. ©2022 F5 55 Sticky Cookie samesite パラメータ 以前のNGINX Plus リリースでは、stickeyディレクティブのパラメータとして

    3 つの静的値 ( strict、lax、およびnone) を使用できました。NGINX Plus R28では セキュリティレベルの高さの指定を 値や変数して指定することができます。 http { map $http_user_agent $samesite { "user-agent-1" "lax"; "user-agent-2" ""; } upstream u { server 127.0.0.1:8081; sticky cookie sticky secure samesite=$samesite path=/test; } server { listen 127.0.0.1:8080; server_name localhost; location / { proxy_pass http://u; } } }
  50. ©2022 F5 56 NGINX Plus R28 のその他 機能強化 NGINX OSSから継承されたバグフィックスが含まれています

    • ipv4=off HTTPディレクティブの新しいパラメーターresolverは、IPv4アドレス検索を無効にします。 • sharedディレクティブのパラメーターを使用して HTTP セッション情報の共有キャッシュを有効にすると ssl_session_cache、TLS セッション チケット キーが自動的にローテーションされるようになりました。 • TLS/SSL エラーがログに記録される重大度レベルがcritからinfoに引き下げられました。 NGINX JavaScript Module • NGINX Plus R28には、NGINX JavaScript モジュール (njs) のバージョン 0.7.5 から 0.7.8 で行われた変更 と修正が組み込まれています。