使用 Telegraf 存储密钥

导航至

Telegraf 是一个开源的插件驱动型代理,用于收集、处理、聚合和写入时序数据。Telegraf 依赖于用户提供的配置文件来定义各种插件和数据流。这些配置可能需要密钥或其他敏感数据。

新的密钥存储插件类型允许用户存储密钥并在他们的 Telegraf 配置文件中引用这些密钥。这些存储减轻了在 Telegraf 配置文件中直接存储密钥的需求。

以下文章概述了 Telegraf 的密钥存储功能,并包含了一些实际示例。

密钥存储

截至 v1.27,Telegraf 提供了几个密钥存储插件可供选择

  • Docker

    • 当运行 Docker 时,此插件可以读取 Docker 提供的密钥。

    • 这些是在容器上存储在 /run/secrets 的值。

  • HTTP

    • 从 HTTP 端点查询密钥。

    • 数据格式预期为扁平的 JSON 对象。

    • 支持多种加密方法和认证。

  • JOSE

    • 使用 JavaScript 对象签名和加密算法进行本地加密文件。

    • 用户可以使用 telegraf secrets set 创建密钥。

  • OS

    • 与特定于操作系统的密钥存储进行交互。

      • Linux 使用内核密钥环。

      • macOS 与 macOS Keychain 一起工作。

      • Windows 与 Windows 凭证管理器控制面板进行交互。

插件支持

Telegraf插件仅支持具有特定字段的秘密存储。要了解插件是否支持秘密存储,请查看插件的README文件,并查找“秘密存储支持”部分。这部分详细说明了插件的秘密存储功能和它支持哪些配置选项。

用户访问

在设置秘密时,另一个需要考虑的关键点是运行Telegraf的用户需要访问这些秘密。当创建秘密存储并以服务方式运行Telegraf时,请确保给常用telegraf用户访问这些秘密的权限。

入门清单

以下是将现有Telegraf配置迁移到支持秘密存储的配置的步骤集

  • 验证插件支持
    • 如上所述,确保您想使用的插件支持秘密存储。
    • 然后,确保插件支持您需要的配置选项。
  • 选择秘密存储
    • 决定您是要与操作系统秘密存储集成还是使用外部存储。
  • 将秘密存储添加到Telegraf配置
    • 将适当的秘密存储插件添加到Telegraf配置中。
    • 每个秘密存储都需要一个唯一的id,这样使用秘密的配置就可以引用。
    • 设置任何必要的配置选项以引用秘密。
  • 将秘密保存到该存储
    • Telegraf的秘密子命令可以写入某些存储的秘密,但不能写入所有存储的秘密。
    • 确保插件成功存储了您的秘密,并且Telegraf运行用户可以访问这些秘密。请注意,某些存储在重启后可能不会持续。
  • 更新配置以使用秘密
    • 最后,更新Telegraf配置以切换到硬编码的凭据。
    • 使用@{secretstore_id:secret_key}语法来引用配置值的秘密存储。

示例

以下是一些使用不同秘密存储插件的示例

Linux OS示例

以下是在Linux机器上使用用户内核密钥环设置秘密的示例。

首先,更新Telegraf配置以包括OS秘密存储插件。以下给秘密存储分配了ID“mystore”,我们将在稍后引用这些秘密。由于您可以拥有多个秘密存储,ID是使存储在识别目的上独特的标识。

[[secretstores.os]]
   id = "mystore"
   keyring = "telegraf"

要创建秘密,请使用keyctl或Telegraf二进制文件。secrets set子命令接受上面使用的密钥环名称和秘密名称。然后用户会被提示输入秘密信息,以避免将秘密放入他们的shell历史记录中

$ telegraf --config config.toml secrets set mystore influx_token
Enter secret value:

最后,更新Telegraf配置以引用新的秘密

[[outputs.influxdb_v2]]
  urls = ["http://127.0.0.1:8086"]
  token = "@{mystore:influx_token}"
  organization = "myorg"
  bucket = "mybucket"

Docker示例

以下是通过Docker秘密提取秘密的示例。Docker秘密存储与其他存储不同,因为它仅在运行时读取Docker本身提供的秘密。这些秘密挂载到容器的/run/secrets目录。用户不能使用Telegraf设置Docker秘密。

以下是将秘密存储在文件中,然后Docker Compose配置在秘密下引用该文件的示例。然后更新Telegraf服务以使用该秘密

services:
  telegraf:
    image: telegraf:latest
    secrets:
      - influx_token
    user: “${USERID}” # Use the value of `id -u` of the user launching the docker-compose

secrets:
  influx_token:
    file: influx_token.txt

用于访问Docker秘密的最终Telegraf配置类似于以下代码

[[secretstores.docker]]
  id = "docker_store"

[[outputs.influxdb_v2]]
  urls = ["http://127.0.0.1:8086"]
  token = "@{docker_store:influx_token}"
  organization = "myorg"
  bucket = "mybucket"

HTTP 示例

以下是一个通过 HTTP 端点拉取密钥的示例。

HTTP 密钥存储插件可以调用具有各种身份验证或加密选项的 HTTP 端点。插件期望密钥以扁平的键值 JSON 文件形式存在,其中键是密钥名称,值是实际的密钥。以下是一个格式示例

{
    “influx_token_dev”: “6702bf65b31941f59dfcf09afd94b1aa”,
    “influx_token_test”: “1af461d979344253824cbbaf88dd2563”,
    “influx_token_prod”: “56372127fe944e68a497bad0a6e33663”
}

要将此添加到 Telegraf,请提供存储的唯一 ID 和查询密钥的 URL

[[secretstores.http]]
  id = "http_store"
  url = "http://127.0.0.1/secrets"

同样,插件有许多可用的选项,包括:自定义头、载体令牌、基本身份验证、oauth2、代理、TLS 配置、cookie 支持,等等。您可以将加密密钥发送到 Telegraf,并使用适当的加密和解密密钥来解密密钥。

最后,将密钥的引用添加到配置中

token = "@{http_store:influx_token_prod}"

JOSE 示例

以下是一个通过 JavaScript 对象签名和加密(JOSE)算法拉取密钥的示例。此密钥存储将密钥以加密文件的形式本地存储,每个密钥一个文件。要解密文件,您必须在 Telegraf 配置文件中提供密码,或者在运行 Telegraf 时交互式输入密码。因此,此密钥存储选项更适合作为隐蔽性安全。

[[secretstores.jose]]
  id = "jose_store"
  path = "/etc/telegraf/secrets"

要创建密钥,用户可以使用 Telegraf 二进制文件

$ telegraf --config config.toml secrets set jose_store influx_token
Enter secret value:
Enter passphrase to unlock "/etc/telegraf/secrets":
$ ls /etc/telegraf/secrets
influx_token

然后,像其他密钥存储一样,更新 Telegraf 配置以引用密钥

token = "@{jose_store:influx_token}"

在启动时,如果配置文件中没有提供存储的密码,则用户将被提示输入密码

$ ./telegraf --config config.toml 
Enter passphrase to unlock "/etc/telegraf/secrets":

开始使用 Secret Stores 和 Telegraf

本文介绍了在 Telegraf 中使用新密钥存储功能的一些方法。考虑您在 Telegraf 中可能使用的此功能,并尝试今天使用它!