EMQX GCP 连接器 Service Account JSON 脱敏机制解析:HTTP API 读取凭据的安全实现
后端物联网消息队列通信【免费下载链接】emqxThe most scalable and reliable MQTT broker for AI, IoT, IIoT and connected vehicles项目地址https://gitcode.com/gh_mirrors/em/emqx点击查看免费下载导读本文围绕 EMQX 仓库变更记录 changes/ee/fix-18314.en.md 展开剖析一项针对数据集成安全的关键修复当通过 HTTP API 读取使用 JSON Service Account 认证的 GCP 连接器GCP Pub/Sub Producer/Consumer、BigQuery时连接器配置中的敏感凭据将被统一脱敏为******避免私钥等密钥材料通过管理接口泄露。读完本文你将掌握 EMQX 连接器敏感字段的脱敏redact与反脱敏deobfuscate闭环机制、涉及的具体源码实现与测试验证以及如何在真实 API 调用中确认该行为。变更背景一次面向凭据安全的加固原始变更内容只有一句话但其含义在数据集成安全场景下十分重要When reading GCP Connectors (GCP PubSub Producer/Consumer, Bigquery) that use JSON Service Account authentication via the HTTP API, now the values are redacted.即通过 HTTP API 读取使用 JSON Service Account 认证的 GCP 连接器时凭据值现在会被脱敏。在此之前GET /connectors/:id之类的查询接口可能将完整的服务账号 JSON其中包含private_key私钥原样返回给调用方任何拥有只读管理权限的用户都能看到密钥材料。本次修复后API 响应中不再出现真实凭据。该修复的落点集中在三类 GCP 集成连接器上连接器对应应用目录认证方式GCP Pub/Sub Producerapps/emqx_bridge_gcp_pubsubService Account JSON 等GCP Pub/Sub Consumerapps/emqx_bridge_gcp_pubsubService Account JSON 等BigQueryapps/emqx_bridge_bigqueryService Account JSON 等从源码结构看这三类连接器共享同一个 GCP 认证 schema 库 apps/emqx_bridge_gcp_pubsub/src/emqx_bridge_gcp_pubsub_schema_lib.erl因此一次修复即可覆盖多个连接器BigTable 等复用同一库的连接器同样受益。GCP 连接器的三种认证方式在理解脱敏之前先明确service_account_json在连接器配置中的位置。从 emqx_bridge_gcp_pubsub_schema_lib.erl 的authentication_field/0可见GCP 认证是一个 union 类型支持三种方式attached_service_account挂载服务账号使用 EMQX 所在 Compute Engine 实例上挂载的 GCP 服务账号无需在配置中存放任何凭据service_account_json服务账号 JSON直接填写创建服务账号时下载的 JSON 凭据文件内容包含private_key私钥属于高度敏感字段wifWorkload Identity Federation通过 GCP Workload Identity Federation 使用联邦 token配置中包含service_account_email、gcp_project_id、gcp_project_number、gcp_wif_pool_id、gcp_wif_pool_provider_id以及initial_tokenOIDC client credentials其中client_secret同样是敏感字段。对应的国际化描述见 rel/i18n/emqx_bridge_gcp_pubsub_schema_lib.hoconservice_account_json的说明为“包含要与 GCP 一起使用的 GCP 服务账号凭据的 JSON即创建服务账号时下载的凭据文件”。三种方式中service_account_json携带私钥明文是本次脱敏保护的核心对象wif下的client_secret同样被sensitive true标记。敏感字段是如何被标记的schema 层的sensitive声明脱敏的第一步是在 schema 定义中将字段标记为敏感。以 emqx_bridge_gcp_pubsub_schema_lib.erl 中fields(auth_service_account_json)为例{service_account_json, emqx_schema_secret:mk( #{ required false, validator fun ?MODULE:service_account_json_validator/2, sensitive true, desc ?DESC(service_account_json) } )}关键点有两处sensitive true向配置系统声明该字段为敏感信息这是后续脱敏行为的依据emqx_schema_secret:mk/1将字段包装为 secret 类型支持直接填写 JSON 字符串也支持file://...形式的文件引用——当使用文件引用时EMQX 会读取文件内容作为凭据而配置中只保存文件路径。BigQuery 连接器的 schema apps/emqx_bridge_bigquery/src/emqx_bridge_bigquery_connector_schema.erl 与 GCP Pub/Sub 的 emqx_bridge_gcp_pubsub.erl 都以完全相同的sensitive true方式声明service_account_json并且直接复用emqx_bridge_gcp_pubsub_schema_lib:service_account_json_validator/2作为校验器。这正是“一次修复覆盖多个连接器”的实现基础。除了service_account_jsonwif认证下的client_secret见 emqx_bridge_gcp_pubsub_schema_lib.erl也声明为sensitive true。凭据校验逻辑service_account_json_validator/2定义了合法的服务账号 JSON 结构emqx_bridge_gcp_pubsub_schema_lib.erl必须是合法 JSON且必须包含以下五个键且type必须为service_accounttypeproject_idprivate_key_idprivate_keyclient_email校验器先通过emqx_secret:unwrap/1解开 secret 包装file://引用会在此处被解析为文件内容再解码为 map 检查必填键。若命中脱敏值maybe_obfuscated上下文下值为******则直接放行交由 HTTP API 层在更新流程中反脱敏。脱敏核心emqx_utils_redact的递归脱敏引擎所有连接器 API 的脱敏最终都汇聚到通用工具模块 apps/emqx_utils/src/emqx_utils_redact.erl。该模块对外提供redact/1、redact/2递归脱敏 termmap、tuple、list、任意嵌套redact_headers/1针对 HTTP 头部的脱敏authorization、api-key、cookie等is_sensitive_key/1判断键名是否为敏感键is_redacted/2,3判断某个值是否已被脱敏deobfuscate/2,3反脱敏更新配置时用旧值恢复敏感字段redacted_value/0返回脱敏占位值******。敏感键名单is_sensitive_key/1维护了一份按字母序排列的敏感键清单emqx_utils_redact.erl支持 atom、string、binary 三种键形式与本主题直接相关的条目包括is_sensitive_key(private_key) - true; %% 服务账号 JSON 中的私钥 is_sensitive_key(service_account_json) - true; %% 整个服务账号 JSON 字段 is_sensitive_key(client_secret) - true; %% WIF 的 OAuth Client Secret is_sensitive_key(token) - true; is_sensitive_key(access_token) - true; is_sensitive_key(password) - true; ... is_sensitive_key(_) - false.因此只要配置树中某键名为service_account_json无论嵌套多深redact/1都会将其值替换为******。递归遍历由do_redact/2,3实现emqx_utils_redact.erlmap 逐键处理tuple 转为 list 处理后还原list 逐元素处理非敏感键则继续下钻其值——这保证了即便敏感字段被包裹在authentication等嵌套 map 中也能被命中。值的处理细节redact_v/1emqx_utils_redact.erl对敏感键对应的值做了精细处理二进制/列表值统一替换为******file://前缀的值保留原样。因为file://...只是文件路径引用而非凭据本身路径本身不构成敏感信息且保留它才能让后续反脱敏正确工作模板占位符值若值是${var}形式的占位符模板也保留原样避免破坏变量引用语义secret 包装值尝试解包后递归处理无法解包则替换为******。do_redact_v(file://, _/binary V) - V; %% 文件引用不脱敏 do_redact_v(file:// _ V) - V; do_redact_v(B) when is_binary(B) - ?REDACT_VAL; %% 普通二进制 - ****** do_redact_v(L) when is_list(L) - ?REDACT_VAL; ...其中?REDACT_VAL定义在模块头部-define(REDACT_VAL, ******)emqx_utils_redact.erl。反脱敏更新配置时恢复真实凭据脱敏不能破坏“编辑后保存”的正常流程。deobfuscate/3emqx_utils_redact.erl实现反向恢复遍历新配置若某键值已被脱敏is_redacted/3命中则从旧配置中取出原值填回若旧配置中不存在该键说明是新增字段则直接丢弃脱敏值而非将其写入配置。headers与client_jwks有专门的恢复分支以支持大小写不敏感匹配与 JWKS 文件键恢复。HTTP API 层脱敏与反脱敏的完整闭环脱敏在 HTTP API 层的落点集中在 apps/emqx_connector/src/emqx_connector_api.erl。其filter/2回调会为请求附加maybe_obfuscated true上下文见 emqx_connector_api.erl告诉 schema 校验器“请求体中可能携带已脱敏的值”从而让service_account_json_validator对******放行。读取GET输出侧强制脱敏/connectors/:id(get, ...)的响应构造中fill_defaults/2在填充默认值时显式传入obfuscate_sensitive_values trueemqx_connector_api.erl随后对合并后的完整连接器信息统一执行redact/1emqx_connector_api.erlResourceData lookup_channels(Namespace, Type, ConnectorName, ResourceData0), RawConf fill_defaults(Type, RawConf0), redact( maps:merge(RawConf#{namespace ..., type Type, name ...}) ),因此GET /connectors/:id返回的authentication.service_account_json字段值恒为******真实 JSON 不会离开节点。更新PUT反脱敏后再落盘/connectors/:id(put, ...)在更新前调用deobfuscate(ConnectorType, Conf1, RawConf)emqx_connector_api.erl用已持久化的旧配置恢复请求体中的******再执行配置更新。这样用户在 dashboard 或 API 客户端中看到的永远是脱敏值而实际保存的仍是真实凭据。对于 MQTT 连接器中含嵌套 secret 的数组字段还实现了专用的deobfuscate_mqtt_connector逻辑emqx_connector_api.erl。探测与错误路径避免错误信息泄露凭据/connectors_probe与/connectors/:id/:operation的返回内容同样经过redact/1处理emqx_connector_api.erl确保连接测试失败时错误响应中不会夹带真实密钥。此外GET 响应的status_reason等诊断信息也会被redact/1清洗emqx_connector_api.erl。完整的 API 行为示意以下调用示意字段值以当前仓库 schema 为准仅为演示脱敏效果# 创建使用 Service Account JSON 认证的 BigQuery 连接器 curl -X POST http://localhost:18083/api/v5/connectors \ -u admin:public \ -H Content-Type: application/json \ -d { type: bigquery, name: my_bq, enable: true, authentication: { type: service_account_json, service_account_json: {\type\:\service_account\,\project_id\:\my-project\,\private_key_id\:\k1\,\private_key\:\-----BEGIN PRIVATE KEY-----...\,\client_email\:\samy-project.iam.gserviceaccount.com\} } } # 读取该连接器service_account_json 已脱敏为 ****** curl http://localhost:18083/api/v5/connectors/bigquery:my_bq -u admin:public # authentication: { type: service_account_json, service_account_json: ****** }测试验证行为有据可查本次修复在测试套件中留下了直接验证。以 BigQuery 为例apps/emqx_bridge_bigquery/test/emqx_bridge_bigquery_SUITE.erl 的t_legacy_service_account_json_redact/1用例完整覆盖了创建、读取、更新、探测四条路径%% 创建响应service_account_json 已脱敏 ?assertMatch( {201, #{authentication : #{service_account_json : ******}}}, create_connector_api(TCConfig, #{}) ), %% 读取响应service_account_json 已脱敏 ?assertMatch( {200, #{authentication : #{service_account_json : ******}}}, get_connector_api(TCConfig) ), %% 用脱敏后的参数更新仍能成功 ?assertMatch( {200, #{status : connected, authentication : #{service_account_json : ******}}}, update_connector_api(TCConfig, RedactedParams) ), %% 持久化配置中保存的仍是真实 JSON而非脱敏值 ?assertMatch({, _/binary, persisted_service_account_json(TCConfig)),这段测试同时印证了两个关键结论API 出口必然脱敏创建、读取、更新后的响应中service_account_json均为******内部存储不被破坏持久化配置中保存的仍是完整的真实 JSON断言以{开头说明脱敏只发生在 API 边界不影响连接器实际使用凭据建立连接。兼容性旧版根级字段的自动迁移service_account_json并非一直位于authentication之下。legacy_service_account_json_root_converter/2emqx_bridge_gcp_pubsub_schema_lib.erl负责将旧版配置中位于连接器根级的service_account_json自动迁移到authentication.service_account_json结构下legacy_service_account_json_root_converter(Conf0, _HoconOpts) - case Conf0 of #{service_account_json : SAJ0} - Conf maps:remove(service_account_json, Conf0), SAJ case is_map(SAJ0) of true - emqx_utils_json:encode(SAJ0); %% 旧 schema 是对象编码为 JSON 字符串 false - SAJ0 end, Conf#{ authentication #{ type service_account_json, service_account_json SAJ } }; _ - Conf0 end.该转换器被 BigQuery 连接器 schema 的config_connector、post_connector、put_connector三条路径注册emqx_bridge_bigquery_connector_schema.erl与测试用例中“在 6.2.0 中该字段被移动到authentication键之下”的注释相互印证。升级后读取旧配置API 返回的是迁移后的新结构且同样经过脱敏。总结一次修复三层防护本次变更并非孤立的字符串替换而是由三层机制共同构成的凭据安全体系schema 层标记service_account_json、client_secret等字段声明sensitive true并共享统一的 GCP 认证 schema 库使 GCP Pub/SubProducer/Consumer、BigQuery 等连接器一次接入即可获得保护通用脱敏引擎emqx_utils_redact.erl 提供递归脱敏、敏感键名单、file://引用豁免与反脱敏恢复能力且对private_key、token、password等一大批通用敏感键名同样生效API 边界闭环emqx_connector_api.erl 在读取、更新、探测、错误响应等所有出口统一执行redact/1并在更新入口用deobfuscate/2恢复真实值保证“对外只见******、对内存储真实凭据、编辑保存不受影响”。对于部署了 GCP 数据集成连接器的 EMQX 用户升级到包含本修复的版本后无需修改任何连接器配置管理 API 的凭据暴露风险即被自动消除——这正是该变更记录在 changes/ee/fix-18314.en.md 中一句话背后完整的安全设计。赞分享后端物联网消息队列通信【免费下载链接】emqxThe most scalable and reliable MQTT broker for AI, IoT, IIoT and connected vehicles项目地址https://gitcode.com/gh_mirrors/em/emqx点击查看免费下载相关推荐EMQX GCP 连接器 Attached Service Account 认证在 GCP VM 上自动获取实例元数据 TokenEMQX GCP 连接器 Attached Service Account 认证在 GCP VM 上自动获取实例元数据 Token 导读 本篇文章聚焦 EMQ后端物联网消息队列通信EMQX GCP 连接器 Workload Identity Federation (WIF) 认证实战指南基于 Service Account Impersonation 的免密钥接入EMQX GCP 连接器 Workload Identity Federation WIF 认证实战指南基于 Service Account Imperson后端物联网消息队列通信EMQX Prometheus 配置 API 安全修复push gateway 的 Authorization 头脱敏机制解析EMQX Prometheus 配置 API 安全修复push gateway 的 Authorization 头脱敏机制解析 本文基于 EMQX 开源仓库中后端物联网消息队列通信上一篇Llama-medx_v3 vs 传统医疗NLP模型为什么它能成为临床文本处理的终极选择下一篇【免费下载】 精准测试ADCMatlab代码助力动态与静态参数分析【matlab下载】创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

arrylist怎么让他变得不可修改

arrylist怎么让他变得不可修改

在Java中,要将一个 ArrayList变得不可修改,你可以使用以下几种方法:###1. 使用 Collections.unmodifiableListJava 提供了 Collections.unmodifiableList 方法,可以生成一个不可修改的视图。这种方式返回的列表将不允许添加、删除…

2026/9/24 13:53:26 阅读更多 →
Collection集合、泛型

Collection集合、泛型

Object类是所有引用数据类型的父类,它提供一些方法给子类使用或扩展一、Collection集合集合:集合是java中提供的一种容器,可以用来存储多个数据。数组的长度是固定的。集合的长度是可变的。数组中存储的是同一类型的元素,可以存储…

2026/9/24 13:53:26 阅读更多 →
深度学习 - 16 ASR 整体架构

深度学习 - 16 ASR 整体架构

06|ASR 整体架构:Encoder、Decoder、Predictor、Joiner 与 Logits 1. 核心概念 上一章解决了一个根本问题: ASR 是把长度较长的声学序列转换成长度较短的文本序列,而且输入和输出之间存在未知的时间对齐关系。 这一章进一步回答: 这个转换在模型内部到底是怎么完成的? …

2026/9/24 13:53:26 阅读更多 →

最新新闻

基于 Java Spring Boot 的灾害应急救援平台设计与实现

基于 Java Spring Boot 的灾害应急救援平台设计与实现

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 1. 引言 随着自然灾害和突发公共事件的频发,传统应急救援模式在信息传递、资源调度和协同指挥等方面暴露出响应慢、信息孤岛、资源调配不透明等问题。本文基…

2026/9/24 17:23:28 阅读更多 →
计算机毕业设计之基于springboot➕vue的旅游信息推荐系统

计算机毕业设计之基于springboot➕vue的旅游信息推荐系统

本系统为用户而设计制作旅游信息推荐系统,旨在实现旅游信息推荐智能化、现代化管理。本旅游信息推荐管理自动化系统的开发和研制的最终目的是将旅游信息推荐的运作模式从手工记录数据转变为网络信息查询管理,从而为现代管理人员的使用提供更多的便利和条…

2026/9/24 17:23:27 阅读更多 →
权限提升(提权)从入门到精通:为什么“低权限Shell“也能翻盘

权限提升(提权)从入门到精通:为什么“低权限Shell“也能翻盘

黑客打进一台服务器,只拿到普通用户权限——然后呢?游戏才刚刚开始。 提权(Privilege Escalation):从低权限"升"到高权限——普通用户→管理员→系统/域管。 它是渗透测试的"临门一脚"、红队必备、…

2026/9/24 17:23:27 阅读更多 →
Linux运维踩坑实录:压缩文件夹报错“zip error: Nothing to do!”

Linux运维踩坑实录:压缩文件夹报错“zip error: Nothing to do!”

Linux运维踩坑实录:压缩文件夹报错“zip error: Nothing to do!”的深度剖析与最佳实践 引言:文件打包,运维与开发的必经之路 在当今的软件开发和系统运维领域,Linux 操作系统凭借其卓越的稳定性和强大的命令行工具生态&#xff…

2026/9/24 17:23:27 阅读更多 →
攻克 Open Event Theme 9大技术难题:从安装到定制的全方位解决方案

攻克 Open Event Theme 9大技术难题:从安装到定制的全方位解决方案

攻克 Open Event Theme 9大技术难题:从安装到定制的全方位解决方案 【免费下载链接】open-event-theme Open Event Standard Theme http://next.eventyay.com 项目地址: https://gitcode.com/gh_mirrors/op/open-event-theme 你是否在使用 Open Event Theme …

2026/9/24 17:23:27 阅读更多 →
bpftrace 贡献指南:从编写工具、RFC 提案到代码合入的完整实践

bpftrace 贡献指南:从编写工具、RFC 提案到代码合入的完整实践

可观测性性能剖析eBPF 【免费下载链接】bpftrace High-level tracing language for Linux 项目地址: https://gitcode.com/gh_mirrors/bp/bpftrace 点击查看 免费下载 bpftrace 是一个面向 Linux 的高层跟踪语言,致力于让开发者用极简的单行命令快速编写…

2026/9/24 17:22:27 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →