인프라
설정 파일에 시크릿이 없어요.
로그에도 시크릿이 없어요.
모든 플랫폼, 모든 오케스트레이터, 모든 CI 러너에서 사용할 수 있어요. 프록시는 HTTP 호출을 수행하는 모든 것과 연동되고, CLI는 셸을 실행할 수 있는 모든 것과 연동돼요. 시스템이 경력보다 오래된 것이더라도 문제없이 작동해요.
프록시는 범용 통합 수단이에요.
워크로드가 HTTPS 호출을 수행한다면 Clavitor 프록시가 네트워크 계층에서 자격 증명을 주입해요. 코드 변경도, SDK도 필요 없어요. 환경 변수, 설정 파일, 로그에 시크릿이 남지 않아요. HTTPS_PROXY를 설정하면 기존 코드를 그대로 사용할 수 있으며, 프록시가 요청이 머신을 떠나기 전에 요청 헤더의 clavitor:// 참조를 확인해요.
$ export HTTPS_PROXY=http://localhost:1983 $ curl -H "Authorization: Bearer clavitor://Stripe API/key" \ https://api.stripe.com/v1/charges # The agent never sees sk_live_... — only clavitor:// appears in logs
컨테이너
Docker 및 Kubernetes
Docker Compose
호스트에서 Clavitor 프록시를 실행하고 컨테이너가 이를 가리키도록 설정해요. 자격 증명이 아웃바운드 요청에 투명하게 주입되어 환경 변수에 시크릿이 남지 않고, 이미지에 시크릿이 포함되지 않아요.
# On the Docker host $ clavitor-proxy serve &
# docker-compose.yml — containers route through the host-mode proxy
services:
app:
environment:
- HTTPS_PROXY=http://host.docker.internal:1983
extra_hosts:
- "host.docker.internal:host-gateway"또는 시작 시 render를 사용해 설정 템플릿을 처리해요:
$ clavitor-cli render app.config.template.yml | docker compose -f - up
Kubernetes
매니페스트에 값을 하드코딩하지 않고 볼트에서 시크릿을 생성해요:
$ kubectl create secret generic app-secrets \ --from-literal=db-pass="$(clavitor-cli get 'Production DB' --field password)" \ --from-literal=api-key="$(clavitor-cli get 'Stripe API' --field key)"
런타임 자격 증명 주입을 위해 프록시를 파드의 사이드카 컨테이너로 배포해요. 애플리케이션 컨테이너는 HTTPS_PROXY를 사이드카로 설정해요. 자격 증명은 요청별로 처리되며 etcd에 절대 저장되지 않아요.
IaC
Terraform, Ansible, Pulumi
Terraform
terraform apply 전에 자격 증명을 프로바이더 환경으로 처리해요. AWS 프로바이더는 표준 환경 변수에서 자격 증명을 읽는데, Clavitor가 인라인으로 채워주므로 .tf 파일에 어떤 시크릿도 언급되지 않아요.
$ export AWS_ACCESS_KEY_ID=$(clavitor-cli get "AWS Root" --field access_key_id) $ export AWS_SECRET_ACCESS_KEY=$(clavitor-cli get "AWS Root" --field secret_key) $ terraform apply
코드에서 provider "aws" {} 블록은 비어 있는 상태로 유지돼요. 환경 변수 자격 증명을 지원하는 모든 Terraform 프로바이더(대부분의 프로바이더)에 동일한 패턴이 적용돼요.
Ansible
- name: Get database password
command: clavitor-cli get "Production DB" --field password
register: db_pass
no_log: true
- name: Configure app
template:
src: app.conf.j2
vars:
db_password: "{{ db_pass.stdout }}"Pulumi
import { execSync } from 'child_process';
const dbPass = execSync('clavitor-cli get "Production DB" --field password').toString().trim();
new aws.rds.Instance("db", { masterPassword: new pulumi.secret(dbPass) });CI/CD
GitHub Actions, GitLab CI, Jenkins
아래 모든 예시에서 토큰은 stdin으로 파이프돼요. 이렇게 하면 argv에서 제외되어 /proc/<pid>/cmdline이나 빌드 로그에 나타나지 않아요.
GitHub Actions
- name: Deploy
env:
CLAVITOR_TOKEN: ${{ secrets.CLAVITOR_TOKEN }}
run: |
echo "$CLAVITOR_TOKEN" | clavitor-cli init
kubectl create secret generic app-secrets \
--from-literal=api-key="$(clavitor-cli get 'Deploy Token' --field key)" \
--dry-run=client -o yaml | kubectl apply -f -GitLab CI
deploy:
script:
- echo "$CLAVITOR_TOKEN" | clavitor-cli init
- clavitor-cli get "Deploy Key" --field private_key | ssh-add -
- ssh deploy@production "systemctl restart app"Jenkins
pipeline {
stages {
stage('Deploy') {
steps {
sh 'echo "$CLAVITOR_TOKEN" | clavitor-cli init'
sh 'clavitor-cli get "Deploy Key" --field private_key | ssh-add -'
sh 'ssh deploy@production "systemctl restart app"'
}
}
}
}SSH
볼트에 저장된 키
$ clavitor-cli get "Deploy Key" --field private_key | ssh-add - $ ssh deploy@production
개인 키는 ssh-add로 직접 파이프돼요. 디스크에 저장되지 않고, 셸 기록에 나타나지 않으며, 세션이 끝나면 에이전트에서 삭제돼요.
레거시 시스템
HTTP 호출을 수행한다면 작동해요.
프록시는 요청을 만든 언어를 가리지 않아요. COBOL, FORTRAN, Perl, Visual Basic, 30년 된 배치 작업 등 프로세스가 HTTPS 요청을 수행하기만 하면 프록시가 이를 가로채 clavitor:// 참조를 처리하고 실제 자격 증명을 주입해요. 코드 변경은 필요 없어요.
HTTP 호출을 할 수 없는 시스템의 경우, 프로세스가 시작되기 전에 clavitor-cli render를 사용해 설정 템플릿을 처리해요. 템플릿은 어디에 저장해도 안전해요. 처리된 출력은 stdin이나 권한이 제한된 임시 파일로 전달돼요.
# Resolve credentials before the batch job starts $ clavitor-cli render db-connect.template.cfg > /tmp/db-connect.cfg $ chmod 600 /tmp/db-connect.cfg $ /opt/legacy/batch-job --config /tmp/db-connect.cfg $ rm /tmp/db-connect.cfg
패턴은 항상 동일해요.
스크립트와 파이프라인에는 CLI를, HTTP 워크로드에는 프록시를, 설정 파일에는 Render를 사용해요. 모든 시크릿은 런타임에 처리되며 절대 저장되지 않아요.