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 其他方案¶
| 特性 | Infisical | HashiCorp Vault | AWS 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 登录¶
快速上手¶
创建项目和密钥¶
- 在 Web UI 中创建 Project
- 选择 Environment(如 Development)
- 添加密钥:
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:
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:
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)
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: 团队成员离职了怎么办¶
- 在 Infisical 中移除其账户权限
- 轮换该成员有权访问的所有密钥
- 审计日志确认其最后访问时间
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 Operator | https://infisical.com/docs/integrations/platforms/kubernetes |
| 自部署指南 | https://infisical.com/docs/self-hosting/overview |
小结: 密钥管理是安全的基础,也是最容易被忽视的环节。Infisical 在"足够安全"和"足够好用"之间找到了平衡——它不像 HashiCorp Vault 那样需要专职运维,也不像 .env 文件那样全无安全保障。对于任何认真对待安全的团队,从 .env 迁移到 Infisical 应该是优先级很高的基础设施升级。