로그인 영원히 무료 시작하기

인프라

설정 파일에 시크릿이 없어요.
로그에도 시크릿이 없어요.

모든 플랫폼, 모든 오케스트레이터, 모든 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를 사용해요. 모든 시크릿은 런타임에 처리되며 절대 저장되지 않아요.