饮墨

子安饮墨馀三斗,留与卿儿作赋来

Infisical:开源密钥管理平台,彻底替代 .env 散落式密钥管理

痛点:.env 文件在生产环境的致命缺陷

运维工程师大概都经历过这些场景:

  • 新人入职,前辈把 .env 文件通过 Slack/钉钉明文发一份过来
  • 某个 API Key 轮换,需要逐台服务器手动更新 .env,漏改一台就是 P0 事故
  • 审计要求追溯"谁在什么时间修改了哪个密钥",.env 文件毫无审计能力
  • 多环境(dev/staging/prod)密钥靠命名约定(.env.prod)区分,一旦复制错误直接打到生产数据库

.env 是开发阶段的便利工具,但它从来不是为生产环境设计的密钥管理方案。当团队规模超过 5 人、服务超过 10 个时,散落的 .env 文件就是一颗定时炸弹。


方案:Infisical — 开源密钥管理的现代解法

Infisical 是一个开源(MIT License)的端到端加密密钥管理平台,核心目标是让团队彻底告别 .env 文件散落各处的混乱状态。它提供:

  • 集中管理:所有密钥存储在一个加密的中心平台,按项目/环境组织
  • 端到端加密:密钥在客户端加密后才上传,服务端无法读取明文
  • 多环境支持:dev / staging / prod 环境天然隔离,一键切换
  • 审计日志:每次读取、修改、删除都有完整的 audit trail
  • 原生 CI/CD 集成:GitHub Actions、GitLab CI、Kubernetes Operator 等开箱即用
  • 自托管:可完全部署在自己的基础设施上,数据不出内网

对比 HashiCorp Vault,Infisical 的核心优势在于上手成本极低——Vault 的学习曲线和运维复杂度让很多中小团队望而却步,而 Infisical 5 分钟就能跑起来。


实操:从零部署 Infisical 并集成到生产环境

第一步:Docker Compose 自托管部署

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

# 使用官方 docker-compose 启动
cp .env.example .env
# 编辑 .env,设置 ENCRYPTION_KEY 和 AUTH_SECRET
openssl rand -hex 16  # 生成 ENCRYPTION_KEY
openssl rand -hex 16  # 生成 AUTH_SECRET

docker compose -f docker-compose.prod.yml up -d

服务默认监听 http://localhost:8080,首次访问会引导创建管理员账户。

第二步:CLI 工具集成到部署流程

# 安装 Infisical CLI
curl -1sLf 'https://dl.cloudsmith.io/public/infisical/infisical-cli/setup.deb.sh' | sudo bash
sudo apt-get install infisical

# 登录(Machine Identity 方式,适合 CI/CD)
export INFISICAL_TOKEN=$(infisical login --method=universal-auth \
  --client-id=YOUR_CLIENT_ID \
  --client-secret=YOUR_CLIENT_SECRET \
  --plain)

# 注入密钥并启动应用(替代 source .env && ./app)
infisical run --env=prod --path=/myapp -- ./start-server.sh

infisical run 的核心逻辑:从平台拉取指定环境的密钥,注入为环境变量,然后启动子进程。应用代码零修改,只需要从环境变量读取即可。

第三步:Kubernetes Operator 自动同步

# 安装 Infisical Secrets Operator
helm repo add infisical https://dl.cloudsmith.io/public/infisical/helm-charts/helm/charts/
helm install infisical-secrets-operator infisical/secrets-operator \
  --namespace infisical-system --create-namespace

---
# InfisicalSecret CRD:自动将密钥同步为 K8s Secret
apiVersion: secrets.infisical.com/v1alpha1
kind: InfisicalSecret
metadata:
  name: myapp-secrets
  namespace: production
spec:
  hostAPI: https://infisical.internal.company.com/api
  authentication:
    universalAuth:
      secretsScope:
        projectSlug: myapp
        envSlug: prod
        secretsPath: /
      credentialsRef:
        secretName: infisical-machine-identity
        secretNamespace: infisical-system
  managedSecretReference:
    secretName: myapp-env
    secretNamespace: production
    secretType: Opaque
  resyncInterval: 60  # 每60秒同步一次

密钥在 Infisical 平台修改后,Operator 自动同步到 K8s Secret,Pod 通过 envFrom 引用即可,无需重新部署。

第四步:GitHub Actions 集成

# .github/workflows/deploy.yml
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: Infisical/secrets-action@v1
        with:
          client-id: ${{ secrets.INFISICAL_CLIENT_ID }}
          client-secret: ${{ secrets.INFISICAL_CLIENT_SECRET }}
          project-slug: myapp
          env-slug: prod

      - name: Deploy with secrets
        run: |
          # 密钥已自动注入为环境变量
          echo "DB connected to: $DB_HOST"
          ./deploy.sh

避坑指南

1. 自托管务必配置持久化存储

Infisical 依赖 PostgreSQL 和 Redis。Docker Compose 默认使用本地 volume,生产环境必须挂载到持久化存储(EBS/NFS),并配置定期备份:

# 备份 PostgreSQL 数据
docker exec infisical-db pg_dump -U infisical > backup_$(date +%Y%m%d).sql

2. Machine Identity 权限最小化

为 CI/CD 和 Kubernetes Operator 创建的 Machine Identity,务必限制: - 环境范围:只授权需要的环境(如 prod),不要给 * - 路径范围:按微服务路径隔离(/payment-service/user-service) - IP 绑定:绑定 CI Runner / 集群出口 IP,防止 token 泄漏后被滥用

3. 密钥轮换别忘了版本回滚能力

Infisical 支持密钥版本历史(Secret Versioning),轮换前确认: - 旧版本保留期设置合理(建议 7 天) - 有回滚 Playbook:如果新密钥导致服务异常,能在 30 秒内 revert


.env vs Infisical vs Vault 对比

维度 .env 文件 Infisical HashiCorp Vault
部署复杂度 低(Docker Compose 5分钟) 高(需要 Consul/HA 配置)
加密方式 端到端加密 服务端加密
审计日志 完整 完整
动态密钥 不支持 不支持 支持(数据库动态凭证)
学习曲线 几乎为零 30 分钟上手 1-2 周
适用规模 1-3 人小项目 5-100 人团队 大型企业/强合规场景
开源协议 MIT BSL(非开源)

选型建议: - 如果你需要动态密钥(如数据库临时凭证自动过期),选 Vault - 如果你需要快速落地、团队易用、替代 .env 混乱现状,选 Infisical - 如果你是个人项目或 3 人以下团队,.env + .gitignore 暂时够用


总结

Infisical 解决的核心问题是密钥管理的最后一公里——不是每个团队都需要 Vault 那样的重量级方案,但每个团队都不应该继续用 .env 文件在 IM 里传来传去。

落地建议: 1. 先在非核心项目试点,验证 CLI 注入和 K8s Operator 的稳定性 2. 制定迁移计划:按环境逐步迁移,prod 最后切换 3. 配合 RBAC 策略,确保开发者只能访问 dev 环境密钥,prod 密钥仅 CI/CD 和运维可读

一个密钥管理的基本原则:密钥应该像水管里的水,只在需要的时候流到需要的地方,而不是装在瓶子里到处传递。

您还没有登录,请登录后发表评论。