
Облачное управление секретами для разработчиков — никогда не покидайте командную строку ради секретов.
:computer: Never leave your terminal for secrets
:pager: Create easy and clean workflows for working with cloud environments
:mag_right: Scan for secrets and fight secret sprawl
Никогда не покидайте свой терминал, чтобы использовать секреты при разработке, тестировании и сборке приложений.
Вместо собственных скриптов, токенов в файлах .zshrc, видимых EXPORT в вашей истории bash, неуместных файлов .env.production и прочего на вашей рабочей станции — просто используйте teller и подключите его к любому хранилищу секретов, ключей или облачному сервису, который вам нравится (Teller поддерживает Hashicorp Vault, AWS Secrets Manager, Google Secret Manager и многие другие).
Вы можете использовать Teller, чтобы привести в порядок собственное окружение или внедрить его в команде как процесс и лучшую практику.

tellerСкачать бинарный файл Скачайте бинарный файл из релизов
Сборка из исходников Этот способ позволит вам просмотреть исходный код, изучить его и самостоятельно собрать копию.
Это установит бинарный файл локально на вашей машине:
$ cd teller-cli
$ cargo install --path .
Создание новой конфигурации
$ teller new
? Select your secret providers ›
⬚ hashicorp_consul
⬚ aws_secretsmanager
⬚ ssm
⬚ dotenv
⬚ hashicorp
⬚ google_secretmanager
Затем отредактируйте вновь созданный .teller.yml, чтобы задать карты (maps) и ключи, необходимые для ваших провайдеров.
teller.ymlФайл YAML Teller описывает ваши провайдеры, и внутри каждого провайдера находится 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. По умолчанию Teller получает указанные данные от всех провайдеров.
Вручную экспортируете и настраиваете переменные окружения для запуска процесса с демонстрационной или боевой конфигурацией?
Обжигались на использовании .env.production и его раскрытии прямо в локальном проекте?
Используя teller и файл .teller.yml, который ничего не раскрывает чужим глазам, вы можете работать легко и бесшовно, без какого-либо риска и без необходимости в кавычках:
$ teller run --reset --shell -- node index.js
Эта команда выведет текущие переменные, которые подхватывает teller. Разумеется, от каждой переменной будут показаны только первые 2 буквы.
$ teller show
Зашифровываете секреты прямо в скриптах оболочки и dot-файлах?
В некоторых случаях имеет смысл выполнять eval переменных в текущей оболочке. Например, в вашем .zshrc гораздо разумнее использовать teller, а не хардкодить всё это прямо в сам файл .zshrc.
В этом случае вам нужно добавить следующее:
eval "$(teller sh)"
Устали собирать всевозможные переменные, настраивать их и переживать, что они также появятся в истории вашей оболочки?
Используйте эту однострочную команду отныне:
$ docker run --rm -it --env-file <(teller env) alpine sh
Teller может помочь вам бороться с расползанием секретов и захардкоженными секретами, а также стать лучшим инструментом продуктивности для работы с вашим хранилищем.
Он также может интегрироваться в ваш CI и служить инструментом безопасности shift-left для вашего пайплайна DevSecOps.
Ищите секреты, хранящиеся в вашем хранилище, в своём коде с помощью команды:
$ teller scan
Вы можете запускать его как линтер в вашем CI следующим образом:
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")}}
В тех случаях, когда вы хотите выполнить синхронизацию между провайдерами, вы можете сделать это с помощью teller copy.
Синхронизация по конкретному ключу карты
Вы можете использовать формат <имя провайдера>/<идентификатор карты>, чтобы скопировать карту от одного провайдера к другому:
$ 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 поддерживают сценарии записи, позволяющие записывать значения в провайдеры.
Помните, что эта возможность по-прежнему опирается на определения в вашем файле 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 позволяет отправлять данные одному или нескольким провайдерам одновременноПровайдеры Teller поддерживают удаление значений из провайдеров.
$ teller delete --providers new --map-id one DELETE_ME
Несколько замечаний:
--providers позволяет отправлять данные одному или нескольким провайдерам одновременноYAML Экспорт в формате YAMLXXX TODO: переписать, как работает команда export
Вы можете выполнить экспорт в формате YAML, подходящем для GCloud:
$ teller export yaml
Пример формата:
FOO: "1"
KEY: VALUE
JSON Экспорт в формате JSONВы можете выполнить экспорт в формате JSON, подходящем для передачи через jq или другие рабочие процессы:
$ teller export json
Пример формата:
{
"FOO": "1"
}
Список провайдеров и описание их значений конфигурации вы можете найти в документации.
docker on windows: если у вас есть тест на основе контейнеров, использующий Docker, обязательно исключите его на Windows с помощью #[cfg(not(windows))]
семантика ресурсов: при создании провайдеров придерживайтесь двух различных семантик — пусто и не найдено: если провайдер поддерживает явную семантику «не найдено» (404, NotFound и т.п.), используйте Error::NotFound. В противном случае, когда провайдер сигнализирует семантику «не найдено» как пустой набор данных, возвращайте пустой KV[] (т.е. не преобразуйте семантику «пусто» в «не найдено»).
Тестирование выполняется с помощью:
$ cargo test --all --all-features
И требует наличия Docker (или аналога) на вашей машине.
Всем контрибьюторам — это происходит благодаря вам, спасибо!
Teller следует Кодексу поведения CNCF
Copyright (c) 2024 @jondot. Дополнительные сведения см. в LICENSE.