文章介绍了在本地自建 Infisical 作为秘密管理器的实践方法,重点演示如何用 Docker Compose 部署带 Nginx 反向代理、Postgres 和 Redis 的服务栈,生成自签名证书并配置环境变量完成初始化。随后通过创建项目、录入 Backblaze B2 访问密钥,并借助 Infisical CLI 的临时注入能力,在执行备份命令时按需提供凭证,从而避免密钥长期落盘。文章强调了中心化密钥管理、即时访问与防止 secrets sprawl 的价值。

2025 年,“云”的魔力似乎正在消退。越来越多的企业开始看到自托管或采用混合方案的好处,个人用户也同样关注自托管。我就是其中之一,选择自托管照片存储和家庭管理等个人服务,希望让私有数据远离那些隐私记录糟糕的公司。
但无论你是在云端运行应用程序,还是维护自己的家庭实验室(homelab),始终都会面临一个挑战:安全地管理秘密(secrets)。
在这篇文章中,我将解释为什么专门的秘密管理器是工具箱中必不可少的一项工具。然后,我会带你设置 Infisical——一个强大的开源秘密管理器,用它来保护你的备份凭据,并确保备份免受恶意软件侵害!
先说最基本的。如果你以前从未使用过秘密管理器,你可能会想:“当然,它‘更安全’(无论那到底是什么意思),但听起来会多出很多额外工作。”我完全理解——这也是我的第一反应。
这篇文章会向你展示,它不仅比你想象中更简单,而且带来的好处也是立竿见影且非常显著的。其中最大的好处之一,可能就是把所有秘密都集中保存在一个安全的位置。这意味着你不用再因为丢了某个 API key 而不得不重新生成它,也不用再 SSH 登录到你拥有的每一台服务器,只为找到那个你正在找的私钥。
“但是等等,”你可能会想,“把我所有的秘密都放在一个地方,难道不危险吗?”
其实并不是——恰恰相反。在妥善保护的前提下,中心化秘密管理器比另一种做法安全得多:把凭据以纯文本文件的形式分散存放在各个服务器上(这是一种被称为秘密蔓延(secrets sprawl)的安全噩梦)。
秘密管理器最强大的功能之一,是“即时(just-in-time)”访问。这意味着,秘密只会在系统真正需要它们的那一刻才可用,随后又会立即被锁起来。听起来这似乎很复杂、很难实现,但我会向你展示,它实际上有多么直接。
至于秘密管理器能用来做什么,可能性几乎是无限的。它可以保护从 TLS 证书、API key 到密码和 SSH key 的各种敏感信息。你甚至还可以用它来:
虽然今天我们不会深入探讨所有这些能力,但会聚焦一个能够体现秘密管理价值的关键用例:保护你的备份密钥。毕竟,还有什么比保护你珍贵数字资产宝库的钥匙更重要呢?
在我的家庭实验室里,我使用 Backblaze 来存储备份。我可以使用 Backblaze B2 CLI 创建存储桶并上传文件,但我不希望备份密钥留在磁盘上,以免服务器被攻破时泄露。这正是我自托管的秘密管理器 Infisical 可以解决的问题。接下来我们会演示如何:
下面是该流程的基本示意图:

部署 Infisical 的方式有很多,但在这个示例中,考虑到 Docker Compose 简单且在家庭实验室中很常见,我会采用这种方式。
要开始部署,先创建 docker-compose.yml 文件:
services:
nginx:
container_name: nginx
image: nginx:latest
restart: unless-stopped
ports:
- 443:443
volumes:
- ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf
- ./nginx/certs:/etc/nginx/certs
networks:
- infisical
backend:
container_name: infisical-backend
image: infisical/infisical:latest-postgres
restart: unless-stopped
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
db-migration:
condition: service_completed_successfully
pull_policy: always
env_file: .env
environment:
- NODE_ENV=production
ports:
- 80:8080
networks:
- infisical
redis:
container_name: infisical-redis
image: redis
restart: unless-stopped
env_file: .env
environment:
- ALLOW_EMPTY_PASSWORD=yes
volumes:
- ./volumes/redis:/data
networks:
- infisical
db:
container_name: infisical-db
image: postgres:14-alpine
restart: unless-stopped
env_file: .env
volumes:
- ./volumes/postgres:/var/lib/postgresql/data
networks:
- infisical
healthcheck:
test: "pg_isready --username=${POSTGRES_USER} && psql --username=${POSTGRES_USER} --list"
interval: 5s
timeout: 10s
retries: 10
db-migration:
container_name: infisical-db-migration
depends_on:
db:
condition: service_healthy
image: infisical/infisical:latest-postgres
env_file: .env
command: npm run migration:latest
pull_policy: always
networks:
- infisical
networks:
infisical:
在这个 compose 文件中,我们在一个内部 Docker 网络里定义了 5 个服务:
现在 compose 文件已经准备好了,接下来需要设置 Nginx 配置文件和环境变量。对于 Nginx,在 ./nginx/nginx.conf 创建一个文件,内容如下:
server {
listen 443 ssl;
ssl_certificate /etc/nginx/certs/cert.pem;
ssl_certificate_key /etc/nginx/certs/key.pem;
location / {
proxy_pass http://infisical-backend:8080;
}
}
接下来,运行以下命令来创建一个供 Nginx 使用的自签名 TLS 证书。请确保将 “infisical.lan” 替换为你部署 Infisical 的主机名:
$ mkdir -p ./nginx/certs
$ openssl req -subj '/CN=infisical.lan' -addext "subjectAltName = DNS:infisical.lan" -x509 -newkey rsa:4096 -nodes -keyout nginx/certs/key.pem -out nginx/certs/cert.pem -days 99999
最后一步是设置有效的环境文件。在本地目录中创建一个名为 .env 的文件,并填写下面这些变量。同样,将 “infisical.lan” 替换为你的主机名:
## 网站 URL
SITE_URL=https://infisical.lan
## 密钥
## 平台加密/解密操作所需的密钥
## 使用 `openssl rand -hex 16` 生成你自己的密钥
ENCRYPTION_KEY=
## JWT
## 签署 JWT Token 所需的秘密
## 使用 `openssl rand -base64 32` 生成你自己的密钥
AUTH_SECRET=
## Postgres
POSTGRES_PASSWORD='在这里设置你自己的密码`
POSTGRES_USER=infisical
POSTGRES_DB=infisical
## 不要更改下一行
DB_CONNECTION_URI=postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}
## Redis
## 不要更改下一行
REDIS_URL=redis://redis:6379
创建好 .env 文件后,就可以部署 Infisical 了:
$ docker compose up -d
Docker Compose 运行完成后,访问你前面指定的地址。由于使用的是自签名证书,你会看到 TLS 错误;点击继续即可进入设置页面:

填写表单,创建你的初始管理员账户。进入下一页后,下载 应急工具包(Emergency Kit)PDF 并将其保存在安全的地方。这是在你被锁定后重新获得访问权限的唯一方法。
设置完成后,进入服务器设置并禁用用户注册,以提高安全性。

点击底部的“Save”,然后点击左上角的“Back to organization”。
现在我们将使用 Infisical 来保护 Backblaze B2 凭据。我们不会把它们保存在服务器上,而是在运行 B2 CLI 命令的那一刻,把它们即时注入进去。
首先,创建一个项目(Project)。点击右上角的“Add New Project”。

将项目命名为“Common Secrets”,然后点击“Create Project”。

你需要一个 Backblaze B2 应用程序密钥。使用“Add Secret”按钮,将 key ID 和 secret 添加到 Infisical 中。

将第一个秘密命名为 B2_APPLICATION_KEY_ID,然后粘贴对应的值。选择默认环境并点击“Create Secret”。

对 B2_APPLICATION_KEY 也重复这些步骤。

回到服务器的 shell。确保已经安装了 B2 CLI 和 Infisical CLI。然后登录:
$ infisical login -i
选择“Self-Hosting or Dedicated Instance”,并将 Domain 设置为 http://localhost。输入你的凭据并登录到 Admin Org。

运行 infisical init,将当前目录关联到你的项目。选择“Admin Org”和“Common Secrets”项目。

现在,使用 infisical run 将秘密即时注入到 B2 CLI 命令中。将 abc123 替换为一个唯一字符串:
$ infisical run --command ‘b2 bucket create infisical-backup-abc123 allPrivate’

$ zip -r infisical-backup.zip .
$ infisical run --command ‘b2 file upload infisical-backup-abc123 infisical-backup.zip infisical-backup.zip’

这样,你的服务器就完成了备份,同时又无需在磁盘上存储凭据。最后,退出 CLI 登录:
$ infisical reset
通过这种方式保护备份密钥,你可以确保凭据安全、可重复使用,并且能够在不同机器之间访问,而无需手动管理。这种设置还可以借助 OIDC 进一步自动化,或集成到 GitHub Actions 等 CI/CD 流水线中。
除了基础的秘密存储之外,Infisical 还提供许多其他功能,包括凭据轮换和 SSH key 管理。你可以将本指南作为起点,进一步探索自托管秘密管理器如何增强家庭实验室的安全性。
- 原文链接: infisical.com/blog/self-...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!
作者暂未设置收款二维码