使用 Telegraf 存储密钥
作者:Josh Powers / 产品
2023 年 6 月 15 日
导航至
Telegraf 是一个开源的插件驱动型代理,用于收集、处理、聚合和写入时序数据。Telegraf 依赖于用户提供的配置文件来定义各种插件和数据流。这些配置可能需要密钥或其他敏感数据。
新的密钥存储插件类型允许用户存储密钥并在他们的 Telegraf 配置文件中引用这些密钥。这些存储减轻了在 Telegraf 配置文件中直接存储密钥的需求。
以下文章概述了 Telegraf 的密钥存储功能,并包含了一些实际示例。
密钥存储
截至 v1.27,Telegraf 提供了几个密钥存储插件可供选择
-
-
当运行 Docker 时,此插件可以读取 Docker 提供的密钥。
-
这些是在容器上存储在
/run/secrets
的值。
-
-
-
从 HTTP 端点查询密钥。
-
数据格式预期为扁平的 JSON 对象。
-
支持多种加密方法和认证。
-
-
-
使用 JavaScript 对象签名和加密算法进行本地加密文件。
-
用户可以使用
telegraf secrets set
创建密钥。
-
-
-
与特定于操作系统的密钥存储进行交互。
-
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 中可能使用的此功能,并尝试今天使用它!