使用 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 钥匙串配合使用。
-
Windows 与 Windows 凭据管理器控制面板交互。
-
-
插件支持
Telegraf 插件仅在特定字段中支持密钥存储。要了解插件是否支持密钥存储,请查看插件的 README 文件,并查找“Secret-store support”部分。其中详细说明了插件的密钥存储功能以及它支持哪些配置选项。
用户访问
在设置密钥时,另一个需要考虑的关键项是运行 Telegraf 的用户需要访问密钥。在创建密钥存储并以服务形式运行 Telegraf 时,请务必授予常用的 telegraf 用户访问这些密钥的权限。
入门清单
以下是将现有 Telegraf 配置迁移到支持密钥存储的配置的一组步骤
- 验证插件支持
- 如上所述,确保您要使用的插件支持密钥存储。
- 然后,确保插件支持您需要的配置选项。
- 选择密钥存储
- 决定是与操作系统密钥存储集成,还是使用外部存储。
- 将密钥存储添加到 Telegraf 配置
- 将适当的密钥存储插件添加到 Telegraf 配置。
- 每个密钥存储都需要一个唯一的 id,使用密钥的配置可以引用该 id。
- 设置引用密钥所需的任何配置选项。
- 将密钥保存到该存储
- Telegraf 的 secrets 子命令可以为某些(但不是全部)存储写入密钥。
- 确保插件成功存储了您的密钥,并且运行 Telegraf 的用户可以访问这些密钥。请注意,某些存储可能不会在重启后持久存在。
- 更新配置以使用密钥
- 最后,更新 Telegraf 配置以从硬编码凭据切换。
- 使用 @{secretstore_id:secret_key} 语法来引用配置值的密钥存储。
示例
以下是使用不同密钥存储插件的一些示例
Linux 操作系统示例
以下示例在 Linux 机器上使用用户的内核密钥环设置密钥。
首先,更新 Telegraf 配置以包含 OS 密钥存储插件。以下示例为密钥存储指定 ID “mystore”,稍后我们将使用该 ID 引用密钥。因为您可以拥有多个密钥存储,所以 ID 是使存储具有唯一性的标识符。keyring 值是用户要使用的内核密钥环
[[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 配置随后在 secrets 下引用该文件。然后更新 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":
开始使用密钥存储和 Telegraf
这篇文章介绍了在 Telegraf 中使用新的密钥存储功能的多种方法。考虑一下您可以在 Telegraf 中的哪些地方使用此功能,并立即尝试一下!