
개발자를 위한 클라우드 네이티브 시크릿 관리 - 시크릿을 위해 커맨드 라인을 떠나지 마세요.
:computer: 시크릿을 위해 터미널을 떠나지 마세요
:pager: 클라우드 환경 작업을 위한 쉽고 깔끔한 워크플로우를 만드세요
:mag_right: 시크릿을 스캔하고 시크릿 확산을 방지하세요
앱을 개발하고, 테스트하고, 빌드하는 동안 시크릿을 사용하려고 터미널을 떠날 필요가 없습니다.
커스텀 스크립트, .zshrc 파일에 있는 토큰, bash 히스토리에 노출된 EXPORT, 워크스테이션 여기저기에 흩어진 .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을 편집해 프로바이더에 필요한 맵과 키를 설정하세요.
teller.yml 살펴보기teller YAML은 프로바이더를 설명하며, 각 프로바이더 안에는 다음을 설명하는 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는 기본적으로 모든 프로바이더에서 지정된 데이터를 가져옵니다.
데모/프로덕션 유사 환경으로 프로세스를 실행하기 위해 환경 변수를 수동으로 export하고 설정하고 계신가요?
.env.production을 사용하다가 로컬 프로젝트에 그대로 노출되는 문제를 겪어 보셨나요?
엿보는 눈에 아무것도 노출하지 않는 teller와 .teller.yml 파일을 사용하면 위험 없이 유연하고 매끄럽게 작업할 수 있고 따옴표도 필요 없습니다:
$ teller run --reset --shell -- node index.js
이 명령은 teller가 가져오는 현재 변수를 출력합니다. 물론 각 변수의 앞 두 글자만 표시됩니다.
$ teller show
셸 스크립트와 dotfile에 시크릿을 하드코딩하고 계신가요?
어떤 경우에는 현재 셸에 변수를 eval하는 것이 합리적입니다. 예를 들어 .zshrc에서는 teller를 사용하는 것이 모든 값을 .zshrc 파일에 직접 하드코딩하는 것보다 훨씬 합리적입니다.
이 경우 다음과 같이 추가하세요:
eval "$(teller sh)"
온갖 변수를 가져와서 설정하고, 그것들이 셸 히스토리에 남을까 걱정되시나요?
이제부터는 다음 원라이너를 사용하세요:
$ 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를 인프라 전반의 마스킹 도구로 사용할 수 있으며, 프로세스 출력을 마스킹하면서 프로세스를 실행하고 로그와 실시간 로그 테일을 정리할 수도 있습니다.
프로세스 출력, 테일 또는 로그를 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을 생략하면 stdout으로 출력합니다.
커스텀 템플릿을 채울 수 있습니다:
$ teller template --in config-templ.t
템플릿 형식은 Tera이며, liquid나 handlebars와 매우 유사합니다.
다음은 예시 템플릿입니다:
production_var: {{ key(name="PRINT_NAME")}}
production_mood: {{ key(name="PRINT_MOOD")}}
프로바이더 간에 동기화하려는 경우 teller copy로 처리할 수 있습니다.
특정 매핑 키 동기화
<provider name>/<map id> 형식을 사용하여 한 프로바이더의 매핑을 다른 프로바이더로 복사할 수 있습니다:
$ 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 프로바이더는 프로바이더 안에 값을 쓸 수 있는 write 사용 사례를 지원합니다.
이 기능도 여전히 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 YAML 형식으로 내보내기XXX TODO: export 명령이 동작하는 방식을 재작성하세요.
YAML 형식으로 내보낼 수 있으며, GCloud에 적합합니다:
$ teller export yaml
형식 예시:
FOO: "1"
KEY: VALUE
JSON JSON 형식으로 내보내기JSON 형식으로 내보낼 수 있으며, jq나 다른 워크플로우에 파이프하기에 적합합니다:
$ teller export json
형식 예시:
{
"FOO": "1"
}
프로바이더 및 해당 구성 값 목록은 문서에서 확인할 수 있습니다.
Windows에서 Docker: Docker를 사용하는 컨테이너 기반 테스트가 있다면 #[cfg(not(windows))]를 사용하여 Windows에서 제외하세요.
리소스 의미론: 프로바이더를 빌드할 때 _empty_와 _not found_를 서로 다른 의미론으로 취급하세요. 프로바이더가 명시적인 "not found" 의미론(404, NotFound 등)을 지원하면 Error::NotFound를 사용하세요. 프로바이더가 "not found" 의미론을 빈 데이터 묶음으로 전달하는 경우 빈 KV[]를 반환하세요(즉, "empty" 의미론을 "not found"로 변환하지 마세요).
테스트는 다음 명령으로 수행합니다:
$ cargo test --all --all-features
그리고 머신에 Docker(또는 이에 상응하는 도구)가 필요합니다.
모든 기여자 여러분 - 여러분이 이 프로젝트를 가능하게 해 주셨습니다. 감사합니다!
Teller는 CNCF 행동 강령을 따릅니다.