Infisical 最佳实践
Infisical 安全性
通过 infisical login 命令登录成功后,会获取一个凭证(access token(短期) / refresh token(长期)),这个 access token 是 infisical 拉取秘钥的依据;infisical CLI 会定期刷新 access token;若 access token 丢失,会导致 infisical 中的秘钥泄漏。 为了缩小 token 泄漏后密钥失窃的范围,每个 token 必须只能获取其指定范围内的秘钥。
在 Windows 系统中, infisical 将 token 存储在 Credential Manager(凭证管理) 中;在 Mac 系统中, infisical 将 token 存储在 Keychain(钥匙串) 中; 这些系统级的凭证管理器会加密存储 token ,并绑定当前登录用户,除非有恶意程序在当前用户权限下运行,否则 token 不会丢失。但在服务器版的 Linux 系统 或 Docker 环境中通常会降级为文件存储(如 ~/.infisical),安全性将完全依赖文件权限控制,token 的泄漏风险相对更高。
密钥轮替
密钥轮替流程如下,此处以轮替更换数据库密码为例:
1>. 在数据库中创建新用户和密码,并添加到 infisical 中;
2>. 新部署的项目全部使用数据库的新用户和密码;
3>. 当所有已部署系统全部都使用了新用户和密码后,从 infisical 中删除旧的数据库密钥。
开发环境
让 VS Code 启动 Java 项目前读取 launch.json 配置,然后执行 preLaunchTask 中的命令获取并落盘 infisical 中的秘钥;然后 VS Code 根据 launch.json 中的 envFile 配置读取,并将向秘钥注入到 Java 进程中。 即,秘钥先落盘为 .env 文件,然后在 envFile 配置 .env 文件的路径,再由 VS Code 读取 .env 文件中的内容,并在启动 Java 进程时注入。
注:.env 必须添加到 .gitignore,并禁止 AI 读取,同时在 .vscode/setting.json 中配置排除 .env 文件;
Machine Identities 最小化权限原则
1>. 进入 infisical 服务端的 访问控制 -> Machine Identities;
2>. 创建机器用户(机器用户是专门为服务器、CI/CD 流水线(如 GitHub Actions)或 Docker 容器)创建的身份;创建机器用户时要输入机器用户的名称和角色,机器用户的角色决定其能够在 infisical 所拥有的权限,如果赋予其管理员权限,这个机器用户就能像人类管理员一样创建项目、管理账单、邀请成员等;( 给机器用户分配管理员角色后,它就能 整个 Infisical 实例)

3>. 点击进入机器用户,可以为该机器用户添加能够访问的项目;添加项目时要选择项目、选择角色,此处选择的角色直接决定了该机器用户对该项目的访问权限,例如:读取项目密钥、推送项目密钥、管理项目环境、在项目内继续创建机器用户等;
4>. 点击进入项目内,可以在项目中继续创建项目内的机器用户,每个机器用户都可以负责不同的工作,例如:有负责 CI/CD 流水线的、有负责调用三方API的、有负责执行测试脚本的等。之所以设计这么细粒度的控制权限,主要是遵循最小权限原则,降低泄密风险。

Service Tokens
1>. Service Token 是一种 短期或长期的 API 访问令牌,它不依赖个人账号,也不像机器用户那样有复杂的角色配置,而是单一令牌 + 权限范围。Service Token 是项目中的功能,只能项目中才能 Service Token,进入项目 -> 访问控制 -> service token :

2>. 创建 service token 时,需要设置 token 名称、环境、密钥路径、有效期、读写权限:

Secrets Path 调用设定当前创建的 service token 能够访问哪个目录下的密钥,因为创建在创建在时可以有目录层级结构;Secrets Path 就是用于限制能够访问的密钥的范围;如下:

注:Service token 创建成功后,只会显示一次,请务必保存好:

生产环境的最佳实践
1>. 在 Infisical 创建一个有效期 1 天的 Service Token,限制访问项目中需要的密钥路径。
2>. Docker 启动时,通过 -e 将 Service Token 注入容器环境。
3>. 容器启动脚本调用 Infisical CLI,用 Service Token 获取密钥,并将其导出为环境变量。
4>. Java 应用启动后,直接通过环境变量读取密钥,无需在镜像中存放敏感信息。
docker run -e INFISICAL_SERVICE_TOKEN=st_abcdef1234567890 \
-e INFISICAL_PROJECT=my-project \
-e INFISICAL_ENV=prod \
my-java-app:latest \
...
注:此方式安全性非常高,密钥不落盘,且 infisical 的 token 有效期也很短。
密钥导入导出
1>. 批量导出密钥为 JSON(推荐用于迁移):
infisical export --env=source_env --format=json > source_env_secrets.json
2>. 批量导入到目标环境的密钥:
infisical import --env=target_env --format=json < source_env_secrets.json
密钥类别
Infisical 还支持以下密钥,可根据项目规模按需使用;但一般中小项目无须使用这么复杂的密钥管理。
普通密钥 → Add Secret
组织/分组 → Add Folder
临时/动态密钥 → Add Dynamic Secret
自动轮换密钥 → Add Secret Rotation
批量导入 → Add Secret Import / Upload Secrets
跨项目/环境复用 → Replicate Secrets