:computer: 使用机密信息时,永远不必离开你的终端
:pager: 为云环境工作流创建简单而整洁的流程
:mag_right: 扫描机密信息,对抗机密泛滥
开发、测试和构建应用时,无需离开终端即可使用机密信息。
与其在工作站中四处使用自定义脚本、.zshrc 文件中的令牌、bash 历史中可见的 EXPORT、放错位置的 .env.production 文件等,不如直接使用 teller,并将其连接到任何你喜欢的保险库(vault)、密钥存储或云服务(Teller 支持 Hashicorp Vault、AWS Secrets Manager、Google Secret Manager 等众多服务)。
你可以使用 Teller 整理自己的环境,也可以作为团队的工作流程和最佳实践。

teller 快速入门下载二进制文件
从 releases 获取二进制文件
从源码构建
使用此方法可以让你查看源代码、进行审查,并自行构建一份副本。
这将在你的机器上本地安装二进制文件:
$ cd teller-cli
$ cargo install --path .
创建新配置
$ teller new
? Select your secret providers ›
⬚ hashicorp_consul
⬚ aws_secretsmanager
⬚ ssm
⬚ dotenv
⬚ hashicorp
⬚ google_secretmanager
然后,编辑新创建的 .teller.yml,为你的 provider 设置所需的 map 和 key。
teller.ymlteller 的 YAML 描述了你的 provider,并且在每个 provider 内有一个 map,用于描述:
id 将用于后续操作以下是一个示例配置文件。请注意,它还包含模板构造——例如在加载配置时获取环境变量:
providers:
hashi_1:
kind: hashicorp
maps:
- id: test-load
path: /{{ get_env(name="TEST_LOAD_1", default="test") }}/users/user1
# if empty, map everything
# == means map to same key name
# otherwise key on left becomes right
# in the future: key_transform: camelize, snake_case for automapping the keys
keys:
GITHUB_TOKEN: ==
mg: FOO_BAR
dot_1:
kind: dotenv
maps:
- id: stg
path: VAR_{{ get_env(name="STAGE", default="development") }}
现在你可以通过 hashi_1 或 dot_1 来引用这些 provider。默认情况下,Teller 会从所有 provider 拉取指定数据。
是否还在手动导出并设置环境变量,以使用类似演示/生产的环境运行进程?
曾经因为使用 .env.production 并将其暴露在本地项目中而踩过坑?
使用 teller 和一个不向窥探者暴露任何内容的 .teller.yml 文件,你可以零风险地流畅无缝工作,也无需引号:
$ teller run --reset --shell -- node index.js
这将输出 teller 当前获取到的变量。当然,每个变量只会显示前两个字母。
$ teller show
是否在 shell 脚本和 dotfiles 中硬编码了机密信息?
在某些情况下,将变量 eval 到当前 shell 中是合理的。例如,在你的 .zshrc 中,使用 teller 比把所有这些硬编码到 .zshrc 文件中要合理得多。
在这种情况下,你应该添加以下内容:
eval "$(teller sh)"
是否厌倦了获取各种变量并进行设置,同时还担心它们出现在你的 shell 历史记录中?
从现在开始,使用这一行命令:
$ docker run --rm -it --env-file <(teller env) alpine sh
Teller 可以帮助你对抗机密泛滥和硬编码机密,同时也是使用你的保险库时最高效的生产力工具。
它还可以集成到你的 CI 中,作为 DevSecOps 流水线的左移(shift-left)安全工具。
通过运行以下命令,在代码中查找存储在保险库中的机密:
$ teller scan
你可以像这样在 CI 中将其作为 linter 运行:
run: teller scan --error-if-found
如果发现敏感信息,它将使你的构建失败(返回退出码 1)。
你还可以使用 --json 将结果导出为 JSON,并使用 -b 扫描二进制文件。
你可以将 teller 作为基础设施中的脱敏工具,在运行进程时对其输出进行脱敏,同时还能清理日志和实时日志输出。
将任何进程输出、tail 或日志通过管道传给 teller,即可实时脱敏:
$ cat some.log | teller redact
它同样适用于 tail -f:
$ tail -f /var/log/apache.log | teller redact
最后,如果你有一些需要脱敏的文件,也可以这样操作:
$ teller redact --in dirty.csv --out clean.csv
如果你省略 --in,Teller 将从 stdin 读取;如果省略 --out,Teller 将输出到 stdout。
你可以填充自定义模板:
$ teller template --in config-templ.t
模板格式是 Tera,它与 liquid 或 handlebars 非常相似。
以下是一个示例模板:
production_var: {{ key(name="PRINT_NAME")}}
production_mood: {{ key(name="PRINT_MOOD")}}
当你需要在 providers 之间同步数据时,可以使用 teller copy 来完成。
特定映射键同步
你可以使用 <provider name>/<map id> 格式将某个 provider 的映射复制到另一个 provider:
$ teller copy --from source/dev --to target/prod,<...>
在这个简单的示例中,我们使用以下配置文件:
providers:
dot1:
kind: dotenv
maps:
- id: one
path: one.env
dot2:
kind: dotenv
maps:
- id: two
path: two.env
这将:
默认情况下,复制会 更新 目标映射(upsert 数据);如果你想替换,可以使用 --replace。
Teller 的 provider 支持 write 用例,允许将值 写入 provider。
请记住,此功能仍围绕你的 teller.yml 文件中的定义展开:
$ teller put --providers new --map-id one NEW_VAR=s33kret
在这个示例中,使用了以下配置:
providers:
new:
kind: dotenv
maps:
- id: one
path: new.env
几点说明:
key=value 格式的键值对,你可以一次性指定多对--providers 标志可以同时推送到一个或多个 providerTeller 的 provider 支持从 provider 中 删除 值。
$ teller delete --providers new --map-id one DELETE_ME
几点说明:
--providers 标志可以同时推送到一个或多个 providerYAML:以 YAML 格式导出XXX TODO:重写 export 命令的工作方式
你可以以 YAML 格式导出,适用于 GCloud:
$ teller export yaml
示例格式:
FOO: "1"
KEY: VALUE
JSON:以 JSON 格式导出你可以以 JSON 格式导出,适用于通过 jq 或其他工作流进行管道处理:
$ teller export json
示例格式:
{
"FOO": "1"
}
你可以在文档中获取 provider 列表及其描述的配置值。
Windows 上的 docker:如果你有使用 Docker 的基于容器的测试,请确保使用 #[cfg(not(windows))] 在 Windows 上排除它。
资源语义:在构建 provider 时,应将 empty(空)和 not found(未找到)作为两种不同语义处理:如果 provider 支持显式的“未找到”语义(404、NotFound 等),请使用 Error::NotFound。否则,当 provider 用空数据包表示“未找到”语义时,返回空的 KV[](即不要将“空”的语义转换成“未找到”)。
测试通过以下命令进行:
$ cargo test --all --all-features
并且需要你的机器上安装 Docker(或等效工具)。
感谢所有贡献者——是你们让这一切成为可能,谢谢!
Teller 遵循 CNCF 行为准则