基础架构
配置中无密钥。
日志中无密钥。
每个平台、每个编排器、每个 CI 运行器。该代理适用于任何发出 HTTP 调用的系统。该 CLI 适用于任何能执行 shell 命令的系统。即使您的系统比您的职业生涯更古老,它仍然有效。
代理是通用的集成方式。
如果您的工作负载发出 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://
容器
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
从保险库创建 Secret,无需在清单中硬编码值:
$ 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: 获取数据库密码
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
在下面的每个示例中,令牌都通过标准输入传输 — 使其远离 argv,这样它就不会出现在 /proc/<pid>/cmdline 或构建日志中。
GitHub Actions
- name: 部署
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('部署') {
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。它从不接触磁盘,从不出现在 shell 历史记录中,并在会话结束时从代理中清除。
遗留系统
如果它发出 HTTP 调用,它就能工作。
代理不关心是什么语言发出的请求。COBOL、FORTRAN、Perl、Visual Basic、一个有 30 年历史的批处理作业 — 如果该进程发出 HTTPS 请求,代理会拦截它,解析 clavitor:// 引用,并注入真实凭证。无需代码更改。
对于无法发出 HTTP 调用的系统,请在进程启动前使用 clavitor-cli render 解析配置模板。该模板可安全地存储在任何地方。解析后的输出通过标准输入或具有受限权限的临时文件传递。
# 在批处理作业启动前解析凭证 $ 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 用于配置文件。每个密钥都在运行时解析,从不存储。