Telegraf JOSE 密钥存储插件secretstores.jose完整指南基于 JOSE 加密的文件型密钥管理方案【免费下载链接】telegrafAgent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data.项目地址: https://gitcode.com/GitHub_Trending/te/telegraf导读secretstores.jose是 Telegraf 在 v1.25.0 版本引入的密钥存储Secret Store插件它利用 JavaScript Object Signing and EncryptionJOSE算法族将本地敏感信息以加密文件的形式保存在磁盘上供 Telegraf 配置中需要密文的地方按需引用。读完本文你将掌握该插件的配置项语义、{store-id:secret_key}引用语法、telegraf secrets命令行的增删改查操作以及它在仓库源码中的底层实现机制keyring 文件后端、密码提示链路与接口注册方式可以直接在真实环境中落地一套配置文件不落明文的密钥管理方案。插件定位为什么需要 JOSE 密钥存储Telegraf 的配置中不可避免地要写入各类敏感信息数据库口令、Token、API Key、证书私钥等。如果直接明文写在.conf文件中一旦配置文件泄露或进入版本库敏感数据就会随之暴露。Telegraf 的 Secret Store 机制正是为这一场景设计——插件只保存对密钥的引用reference真正的密钥值存放在独立的、受保护的密钥存储中运行时才被解析出来。secretstores.jose是 Telegraf 内置的十余种密钥存储之一仓库中同级的还有docker、googlecloud、http、oauth2、os、systemd、vault等见 plugins/secretstores 目录。它的特点是纯本地密钥以文件形式存放在指定的目录中不依赖外部密钥管理服务加密保护每个密钥文件受 JOSEJavaScript Object Signing and Encryption算法保护必须提供正确口令才能读取静态引用从源码看它返回的解析函数是静态的详见下文GetResolver实现适合内容不会随时间轮换的长期凭证。配置详解sample.conf 全参数拆解插件的官方示例配置位于 plugins/secretstores/jose/sample.conf与其 README.md 中toml sample.conf注入的内容一致。完整配置如下# Read secrets from Javascript Object Signing and Encryption file [[secretstores.jose]] ## Unique identifier for the secret store. ## This id can later be used in plugins to reference the secrets ## in this secret store via {id:secret_key} (mandatory) id secretstore ## Directory for storing the secrets path /etc/telegraf/secrets ## Password to access the secrets. ## If no password is specified here, Telegraf will prompt for it at startup time. # password 各参数语义如下参数必填类型说明id是string密钥存储的唯一标识符用于在插件配置中通过{id:secret_key}引用本存储内的密钥path是string存放密钥文件的目录每个密钥单独存储在一个文件中password否string / 环境变量 / 另一密钥存储的引用访问密钥文件所需的口令不配置时 Telegraf 启动时会交互式提示输入对应到源码结构三个配置项被直接映射为Jose结构体的字段见 plugins/secretstores/jose/jose.gotype Jose struct { ID string toml:id Path string toml:path Password config.Secret toml:password ... }口令的三种提供方式根据 README 与源码Init()实现jose.gopassword参数的取值优先级与形态十分灵活配置字面量直接在password中写入字符串环境变量利用 Telegraf 的环境变量替换机制引用$VAR形式的环境变量跨存储引用写成{other-store:key}引用另一个密钥存储中的密钥作为本存储的口令此时口令本身也不落明文。如果以上都未提供Init()会使用keyring.TerminalPrompt作为口令提示函数在 Telegraf 启动时于终端交互式询问口令。此外源码还保留了一个兜底分支若插件级password为空会尝试使用全局配置口令config.Password见 jose.go。[!NOTE] 该存储中所有密钥都使用同一个口令加密。若你需要为每个密钥单独设置口令请创建多个[[secretstores.jose]]实例各自指定不同的path与password。初始化失败时的校验逻辑Init()中的校验顺序清晰反映了必填约束id为空 → 报错id missingpath为空 → 报错path missing口令解析失败例如引用了一个不存在的密钥→ 报错getting password failed。这三条错误分支在 jose_test.go 的TestInitFail表驱动测试中被逐一验证。密钥引用语法{store-id:secret-key}密钥存储与插件之间的接线方式采用统一的引用语法定义见 docs/includes/secret_usage.md{store-id:secret_key}其中store-id对应当前[[secretstores.jose]]配置块中的id参数secret_key是该存储中某个密钥文件的名称即写入密钥时的 key。该引用语法的正则校验在 config/secret.go 中定义// secretStorePattern is a regex to validate secret store IDs var secretStorePattern regexp.MustCompile(^\w$) // secretPattern is a regex to extract references to secrets store in a secret store var secretPattern regexp.MustCompile(\{(\w:\w)\})可见 store-id 与 secret_key 都要求为单词字符\w因此命名时应避免使用空格、连字符等特殊字符。并非所有插件、所有选项都支持密钥存储。判断某个插件是否支持需要查看该插件 README 中是否存在Secret store support章节里面会列出支持密钥引用的具体选项。例如plugins/outputs/influxdb/README.md中就包含此类说明其余插件同理。在支持密钥的选项如 password、token 等字段中直接写入{store-id:key}即可Telegraf 会在配置加载阶段解析并链接到对应密钥存储。实战操作用 telegraf secrets 命令管理密钥Telegraf 提供了专门的 CLI 子命令来管理所有已注册密钥存储中的密钥实现在 cmd/telegraf/cmd_secretstore.go。命令均需要传入包含密钥存储定义即[[secretstores.jose]]配置块的配置文件默认从配置文件位置自动加载。列出密钥# 列出所有已知存储中的全部密钥 key telegraf secrets list # 仅列出指定存储按 id 指定中的密钥 telegraf secrets list secretstore # 同时展示密钥值慎用会输出明文 telegraf secrets list --reveal-secret查看单个密钥telegraf secrets get secretstore mysecretkey输出格式为secretstore:mysecretkey value。从源码看cmd_secretstore.go该命令接受两个位置参数secret store ID与secret key。写入 / 修改密钥# 直接指定值 telegraf secrets set secretstore mysecretkey mysecretvalue # 省略值时交互式输入终端不回显 telegraf secrets set secretstore mysecretkey若指定 key 已存在则覆盖其值。注意set与remove命令要求存储实现telegraf.SecretStoreEditor接口即支持写入/删除的存储只读型存储会被拒绝提示secret store ... does not support setting secrets。删除密钥telegraf secrets remove secretstore mysecretkey删除一个不存在的 key 会返回错误——这与Remove的测试行为一致jose_test.go对不存在的 key 返回fs.ErrNotExist。源码剖析从 keyring 文件后端到接口实现该插件的核心实现非常精简单个 jose.go 文件约 115 行其底层依赖开源库github.com/99designs/keyring选用其中的FileBackend作为加密文件后端// Setup the actual keyring cfg : keyring.Config{ AllowedBackends: []keyring.BackendType{keyring.FileBackend}, FileDir: j.Path, FilePasswordFunc: promptFunc, } kr, err : keyring.Open(cfg)这里FileDir即配置中的pathFilePasswordFunc则是根据口令提供方式构造的提示函数。也就是说JOSE 算法保护这一能力实际由 keyring 的文件后端实现——它以配置目录为根每个密钥一个文件并使用口令对文件内容进行 JOSEJavaScript Object Signing and Encryption涵盖 JWS/JWE 等标准的加密格式加密。这也是所有密钥共用一个口令约束的直接来源。实现的接口与注册机制从源码可确认该插件实现了两层接口telegraf.SecretStore接口secretstore.go包含Get、List、GetResolver三个核心方法Get(key)从 keyring 中取出密钥的字节内容List()列出所有已知的密钥 key对应 keyring 的Keys()GetResolver(key)返回一个解析函数供配置在运行时惰性取值其中第二个返回值固定为false表示该解析器是静态的密钥不会随时间变化区别于 TOTP 等动态场景。telegraf.SecretStoreEditor可选接口secretstore.go提供Set创建或修改与Remove删除这也是secrets set/secrets remove命令能作用于该存储的原因。文件型存储天然可写因此该插件同时实现了这两组接口。插件通过init()完成注册jose.gofunc init() { secretstores.Add(jose, func(id string) telegraf.SecretStore { return Jose{ID: id} }) }注册表定义在 plugins/secretstores/registry.go而插件要真正进入 Telegraf 二进制还需要在 plugins/secretstores/all/jose.go 中以带 build-tag 的形式 import 注册。该 build tag 机制!custom || secretstores || secretstores.jose配合tools/custom_builder可以在定制构建时选择性裁剪插件体积。测试与行为验证仓库为插件提供了覆盖较全的单元测试plugins/secretstores/jose/jose_test.go可作为理解其行为边界的权威依据测试函数验证行为TestInitFailid/path缺失、口令引用不可解析时的初始化错误TestSetListGet写入多个密钥后目录中出现同名文件且为普通文件而非目录List/Get可完整还原TestRemove删除某个 key 后其余密钥不受影响被删密钥不可再读取TestRemoveNonExistent删除不存在的 key 返回fs.ErrNotExistTestResolver/TestResolverInvalid解析函数对存在的 key 返回静态值dynamicfalse对不存在的 key 返回错误TestGetNonExistent读取不存在的 key 报错The specified item could not be found in the keyringTestGetInvalidPassword用错误口令读取已有密钥时报integrity check failed印证了密钥文件的加密完整性校验机制其中TestGetInvalidPassword是理解安全模型的关键密钥文件带有完整性校验口令错误时不会返回乱码而是直接失败避免在配置层静默使用错误值。典型落地示例结合 InfluxDB 输出插件下面给出一个最小可运行的完整场景展示文件型 JOSE 密钥存储的典型用法编写密钥存储配置例如secrets.conf[[secretstores.jose]] id secretstore path /etc/telegraf/secrets # 口令也可以来自环境变量password ${TELEGRAF_SECRETS_PASSWORD}写入并验证密钥telegraf secrets set --config secrets.conf secretstore influxdb-token my-super-secret-token telegraf secrets list --config secrets.conf secretstore在支持密钥存储的插件选项中引用例如在 InfluxDB 输出插件配置中将原本明文写入的 token 替换为[[outputs.influxdb]] urls [http://localhost:8086] token {secretstore:influxdb-token}之后正常启动 Telegraf配置加载阶段会解析{...}引用从 JOSE 加密文件中解密出真实 token。注意运行时仍需正确提供口令配置文件中的password、环境变量或启动时交互输入否则密钥无法解析。适用前提与注意事项版本要求该插件自Telegraf v1.25.0起提供README 标注⭐ Telegraf v1.25.0且仅注册了jose一个存储类型使用前请确认版本。平台README 标注 all即所有平台均可使用。口令一致性与轮换同一实例下所有密钥共用口令更换口令意味着需重新写入全部密钥。引用命名store-id 与 secret_key 受\w正则约束建议使用字母、数字、下划线命名。动态密钥本存储返回静态解析器dynamicfalse不适合 TOTP 等需要周期性轮换取值的场景此类需求应选择支持动态解析的存储类型。开发扩展若需实现自己的密钥存储可参照 docs/SECRETSTORES.md 中的插件开发指南与接口约定SecretStore/SecretStoreEditor、secretstores.Add注册、sample.conf注入等。【免费下载链接】telegrafAgent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data.项目地址: https://gitcode.com/GitHub_Trending/te/telegraf创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考