跳转至

Infisical:开源团队密钥管理平台

为什么要学 Infisical

每个项目都有密钥(Secret):数据库密码、API Key、OAuth 凭证、加密密钥……这些密钥的管理是安全的基本盘,但现实中:

  • 密钥散落在 .env 文件中,团队成员靠微信/Slack 传递
  • 有人把密钥提交到了 Git 仓库(即使删了,历史中还在)
  • 环境之间(dev/staging/prod)密钥不一致导致故障
  • 不知道谁在什么时候访问/修改了哪个密钥
  • 密钥轮换是个噩梦——要通知所有人更新

Infisical 是一个开源的密钥管理平台,解决的核心问题是:让团队安全、便捷地管理和分发密钥,同时保留完整审计能力

核心优势: - 开源自部署(数据完全在自己手中) - 端到端加密(服务端也看不到明文) - 支持多环境(dev/staging/prod) - 与 CI/CD、K8s、Docker 深度集成 - 密钥版本管理和回滚 - 完整审计日志 - SDK 支持多语言自动注入


核心概念

白话解释

概念白话说明
Project一个项目/仓库的密钥空间
Environment环境(Development、Staging、Production 等)
Secret一个密钥键值对(如 DATABASE_URL=postgres://...)
Folder密钥的分组目录(如 /database, /third-party)
Service Token机器用的访问令牌(CI/CD、应用运行时)
Machine Identity更安全的机器认证方式(替代 Service Token)
Secret Rotation自动密钥轮换
Secret Reference密钥引用(一个密钥的值来自另一个密钥)
Point-in-Time Recovery时间点恢复(把密钥回滚到任意历史时刻)

Infisical vs 其他方案

特性InfisicalHashiCorp VaultAWS Secrets Manager.env 文件
开源N/A
学习曲线
端到端加密否(服务端解密)
团队管理
审计日志
自部署简单复杂不支持N/A
CI集成原生需配置AWS限定手动
适合中小团队大企业AWS用户个人玩具

安装配置

方式一:使用 Infisical Cloud(最快)

注册 https://app.infisical.com,免费 tier 支持: - 无限密钥 - 最多 5 个团队成员 - 所有核心功能

方式二:自部署(Docker Compose)

# 克隆仓库
git clone https://github.com/Infisical/infisical.git
cd infisical

# 配置环境变量
cp .env.example .env
# 编辑 .env 设置必要的配置

# 启动
docker-compose -f docker-compose.prod.yml up -d

访问 http://localhost:8080 完成初始设置。

方式三:Helm (Kubernetes)

helm repo add infisical https://dl.cloudsmith.io/public/infisical/helm-charts/helm/charts/
helm install infisical infisical/infisical \
    --namespace infisical \
    --create-namespace

安装 CLI

# macOS
brew install infisical/get-cli/infisical

# Linux (Debian/Ubuntu)
curl -1sLf 'https://dl.cloudsmith.io/public/infisical/infisical-cli/setup.deb.sh' | sudo -E bash
sudo apt-get install infisical

# Windows (scoop)
scoop bucket add infisical https://github.com/Infisical/scoop-infisical.git
scoop install infisical

# npm (跨平台)
npm install -g @infisical/cli

CLI 登录

infisical login
# 浏览器打开认证页面,完成后 CLI 自动获取凭证

快速上手

创建项目和密钥

  1. 在 Web UI 中创建 Project
  2. 选择 Environment(如 Development)
  3. 添加密钥:
DATABASE_URL = postgresql://user:pass@localhost:5432/mydb
REDIS_URL = redis://localhost:6379
OPENAI_API_KEY = sk-xxxxxxxxxxxxx
JWT_SECRET = super-secret-jwt-key

通过 CLI 使用密钥

# 初始化项目关联
cd my-project
infisical init
# 选择对应的 Infisical 项目

# 查看密钥
infisical secrets

# 使用密钥运行命令(自动注入环境变量)
infisical run -- python app.py
infisical run -- npm start
infisical run -- docker-compose up

# 指定环境
infisical run --env=prod -- python app.py

导入导出

# 导出为 .env 格式
infisical export --format=dotenv > .env

# 导出为 JSON
infisical export --format=json > secrets.json

# 从 .env 导入
infisical secrets set --env=dev < .env

# 设置单个密钥
infisical secrets set API_KEY=new-key-value --env=dev

进阶用法

1. CI/CD 集成

GitHub Actions:

name: Deploy
on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Install Infisical CLI
        run: |
          curl -1sLf 'https://dl.cloudsmith.io/public/infisical/infisical-cli/setup.deb.sh' | sudo -E bash
          sudo apt-get install infisical

      - name: Run with secrets
        run: |
          infisical run --env=prod --projectId=${{ secrets.INFISICAL_PROJECT_ID }} -- ./deploy.sh
        env:
          INFISICAL_TOKEN: ${{ secrets.INFISICAL_TOKEN }}

GitLab CI:

deploy:
  image: infisical/cli:latest
  script:
    - export INFISICAL_TOKEN=$INFISICAL_TOKEN
    - infisical run --env=prod -- ./deploy.sh

2. Docker 集成

# 不要在 Dockerfile 中硬编码密钥!
# 运行时通过 Infisical 注入

# docker run 时注入
# docker run -e INFISICAL_TOKEN=xxx my-app

docker-compose.yml:

services:
  app:
    build: .
    environment:
      - INFISICAL_TOKEN=${INFISICAL_TOKEN}
    command: infisical run -- python app.py

或使用 Infisical Agent(sidecar 模式):

services:
  infisical-agent:
    image: infisical/cli:latest
    command: agent --config /config/agent.yaml
    volumes:
      - secrets:/secrets
      - ./agent-config.yaml:/config/agent.yaml

  app:
    build: .
    volumes:
      - secrets:/secrets:ro
    depends_on:
      - infisical-agent

volumes:
  secrets:

3. Kubernetes 集成

# 安装 Infisical Kubernetes Operator
helm install infisical-secrets-operator infisical/secrets-operator \
    --namespace infisical-operator \
    --create-namespace

创建 InfisicalSecret 资源:

apiVersion: secrets.infisical.com/v1alpha1
kind: InfisicalSecret
metadata:
  name: my-app-secrets
spec:
  hostAPI: https://app.infisical.com/api
  authentication:
    universalAuth:
      secretsScope:
        projectSlug: my-project
        envSlug: prod
      credentialsRef:
        secretName: infisical-machine-identity
        secretNamespace: default
  managedSecretReference:
    secretName: my-app-k8s-secret
    secretNamespace: default
    secretType: Opaque

在 Deployment 中使用:

apiVersion: apps/v1
kind: Deployment
spec:
  template:
    spec:
      containers:
        - name: app
          envFrom:
            - secretRef:
                name: my-app-k8s-secret

4. SDK 集成(应用运行时)

Python SDK:

pip install infisical-python
from infisical_client import ClientSettings, InfisicalClient

client = InfisicalClient(ClientSettings(
    client_id="your-machine-identity-client-id",
    client_secret="your-machine-identity-client-secret",
    site_url="https://app.infisical.com"
))

# 获取所有密钥
secrets = client.listSecrets(options={
    "environment": "prod",
    "project_id": "your-project-id"
})

# 获取单个密钥
secret = client.getSecret(options={
    "environment": "prod",
    "project_id": "your-project-id",
    "secret_name": "DATABASE_URL"
})
print(secret.secret_value)

Node.js SDK:

npm install @infisical/sdk
import { InfisicalClient } from "@infisical/sdk";

const client = new InfisicalClient({
    clientId: process.env.INFISICAL_CLIENT_ID,
    clientSecret: process.env.INFISICAL_CLIENT_SECRET,
    siteUrl: "https://app.infisical.com"
});

const secret = await client.getSecret({
    environment: "prod",
    projectId: "your-project-id",
    secretName: "STRIPE_SECRET_KEY"
});
console.log(secret.secretValue);

5. 密钥引用和组合

在 Infisical 中,密钥可以引用其他密钥:

DB_HOST = localhost
DB_PORT = 5432
DB_USER = myuser
DB_PASS = secretpass
DB_NAME = myapp

# 引用其他密钥组合
DATABASE_URL = postgresql://${DB_USER}:${DB_PASS}@${DB_HOST}:${DB_PORT}/${DB_NAME}

6. 密钥轮换(Secret Rotation)

通过 Web UI 或 API 配置自动轮换: - PostgreSQL 密码自动轮换 - AWS IAM Access Key 轮换 - 自定义轮换逻辑(Webhook)

# 手动触发轮换
infisical secrets rotate --env=prod --secret-name=DB_PASSWORD

7. 审计与合规

# 查看密钥访问日志
infisical audit-logs --projectId=xxx

# Web UI 中可以看到:
# - 谁在什么时候访问了哪个密钥
# - 谁修改了密钥(包括旧值新值)
# - 密钥的版本历史

8. 时间点恢复

# 查看密钥历史版本
infisical secrets get DATABASE_URL --version=3

# 回滚到特定时间点
# (在 Web UI 中选择 "Point-in-Time Recovery")
# 选择时间 → 预览变更 → 确认回滚

常见问题

Q1: 和直接用 .env 文件有什么区别

维度.env 文件Infisical
安全性明文存储端到端加密
分发手动复制自动同步
版本管理完整版本历史
权限控制细粒度 RBAC
审计完整日志
轮换手动自动
泄露风险高(提交到Git)

Q2: 端到端加密如何实现

  • 密钥在客户端加密后再上传到服务器
  • 服务端存储的是密文
  • 解密只在客户端(CLI/SDK/浏览器)发生
  • 即使 Infisical 服务器被攻破,攻击者也拿不到明文密钥

Q3: 团队成员离职了怎么办

  1. 在 Infisical 中移除其账户权限
  2. 轮换该成员有权访问的所有密钥
  3. 审计日志确认其最后访问时间

Q4: 网络断开时应用能启动吗

  • Infisical Agent 支持本地缓存
  • SDK 支持 fallback 到缓存
  • 建议关键应用使用 Agent 模式保证可用性

Q5: 如何迁移现有的 .env 密钥

# 批量导入
infisical secrets set --env=dev \
    DATABASE_URL="postgres://..." \
    REDIS_URL="redis://..." \
    API_KEY="sk-..."

# 或从文件导入
infisical import --env=dev --src=.env

Q6: 免费版限制

Infisical Cloud 免费版: - 最多 5 个团队成员 - 无限项目和密钥 - 基础审计日志 - 社区支持

自部署版本无任何限制。


参考资源

资源链接
官方网站https://infisical.com
GitHub 仓库https://github.com/Infisical/infisical
文档https://infisical.com/docs
CLI 文档https://infisical.com/docs/cli/overview
SDK 文档https://infisical.com/docs/sdks/overview
K8s Operatorhttps://infisical.com/docs/integrations/platforms/kubernetes
自部署指南https://infisical.com/docs/self-hosting/overview

小结: 密钥管理是安全的基础,也是最容易被忽视的环节。Infisical 在"足够安全"和"足够好用"之间找到了平衡——它不像 HashiCorp Vault 那样需要专职运维,也不像 .env 文件那样全无安全保障。对于任何认真对待安全的团队,从 .env 迁移到 Infisical 应该是优先级很高的基础设施升级。