インフラストラクチャ
設定にシークレットは存在しません。
ログにもシークレットは記録されません。
あらゆるプラットフォーム、あらゆるオーケストレーター、あらゆる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
マニフェストに値をハードコーディングせずに、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)"
ランタイムでの資格情報注入を行うには、プロキシをPod内のサイドカーコンテナとしてデプロイします。アプリケーションコンテナの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
Vaultに保存された鍵
$ 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。すべてのシークレットはランタイムで解決され、保存されることはありません。