AI 에이전트에게 비밀을 전달해도 로그에 남지 않는, 로컬 완결 시크릿 매니저 vlt
요약
AI 에이전트에게 API 키 등 민감한 비밀을 전달할 때 발생하는 보안 문제를 해결하는 로컬 시크릿 매니저 'vlt'를 소개합니다. vlt는 비밀을 암호화된 vault에 저장하고, 실행 시에만 값을 주입하며, 출력되는 과정에서 노출될 수 있는 비밀 정보까지 자동으로 가려주는 CLI 도구입니다.
핵심 포인트
- 비밀을 로컬 AES-256-GCM Vault에 안전하게 보관합니다.
- `.env` 파일에는 실제 값 대신 `vlt://...` 형태의 참조만 사용합니다.
- 실행 시 환경 변수로 주입하며, 파이프나 AI 에이전트 출력에서도 비밀을 자동으로 마스킹합니다.
- macOS 전용이며, macOS 키체인에 마스터 키를 저장하여 보안성을 높였습니다.
Claude Code나 Cursor 같은 AI 에이전트에게 개발을 맡기면 API 키 처리가 문제입니다.
.env파일에 평문으로 두면, 에이전트가 파일을 읽는 순간 대화 기록에 남습니다. - 환경 변수로 전달해도, 에이전트가env나 디버그 출력을 실행하면 값이 그대로 출력됩니다. - 에이전트가 읽은 출력은 대화 로그나 경우에 따라 서비스 측 기록에도 남아 있습니다.
그래서 비밀을 암호화된 vault에 보관하고, 실행할 때만 주입하며, 출력에 나타나면 가리는 CLI를 만들었습니다. 이름은 vlt입니다.
할 수 있는 것들
- 비밀을 암호화한 로컬의 vault(AES-256-GCM)에 보관합니다. 마스터 키는 macOS 키체인에 있습니다.
.env에는 값 대신vlt://openai/api-key와 같은 비밀 참조만 작성합니다. 커밋해도 유출되지 않습니다. -vlt run으로 명령어 실행 시에만 값을 주입합니다. - 출력이 터미널이 아닐 때, 출력에 섞인 비밀을 파이프, CI, AI 에이전트의 셸 실행 대상입니다.<concealed by vlt>로 대체됩니다. - 클라우드도 계정도 필요 없습니다. MIT 라이선스이며, macOS 전용입니다.
설치
brew install bayfront-software/tap/vlt
vlt init
Homebrew는 소스에서 빌드하므로, 설치나 업데이트 후 첫 실행 시 키체인 접근 권한을 요청합니다. '항상 허용'을 선택해 주세요.
사용법
비밀을 저장하고 참조로 전달하기
vlt set openai/api-key sk-proj-xxxxxxxx --type api_credential
.env에는 참조만 작성합니다.
OPENAI_API_KEY=vlt://openai/api-key
실행할 때 해결하여 주입합니다.
vlt run --env-file .env -- python app.py
출력에 나타난 비밀은 가려집니다
주입된 값을 일부러 표시해 봅니다. 출력을 파이프로 전달하면, 에이전트의 셸 실행과 마찬가지로 '터미널이 아닌' 상태가 됩니다.
$ vlt run --env envs/myapp -- sh -c 'echo
参照内の`${APP_ENV:-dev}`는 실행 시 환경 변수로 전개됩니다. 개발용과 운영용의 전환을 항목을 나누지 않고 작성할 수 있습니다. direnv를 사용하고 있다면, `.envrc`에 한 줄만 적어주면 됩니다.
eval "$(vlt env --env envs/myapp)"
### 그 외 기능
- **항목 종류:** 1Password를 참고하여 로그인, API 인증 정보, SSH 키, 데이터베이스, 서버, 신용카드 등 총 14가지 종류가 있습니다. `vlt types`로 목록을 확인할 수 있습니다. - **일회용 비밀번호(TOTP):** `vlt totp github/login` 또는 `vlt read 'vlt://github/login?attribute=otp'`를 통해 현재 코드를 반환합니다. - **템플릿에 임베딩:** `vlt inject -i config.tpl -o config.yml`로 `{{ vlt://… }}`을 값으로 대체할 수 있습니다 (출력 권한은 600). - **스크립트용:** `vlt list --json`, `vlt show --json` (가려진 값은 null), 그리고 셸 완성 기능도 제공됩니다. - **휴지통:** 삭제된 항목은 30일 동안 남아 있으며, `vlt restore`로 복구할 수 있습니다.
## 설계에서 포기한 것들
**vault는 이 Mac 안에서만 열 수 있습니다.** 마스터 키가 키체인에만 존재하기 때문에, `vault.db`를 복사해도 백업이 되지 않습니다. 다른 Mac으로 옮길 때는 패스프레이즈로 암호화된 `.vltx` (Argon2id + AES-256-GCM)로 내보냅니다.
vlt export ~/backup.vltx # 패스프레이즈만 있으면, 다른 Mac에서도 복원 가능
**동기화도 팀 공유도 하지 않습니다.** 기기 간 동기화를 추가하면 서버와 새로운 키 관리가 필요해지며, '이 Mac 밖에는 비밀을 내보내지 않는다'는 전제가 무너집니다. 팀에서 공유하고 싶다면, 1Password나 sops 같은 도구가 더 적합합니다.
**제3자의 감사는 받지 않았습니다.** 암호화 부분은 표준적인 구현(RustCrypto의 aes-gcm과 argon2) 조합에 그치고 있습니다. 테스트는 CI에서 진행하지만, 업무상 중요한 비밀을 맡기기 전에 소스를 읽어 판단해 주십시오.
## 다른 도구와의 차이점
| vlt | 1Password CLI (op) | dotenvx |
|---|---|---|
| 저장 위치 | 로컬만 가능 | 1Password 클라우드 | 암호화된 .env를 git에 배치 |
| ... |
개발자 혼자 개발하며, 클라우드에 비밀을 맡기지 않고 AI 에이전트와 안전하게 작업하고 싶은 사람들을 위한 도구입니다.
## 마무리
버그나 요청 사항은 GitHub의 Issue로 부탁드립니다. 도움이 되었다면, GitHub Sponsors를 통해 개발 지원을 해주시면 큰 힘이 됩니다.
### 토론

AI 자동 생성 콘텐츠
본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기