ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Envoy 外部依赖管理策略详解:声明、评审、维护与补丁治理

Envoy 外部依赖管理策略详解:声明、评审、维护与补丁治理 Envoy 外部依赖管理策略详解声明、评审、维护与补丁治理【免费下载链接】envoyCloud-native high-performance edge/middle/service proxy项目地址: https://gitcode.com/GitHub_Trending/en/envoy导读Envoy 是一款云原生高性能边缘/中间/服务代理Cloud-native high-performance edge/middle/service proxy其构建依赖大量 C/C、Python 与 Bazel 生态的外部组件。为了在功能演进、供应链安全和可维护性之间取得平衡Envoy 在 DEPENDENCY_POLICY.md 中定义了一套持续收紧的外部依赖管理策略涵盖依赖如何声明、新增依赖需满足哪些硬性标准、日常如何更新维护、何时允许引入 Envoy 侧补丁以及哪些场景可以豁免。读完本文你将掌握 Envoy 依赖治理的完整规则体系并能在自己的 Envoy 相关工程或 Bazel 项目中复用它来设计可审计、可升级的依赖管理流程。说明Envoy 的外部依赖策略本身是一个持续演进的活文档其演进在 issue #10471 中被跟踪下方内容以当前仓库中的 DEPENDENCY_POLICY.md 为准并辅以 MODULE.bazel、bazel/deps.yaml 等仓库内真实文件作为佐证。一、外部依赖全景依赖仪表盘与元数据仓库Envoy 首先为外部依赖建立了一个仪表盘dashboard所有外部依赖及其当前版本的完整列表由官方文档站的intro/arch_overview/security/external_deps页面提供。该页面的仓库源头即 docs/root/intro/arch_overview/security/external_deps.rst它按依赖的使用平面plane对依赖分类枚举Data plane (core)数据面核心依赖如 BoringSSL、nghttp2Data plane (extensions)仅被特定扩展使用的数据面依赖Control plane控制面依赖APIproto 与 API 相关依赖Observability (core / extensions)可观测性相关依赖Build构建期依赖Miscellaneous其他杂项Test only仅测试使用的 C/C 依赖测试还额外引入 Java、Rust、Python 依赖不在该表跟踪范围内。这种分类与deps.yaml元数据中的use_category字段一一对应是理解 Envoy 依赖治理的第一张地图一个依赖属于哪个平面直接决定了它被评估的严格程度。二、声明外部依赖MODULE.bazel 与 deps.yaml2.1 声明入口Envoy 采用 Bazel 7 的 Bzlmod 模块体系。原则上Envoy proxy 二进制构建与测试用到的所有外部依赖都必须声明在仓库根目录的 MODULE.bazel 中除非属于后面的策略例外清单。打开 MODULE.bazel 可以看到大量bazel_dep声明例如module( name envoy, version 1.40.0-dev, ) bazel_dep(name abseil-cpp, version 20260107.1) bazel_dep(name boringssl, version 0.20260413.0) bazel_dep(name nghttp2, version 1.66.0.envoy) bazel_dep(name quiche, version 0.0.0-260831-5c9cc6b.envoy)注意其中大量版本号带有.envoy后缀表示该版本是 Envoy 在 Bazel Central RegistryBCR之外维护的 registry 模块条目版本号本身由 Envoy 方确认与同步。2.2 元数据清单bazel/deps.yaml 与 api/bazel/deps.yaml除了 Bazel 模块声明依赖元数据统一维护在两个 YAML 清单中bazel/deps.yaml主仓库构建与测试依赖的元数据当前约 1470 行覆盖上百个依赖api/bazel/deps.yamlenvoy_api模块即api/目录自身的依赖元数据例如bazel-skylib、cel-spec等仅服务于 API 构建的依赖其use_category通常只有api。一个典型的元数据条目以nghttp2为例nghttp2: project_name: Nghttp2 project_desc: Implementation of HTTP/2 and its header compression ... project_url: https://nghttp2.org version: 1.41.0 release_date: 2020-06-02 use_category: [dataplane_core] cpe: cpe:2.3:a:nghttp2:nghttp2:*在真实仓库的 bazel/deps.yaml 中条目会包含更丰富的字段例如abseil-cpp: project_name: Abseil project_desc: Open source collection of C libraries drawn from the most fundamental pieces of Google’s internal codebase project_url: https://abseil.io/ apparent_name: abseil_cpp release_date: 2026-02-11 use_category: - dataplane_core - controlplane license: Apache-2.0 license_url: https://github.com/abseil/abseil-cpp/blob/{version}/LICENSE此外部分依赖还带有extensions字段列出使用该依赖的扩展名如antlr4-cpp-runtime被 CEL、WASM、ext_proc 等多个扩展引用便于反查依赖的使用方。2.3 元数据字段硬性要求策略对每个条目的字段提出了明确约束字段要求project_name/project_url必须提供有意义、可访问的项目名称与主页version必须填写当前使用版本且与 Bazel registry 中的模块版本保持同步版本来源优先使用 release 版本而非 main 分支 GitHub SHA tarball若确实使用非 release 版本必须添加注释说明原因use_category必须准确填写尤其要仔细思考该依赖是否有数据面或控制面影响release_date以 UTC 日期YYYY-MM-DD反映依赖的发布时间对没有 release 的依赖或临时使用某 commit 的场景填写该 commit 的 UTC 提交日期cpe所有非纯 build/test 依赖必须提供 CPECPECommon Platform Enumeration用于与 CVE 数据库关联、作为仪表盘和工具的机器可读 join key可在 NVD 的 CPE 搜索中查询只有 CPE 数据库中确实不存在该项目时才允许写N/ACPE 必须是无版本号形式带:*后缀因为版本可由version字段推导以仓库实例佐证核心 TLS 依赖 BoringSSL 的条目为cpe: cpe:2.3:a:google:boringssl:*Boost 为cpe: cpe:2.3:a:boost:boost:*均遵循无版本后缀 :*的约定。2.4 Python 依赖的声明方式Python 模块不应写入deps.yaml而是通过pip_parserules_python的pip_install机制在构建脚本中声明。当前仓库的实现在 bazel/python_dependencies.bzlpip_parse( name base_pip3, python_interpreter_target python3_12_host//:python, requirements_lock envoy//tools/base:requirements.txt, extra_pip_args [--require-hashes], ) pip_parse( name dev_pip3, python_interpreter_target python3_12_host//:python, requirements_lock envoy//tools/dev:requirements.txt, extra_pip_args [--require-hashes], )策略要求requirements.txt必须锁定精确版本例如PyYAML5.4.1理想情况下还应附带 SHA256 校验和可通过hashin工具生成仓库实现中通过extra_pip_args [--require-hashes]强制开启哈希校验纯开发者工具链与文档构建可以使用独立的requirements.txt同样遵守上述策略。仓库中可参考的锁文件包括 tools/base/requirements.txt、tools/dev/requirements.txt 等。三、新增外部依赖审批流程与评估标准3.1 必须经过的审批任何影响 Envoy 核心即不是只服务于某个非核心扩展的数据面或控制面新依赖必须先与 Envoy 依赖守护者dependency shepherds和安全团队确认需要提交一个 issue 并同时 tagenvoyproxy/security-team与 dependency shepherds 团队。3.2 十项评估标准下面的标准表用于评估新增依赖在数据面、控制面和可观测性平面的适用性适用于所有核心依赖以及任何需要抵御不可信下游/上游流量的扩展。需要特别强调的是这些标准是指导性原则在充分理由下可破例但已有扩展的先例不构成破例依据——仓库中确实存在违反本策略的历史扩展Envoy 会随时间逐步处理它们不能作为忽视本策略的理由。标准Criteria要求级别助记符Mnemonic权重理由Rationale采用 CNCF 批准的许可证Approved licenseMUSTLicenseHigh许可证合规是引入任何依赖的前提不得显著增大二进制体积除非是可选的即限定在特定扩展内MUSTBinarySizeHighEnvoy Mobile 对二进制体积敏感核心依赖选择必须考虑体积不得与现有依赖重复MUSTNoDuplicationHigh避免同时维护多个 JSON 解析器等重复实现带来的维护成本必须托管在 git 仓库且归档获取直接引用该仓库不支持手工构建后放在 GCS/S3 等位置的中间产物MUSTSourceHigh手工更新流程脆弱不到用时不被测试、常缺文档与协作、零日应急时可能失败且无审计轨迹无法追溯产物来源CVE 历史合理无病态的 CVE 曲线MUSTSoundCVEsHigh避免依赖在同一领域如缓冲区溢出CVE 密集的组件合入前完成代码评审最好是 PR 形式MUSTCode-ReviewNormal保持一致的代码评审存在安全漏洞处理流程含联系方式与上报/披露流程MUSTSecPolicyHigh缺失策略意味着安全漏洞可能成为公开的零日有超过 1 位贡献者承担了相当数量的提交MUSTContributorsNormal避免 bus factor 为 1关键人物缺席即停摆CI 中运行测试MUSTCI-TestsNormal变更以测试为门槛高测试覆盖率含静态/动态分析与模糊测试SHOULDTest-CoverageNormal关键依赖必须达到与 Envoy 相同的质量门槛Envoy 能否获得漏洞或安全发布的提前通知SHOULDSecPolicy-CompatHigh可实现协同安全发布但多数依赖不具备此特性是否有其他重要项目共同使用该依赖共享命运SHOULDSharedFateHigh增加安全社区关注度更多眼睛审视有版本发布含发布说明SHOULDReleasesNormal提供离散的升级点与清晰的安全影响理解当前仓库中 CEL、re2 等是反例90 天内有提交/发布SHOULDActiveNormal避免无人维护的依赖部分代码库已完成故非强制策略背后更完整的理由在内部文档中持续跟踪相关讨论在 DEPENDENCY_POLICY.md 中给出链接。简而言之MUST 项是准入门槛SHOULD 项是质量加分与风险提示核心依赖在质量上必须与 Envoy 自身看齐。四、维护现有依赖谁负责、如何更新Envoy 依赖社区志愿者以尽力而为best effort的方式跟踪依赖最新版本核心依赖由 Envoy maintainers / 安全团队负责更新扩展专属依赖由对应扩展的 CODEOWNERS 中列出的所有者负责更新。更新优先级上优先采用最新 release 版本而非 main 分支 GitHub SHA tarball。大部分依赖的可用更新可以在 GitHub issue 跟踪器中以newer release available为关键词筛选得到。更新某个依赖的推荐动作将对应 issue 指派给自己或在 PR 描述中关联例如添加Fix #1234同步更新 MODULE.bazel 中的bazel_dep版本与 Bazel registry 中的模块条目更新 bazel/deps.yaml必要时还有 api/bazel/deps.yaml中的元数据重点是version与release_date运行bazel test //test/...验证全量测试。关于版本来源还有一个实操细节官方 bazel/EXTERNAL_DEPS.md 建议只要依赖维护者提供了 tarball就应优先于 GitHub 自动生成的 tarball——GitHub 生成的 tarball SHA256 会随 GitHub 的 tar/gzip 库变更而变化可能破坏构建维护者提供的 tarball 更稳定且能提供权威 SHA256。4.1 依赖守护者Dependency shepherds的职责每个修改外部依赖的 PR 都必须获得 dependency shepherds 的签核sign-off。守护者会核对本策略是否被执行、元数据是否保持最新。这意味着依赖变更不是纯机械的版本号提升而是一次需要接受策略审计的变更。五、依赖补丁Dependency patches的治理当 Envoy 需要对某个依赖打补丁时补丁以.patch文件形式存在。策略对此非常审慎补丁会阻碍依赖升级创建时便捷但长期是维护负担会降低安全漏洞响应时的升级速度、增加升级工作量没有补丁会被接受除非已真诚且持续地推动其上游化upstream 到依赖的官方仓库必须存在消除该补丁的 plan-of-record即在 Envoy 或上游 GitHub 中 filed 一个 issue 跟踪补丁的移除每个补丁在其使用点必须有注释说明理由并链接跟踪 issue。仓库中真实存在的补丁示例位于 compat/openssl/patch内含 5 个.patch文件与大量用于构建 OpenSSL 兼容层的脚本体现了在安全相关的兼容层场景下如何受控地维护补丁。六、策略例外Policy exceptions以下两类依赖豁免于本策略仅面向开发者的工具链或文档构建所依赖的组件传递性的构建期依赖例如 vendored 进protoc-gen-validate的 Go 项目。这类依赖不进入核心二进制运行时风险面小因此无需走完整声明与评估流程。七、从策略到工程实践仓库中的配套机制7.1 依赖调试与临时覆盖对任何外部依赖调试的通用手段是用本地副本覆盖远端仓库。Bazel 提供--override_repository选项指向本地绝对路径可多次使用以覆盖多个依赖依赖名取自其在 MODULE.bazel 中的模块名。对于由envoy_cmake()构建的仓库还需在本地副本根部放置包含filegroup(name all, srcs glob([**]), ...)的BUILD文件。此外 bazel/EXTERNAL_DEPS.md 还给出了特定依赖的调试开关libevent在bazel/foreign_cc/BUILD的eventtarget 的cache_entries中加EVENT__ENABLE_VERBOSE_DEBUG: onnghttp2设置环境变量ENVOY_NGHTTP2_TRACE并以-l trace运行QUICHE设置ENVOY_QUICHE_VERBOSITYn显示 n 级以下的详细日志。7.2 离线预取依赖distdir通常 Bazel 在构建时下载依赖也可以借助--distdir预取依赖并指向包含同名且同 SHA256 的 tarball 目录例如bazel build --distdir$HOME/envoy_distdir //source/exe:envoy7.3 与文档站仪表盘的联动前文提到的依赖仪表盘文档 docs/root/intro/arch_overview/security/external_deps.rst 通过.. include::机制引入各分类的依赖清单external_dep_dataplane_core.rst、external_dep_dataplane_ext.rst、external_dep_controlplane.rst、external_dep_api.rst、external_dep_observability_core.rst、external_dep_observability_ext.rst、external_dep_build.rst、external_dep_other.rst、external_dep_test_only.rst。这些清单由工具从 bazel/deps.yaml 与 api/bazel/deps.yaml 的use_category生成形成了元数据 → 仪表盘 → 安全审计的自动化闭环CPE 字段正是为这个闭环提供与 CVE 关联的机器可读 join key。结语Envoy 的外部依赖策略本质上是一套面向供应链安全的治理框架用MODULE.bazeldeps.yaml保证声明的可审计性用守护者 安全团队签核保证引入的严肃性用 MUST/SHOULD 标准矩阵保证质量的可评估性用补丁治理与上游化要求保证长期的可升级性。对于任何长期维护的 Bazel 项目这套双文件元数据 分类平面 审计签核 补丁淘汰机制的组合拳都是极具参考价值的工程范式。想要亲手验证可以从阅读 MODULE.bazel 中上百条bazel_dep与 bazel/deps.yaml 中对应元数据条目的对应关系开始。【免费下载链接】envoyCloud-native high-performance edge/middle/service proxy项目地址: https://gitcode.com/GitHub_Trending/en/envoy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表