Skip to content

v0.8.0

Choose a tag to compare

@aofusa aofusa released this 20 Oct 00:40
· 320 commits to main since this release

Veil v0.8.0 リリースノート — API サーバライブラリ・サービスメッシュ・動的設定

Veil v0.8.0 は、「veil を組み込む API サーバライブラリ(Rust・C・Python)」・「Istio / Linkerd のメッシュのプロキシの置き換え」・「制御プレーンからの動的設定(VDS)と ACME」 の 3 本柱のリリースです。

あわせて、待ち受け設定を listen / listen_cleartext の 2 つに整理しました(旧キーは起動エラーになります。アップグレード手順)。公開の前に、攻撃面ごとのセキュリティ監査で見つかった要求の密輸・ルート制限の素通り・本文の上限漏れを直しました。リリース前には 6 OS・2 アーキテクチャのすべてで単体・統合・E2E・ライブラリの試験と性能の計測を回し直しています。


目次

  1. API サーバライブラリ(Rust・C・Python)
  2. サービスメッシュのデータプレーン(Istio・Linkerd)
  3. 動的設定・証明書・コンテナ運用
  4. セキュリティ監査と主な不具合修正
  5. 性能(v0.8.0)
  6. 既知の制限事項・運用上の注意点
  7. アップグレード手順
  8. 公開先と配布物

主なハイライト

+--------------------------------------------------------------------------------------------------+
|                                            Veil v0.8.0                                           |
+--------------------------------------------------------------------------------------------------+
|  1. API サーバライブラリ: #[veil::route]・OpenAPI・gRPC・L4 ハンドラ、C API、Python(veil-api) |
|     ネイティブハンドラは tokio 上の axum と同等、Python は FastAPI の 2.1〜2.5 倍               |
|  2. Istio のサイドカー / ゲートウェイ / waypoint と Linkerd のプロキシを veil で置き換え       |
|     Istio のサイドカーで最大 rps 2.1 倍・要求あたりの CPU 0.41 倍(本家 Envoy 比)            |
|  3. VDS(gRPC 双方向ストリーム / REST、ACK・NACK・冗長化)と ACME(HTTP-01)               |
|  4. 待ち受けを listen(TLS)と listen_cleartext(平文 HTTP/1.1 + h2c)に整理(旧キーは削除)  |
|  5. セキュリティ監査: 要求の密輸・パスの正規化・本文の上限・キャッシュの共有など 21 件を修正   |
|  6. HTTP/3: 輻輳制御 cubic・経路 MTU の探索・本文のゼロコピー。対 nginx 1.21×(Linux)       |
|  7. ghcr.io のイメージ(io_uring が使えなければ epoll 版へ自動切替)・crates.io・PyPI へ公開  |
+--------------------------------------------------------------------------------------------------+

1. API サーバライブラリ(Rust・C・Python)

Why it matters: veil のネットワーク層(io_uring・TLS・kTLS・HTTP/1.1・2・3・ホットリロード・サンドボックス)を、プロキシの裏にアプリを置く代わりに、アプリそのものとして使えるようにしました。プロキシ用のビルド(full*)にはライブラリのコードは入りません。

使い方の全体は docs/guide/library.md(日本語)にあります。

対象 内容 チケット
Rust #[veil::route] でハンドラ登録、FastAPI 方式の引数束縛と自動バリデーション(422)、config.toml の取り込みとビルダでの上書き F-188
OpenAPI 3.1 の自動生成・Swagger UI・#[derive(veil::Schema)] F-189
tower / tokio Service / Layer 互換。veil::tokio(tokio 無しの互換層)で axum・hyper・reqwest などが動く F-190・F-198・F-204
gRPC unary・ストリーミング 3 種・デッドライン・圧縮(tokio 非依存)。veil-build が .proto から生成 F-197・F-208・F-209
GraphQL 利用者が async-graphql を載せる形(サンプル examples/api/rust-graphql) F-191・F-207
L4 TCP / UDP のリスナーに Rust 関数をハンドラとして登録 F-192
C libveil.so / libveil.a + veil.h F-193・F-210
Python PyO3 の veil-api(import veil)。FastAPI 風デコレータ、grpcio の生成コードもそのまま使える F-194・F-210・F-212
成果物 C ライブラリ・Python wheel・Rust ソースを 1 個の zip に F-195

性能は library.md の「性能」(F-201・F-202・F-205・F-206)。Rust のネイティブハンドラは tokio 上の axum と同等、Python は FastAPI の 2.1〜2.5 倍です。

2. サービスメッシュのデータプレーン(Istio・Linkerd)

Why it matters: 制御プレーン(istiod、Linkerd の destination・identity・policy)を無改造のまま、注入されるプロキシ(Envoy・linkerd2-proxy)だけを veil に替えられます。veil の Pod と本家のプロキシの Pod は同じメッシュで相互に通信します。

詳細は docs/guide/mesh.md(日本語)。対応範囲は F-215〜F-225 です(透過転送・ワークロード ID の mTLS・L7 の重み付き分割やリトライ・認可・観測・Istio のサイドカー / ゲートウェイ / waypoint・Linkerd のプロキシ)。

kind の上の fortio の計測(mesh.md の「性能」):

経路 本家 veil
Istio のサイドカー、HTTP/1.1 の最大 rps / 要求あたりの CPU(両側) 3,221 / 685 µs 6,732 / 280 µs
Istio のゲートウェイ、HTTP/1.1 の最大 rps 5,597 11,125
Linkerd のサイドカー、HTTP/1.1 / gRPC の最大 rps 4,109 / 2,835 7,261 / 4,814

メッシュのプロキシを残して、その横でサイドカーとして veil を動かす構成(F-196)は docs/guide/kubernetes.md です。

3. 動的設定・証明書・コンテナ運用

機能 内容 ガイド
VDS(F-04・F-199・F-211) 制御プレーンからルート・アップストリームを配信。gRPC の双方向ストリーム(既定)か REST。検証に失敗したスナップショットは NACK して前の設定のまま。状態のメトリクス・管理 API・冗長化・初回の待ち vds.md
ACME(F-05) HTTP-01 で証明書を自動発行・更新し、既存のホットリロードで差し替え acme.md
環境変数の上書き(F-179) VEIL_OVERRIDE_<n> に --override と同じ書式。優先は TOML < 環境変数 < CLI configuration.md
証明書の受け渡し(F-180) Docker secrets・Kubernetes Secret(..data の付け替えで自動リロード) tls.md
待ち受けの整理(F-200) listen(TLS の HTTP/1.1・2・3)と listen_cleartext(平文 HTTP/1.1・h2c)。旧キーは削除 §7
コンテナイメージ(F-237) ghcr.io/aofusa/veil(amd64・arm64)。io_uring が使えない環境(Docker の既定の seccomp・Linkerd の RuntimeDefault)では同梱の epoll 版へ execve kubernetes.md の「イメージ」・packaging/README.md

4. セキュリティ監査と主な不具合修正

公開の前に Claude Security のプラグインで攻撃面ごとに監査し(F-236)、CRITICAL・HIGH を 0 にしました。設定で影響を受けるものは docs/guide/security.md に追記しています。個々の内容は各チケットにあります。

分類 チケット
要求の密輸(HTTP/2・3 → HTTP/1.1 のフィールド、chunked の終端の後ろのバイトと緩い解析、WebSocket のハンドシェイクの後ろのバイト) B-135・B-142・B-143・B-145
ルート制限の素通り(正規化していないパス・IPv4 射影の IPv6・ルートキャッシュの固定シード・Respond/Redirect の [route.security]) B-138・B-139・B-141・B-148・B-133
要求ヘッダのポリシーが HTTP/1.1 にしか効かない(HTTP/2・3・WebSocket) B-136・B-144
本文の上限が無い(HTTP/2・3 のバッファ経路・gRPC の解凍)・検査順のずれ B-146・B-147・B-127・B-132
共有キャッシュが利用者ごとの応答を保存(Authorization・Set-Cookie・Vary) B-140
メッシュ(XFF の左端・管理ポートの /shutdown)、Proxy-Wasm のホストを落とせる確保 B-137・B-149・B-131・B-134
依存の RUSTSEC 勧告(rustls 0.23.46・pyo3 0.29・wasmtime 36.0.18・quinn-proto) B-155

そのほかの主な修正:

  • io_uring の制限付きリングがバッファ選択の op を全部拒否していた(B-128)。 HTTP/3 の multishot 受信は常にフォールバックしていました。
  • HTTP/1.1 のパイプラインの 2 つ目以降を本文として捨てていた(B-129)。 HTTP/2 の閉じたストリームの扱いで接続が止まる・切れる問題(B-121・B-123・B-130)。
  • コンテナで起動後最初の静的配信が 404(B-154)。 seccomp のプロファイルに openat2 がありませんでした。
  • Linux aarch64(glibc)で seccomp を有効にすると起動直後に abort(B-156)。 aarch64 の許可リストに rseq がなく、glibc 2.35 以降が Fatal glibc error: rseq registration failed で止まっていました(glibc/arm64 のイメージ・arm64 の deb・aarch64 の rpm と gnu の tar.gz)。
  • 平文リスナーが最初のバイトを 200ms しか待たなかった(B-122)。
  • reactor のタイマーの切り捨てで poller が空回り(B-152)。

5. 性能(v0.8.0)

結果の正は docs/perf/README.md、改善の内容は F-240 です。v0.8.0 から、nginx 側にも中継・圧縮・HTTP/3 の「同じ仕事の相手」を置いて比べています。

計測 結果
Linux x86_64、対 nginx(中央値) HTTP/1.1 1.29×・HTTP/2 1.76×・HTTP/3 1.21×・h2c 2.48×。全 120 構成で nginx 以上
Linux x86_64、対 v0.7 系の main 全体 1.002、HTTP/3 1.138
FreeBSD 14.3 aarch64、要求あたりの CPU(nginx / veil) 16 項目中 15 項目で 1.00 以上(HTTP/2 静的 1.52〜1.57、h2c 1.60〜1.79)

6. 既知の制限事項・運用上の注意点

  • FreeBSD の HTTP/3 54KB は、要求あたりの CPU が nginx の 1.06 倍(スループットは同等)。 v0.8.0 で 1.15 倍から縮めましたが、残りは quiche の送出と損失回復の内部処理です(docs/perf/README.md)。
  • ライブラリの制限は library.md の「制限事項」、メッシュの違い・制限は mesh.md の「違い・制限」 にあります。未着手の残件は F-226(TOML のルートのタイムアウト・リトライ・ミラー)・F-227(RuntimeDefault の下の io_uring)・F-228(ztunnel)・F-229(ext_authz)・F-230(メッシュの試験の残り)です。
  • API ライブラリ: App::tokio_service(axum の Router のマウント)はネイティブハンドラの 76% です(F-235。目標の 85% に届かず)。HTTP/3 では io_uring が epoll より 2 割遅い(F-214)、HTTP/2 の PING の受け付け方針は未実装(F-213)。
  • Windows の E2E は配布物でのスモークだけです。 E2E のハーネスが UDS など Windows で使えない構成を含むためです(platform_verification.md)。Windows aarch64 の配布物は実機で確かめていません。
  • v0.7 系からの制約はそのまま。 NetBSD・BSD aarch64 の Wasm は Pulley で、NetBSD は paxctl +m が要ります(platforms.md)。

7. アップグレード手順

  1. 待ち受けの旧キーは削除されました(F-200)。 tls_only・http・h2c_enabled・h2c_listen・h2c_http1・http3_enabled を書くと、移行先を示すエラーで起動しません。対応表は examples/config.toml の冒頭 と configuration.md にあります。平文のリスナーは既定で https への 301 だけを返します。平文で配信するときは enable_secure_redirect = false を書いてください。
  2. 要求のパスを正規化してから照合・転送します(B-148、[security] path_normalization = "base" が既定)。 %XX の戻し・./.. の除去をした後のパスが上流に届きます。以前の動作は "off" です。
  3. 共有キャッシュは Authorization 付きの要求を素通りし、Set-Cookie の応答を保存しません(B-140)。 利用者ごとの応答をキャッシュしたいときは key_headers に入れます(compression-cache.md)。
  4. HTTP/3 の既定が変わりました(F-240)。 輻輳制御 cubic(以前は bbr)、max_udp_payload_size = 1452 と discover_pmtu = true、reactor の recv_drain_max = 1024。
  5. ライブラリとして使う場合のクレート名は veil-proxy です(F-238)。 veil = { package = "veil-proxy", version = "0.8" } と書けば、コードの veil:: はそのままです。Python は pip install veil-api。

設定の検証とリロード、ソースからのビルドは v0.7 系と同じです(running.md・building.md)。

関連


8. 公開先と配布物

タグ v0.8.0 の push で、.github/workflows/release.yml が次を公開します(packaging/README.md の「公開」)。

公開先 中身
ghcr.io/aofusa/veil latest=musl=musl-v0.8.0、glibc=glibc-v0.8.0(linux/amd64・linux/arm64、cosign 署名)
crates.io veil-proxy・veil-proxy-macros・veil-proxy-build(docs.rs)
PyPI veil-api(manylinux・musllinux・macOS・Windows の wheel と sdist。文書は Read the Docs)

以下の配布物は、すべて --profile dist(fat LTO・codegen-units=1・シンボル除去)で直列にビルドしました。packaging/scripts/verify-artifacts.sh で最終のソースから作られたことを確かめています。Linux・macOS・Windows x86_64 の配布物は、実機または VM でそのバイナリを起動して確認しました。

ファイル 対象 備考 SHA-256
veil_0.8.0_amd64.deb Linux x86_64(Debian / Ubuntu) glibc 2.28 互換 49680193f5447c945b0b2f65cae9dcdaab79a64989f38af52d102a4ac67180a7
veil_0.8.0_arm64.deb Linux aarch64(Debian / Ubuntu) glibc 2.28 互換 a201cd8327293d9a72285e1321caa4d76a42c15026a7ef6f6395f45992ac3341
veil-0.8.0-1.x86_64.rpm Linux x86_64(RHEL / Amazon Linux 2023 など) glibc 2.28 互換 451881b8713486b499ace865dbacbfa7950aef1d93d0efc3e5b529972cfe7a7c
veil-0.8.0-1.aarch64.rpm Linux aarch64(RHEL / Amazon Linux 2023 など) glibc 2.28 互換 6966c1086ef01e80285dcb38e0a7c16b2aeea5d36dda30032ee03c2c0497b5ec
veil-0.8.0-x86_64-unknown-linux-gnu.tar.gz Linux x86_64 glibc 2.28 互換 e73b9c00fadddd874109b32da4f8f259dc2a315efaf6336c39099d45c9a9257a
veil-0.8.0-aarch64-unknown-linux-gnu.tar.gz Linux aarch64 glibc 2.28 互換 e282f78217b1823f1333646b3bbba05c098d9caae04a1274864c33a075d9e8a1
veil-0.8.0-x86_64-unknown-linux-musl.tar.gz Linux x86_64 musl 静的リンク c6ef20d1e56af599437e7f4bbc0655bce0e571e5b572e9236ca769bc1b04d055
veil-0.8.0-aarch64-unknown-linux-musl.tar.gz Linux aarch64 musl 静的リンク ba6fa92517ed54b7eac79ad67692ee12e7cc44ed251d6ed2f9a1c588c57aac0f
veil-0.8.0-universal2-apple-darwin.tar.gz macOS(x86_64 + Apple Silicon) universal2 9ea553a0f27a1303ed910815f5e8e9ea5255ea30b090fb61b01d96f7dfeb3f3b
veil-0.8.0-x86_64-pc-windows-msvc.zip Windows x86_64 d0532d9eb8f3b062e1d460f981f25791867b026c5de6aa3a3225cf15b10f2b9b
veil-0.8.0-aarch64-pc-windows-msvc.zip Windows aarch64 実機未検証 7284c1fb122dc614158b3fa6f75b0ade0d1f8f3cfe4d81ad88d43040bff73805
veil-0.8.0-x86_64-unknown-freebsd.tar.gz FreeBSD 14.3 x86_64 0d1e02e40433242de797633c03d76d7aced2cdf481c5f2ad5aa8d11e9c67804b
veil-0.8.0-aarch64-unknown-freebsd.tar.gz FreeBSD 14.3 aarch64 Wasm は Pulley e2565686c443e3a95865b053b1c32ff75de8ddae64f61f0cc1b5d073ccf0453f
veil-0.8.0-x86_64-unknown-openbsd.tar.gz OpenBSD 7.9 x86_64 Wasm は Pulley 4c0bb0bf44e416fdf17160ac2eb7f93438c519d71cd9f6f56ed6df4fa5256299
veil-0.8.0-aarch64-unknown-openbsd.tar.gz OpenBSD 7.9 aarch64 Wasm は Pulley dbc9372f88b7e4fda5118b6478b9a3618be09695942382bd2f7a3a750208e147
veil-0.8.0-x86_64-unknown-netbsd.tar.gz NetBSD 10.1 x86_64 Wasm は Pulley・paxctl +m が必要 35371a661e05398f76acdff338aee413b5e7f92c56fe4509a1dc2ca0c0467191
veil-0.8.0-aarch64-unknown-netbsd.tar.gz NetBSD 10.1 aarch64 Wasm は Pulley・paxctl +m が必要 808062d0a0f8ed109f06cf34cd8b3a29dfff9b26a2fd451ee7ad306c6f8eb197
veil-lib-0.8.0-x86_64-linux-gnu.zip API ライブラリ(C・Python wheel・Rust ソース) manylinux_2_28 b27be924425552698d504478c926137e4e2b220fdec97eb1cbdfae4eac9694fd