登录 永久免费 立即开始

基础架构

配置中无密钥。

日志中无密钥。

每个平台、每个编排器、每个 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 用于配置文件。每个密钥都在运行时解析,从不存储。