自托管 Infisical:保护 Homelab 的指南

  • infisical
  • 发布于 2025-02-13 21:54
  • 阅读 106

文章介绍了在本地自建 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 可以解决的问题。接下来我们会演示如何:

  • 在 Ubuntu 服务器上部署并配置 Infisical
  • 将 Backblaze B2 应用程序密钥添加到 Infisical 的秘密管理器中
  • 使用即时秘密注入来备份新创建的 Infisical 服务器

下面是该流程的基本示意图:

目标架构:一台 Ubuntu 服务器正在备份到 Backblaze B2,密钥来自 Infisical

1. 使用 Docker Compose 部署 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 个服务:

  • nginx:一个 HTTPS 反向代理,用于暴露 Infisical 的 Web 界面
  • backend:实际运行的 Infisical 服务器
  • redis:用于加速操作的缓存服务器
  • db:Infisical 使用的 Postgres 数据库
  • db-migration:升级 Infisical 后运行数据库迁移的容器

现在 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

2. 配置 Infisical

Docker Compose 运行完成后,访问你前面指定的地址。由于使用的是自签名证书,你会看到 TLS 错误;点击继续即可进入设置页面:

Infisical 设置屏幕

填写表单,创建你的初始管理员账户。进入下一页后,下载 应急工具包(Emergency Kit)PDF 并将其保存在安全的地方。这是在你被锁定后重新获得访问权限的唯一方法。

设置完成后,进入服务器设置并禁用用户注册,以提高安全性。

为你的 Infisical 服务器禁用用户注册

点击底部的“Save”,然后点击左上角的“Back to organization”。

3. 即时注入秘密

现在我们将使用 Infisical 来保护 Backblaze B2 凭据。我们不会把它们保存在服务器上,而是在运行 B2 CLI 命令的那一刻,把它们即时注入进去。

首先,创建一个项目(Project)。点击右上角的“Add New Project”。

创建你的第一个 Infisical 项目

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

创建项目模态框

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

Infisical 中的秘密概览页面

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

向 Infisical 添加你的第一个秘密

B2_APPLICATION_KEY 也重复这些步骤。

向 Infisical 添加你的第二个秘密

回到服务器的 shell。确保已经安装了 B2 CLIInfisical CLI。然后登录:

$ infisical login -i

选择“Self-Hosting or Dedicated Instance”,并将 Domain 设置为 http://localhost。输入你的凭据并登录到 Admin Org。

使用 Infisical CLI 登录

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

在目录中运行 init 以访问新项目的秘密

现在,使用 infisical run 将秘密即时注入到 B2 CLI 命令中。将 abc123 替换为一个唯一字符串:

$ infisical run --command ‘b2 bucket create infisical-backup-abc123 allPrivate’

将秘密注入 B2 CLI 命令

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

将备份上传到 B2 存储桶

这样,你的服务器就完成了备份,同时又无需在磁盘上存储凭据。最后,退出 CLI 登录:

$ infisical reset

结论

通过这种方式保护备份密钥,你可以确保凭据安全、可重复使用,并且能够在不同机器之间访问,而无需手动管理。这种设置还可以借助 OIDC 进一步自动化,或集成到 GitHub Actions 等 CI/CD 流水线中。

除了基础的秘密存储之外,Infisical 还提供许多其他功能,包括凭据轮换和 SSH key 管理。你可以将本指南作为起点,进一步探索自托管秘密管理器如何增强家庭实验室的安全性。

  • 原文链接: infisical.com/blog/self-...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
infisical
infisical
江湖只有他的大名,没有他的介绍。