サインイン ずっと無料 はじめる

Infrastructure

Zero secrets in config.

Zero secrets in logs.

すべてのプラットフォーム、すべてのオーケストレータ、すべての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
# エージェントはsk_live_...を表示しません。ログにはclavitor://のみが表示されます

Containers

DockerとKubernetes

Docker Compose

ホスト上でClavitorプロキシを実行し、コンテナをそこへ向けるだけです。資格情報は送信リクエストに透過的に注入されます。環境変数にシークレットはなく、イメージにシークレットを埋め込む必要もありません。

# Dockerホスト上で
$ clavitor-proxy serve &
# docker-compose.yml — コンテナはホストモードプロキシを経由します
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

マニフェストに値をハードコーディングせずに、Vaultからシークレットを作成します:

$ 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: データベースパスワードを取得
  command: clavitor-cli get "Production DB" --field password
  register: db_pass
  no_log: true

- name: アプリケーションを設定
  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

Vaultに保存されたキー

$ clavitor-cli get "Deploy Key" --field private_key | ssh-add -
$ ssh deploy@production

秘密鍵はssh-addに直接パイプされます。ディスクに書き込まれることも、シェル履歴に表示されることもありません。セッション終了時にはエージェントからクリアされます。

Legacy systems

HTTP呼び出しを行うなら、動作します。

プロキシは、どの言語からリクエストが行われたかを気にしません。COBOL、FORTRAN、Perl、Visual Basic、30年前のバッチジョブ——プロセスがHTTPSリクエストを行う場合、プロキシはそれを傍受し、clavitor://参照を解決し、実際の資格情報を注入します。コードの変更は不要です。

HTTP呼び出しを行えないシステムには、clavitor-cli renderを使用して、プロセス開始前に設定テンプレートを解決します。テンプレートはどこに保存しても安全です。解決された出力は、制限された権限を持つstdinまたは一時ファイルに出力されます。

# バッチジョブ開始前に資格情報を解決
$ 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。すべてのシークレットはランタイムに解決され、保存されることはありません。