一. 前言


日常生活中,我们几乎每个人都会拥有大量网站账号,时间久远了密码很容易忘记。因此,像 1Password 等密码管理 + 同步 + 一键登录的工具,成为了很多人的首选。

然而 1Password 毕竟要付费,也有人会担心这类工具有隐私泄露的风险。如果你有一台自己的 VPS 服务器,其实可以用开源的 Bitwarden 来搭建私人专属的密码管理服务,既免费又能确保所有数据都存储在自己服务器上,使用起来更加安心。

随着网络服务越来越多,单靠记忆账号密码已不现实,安全性要求也越来越高,简单的账号密码策略显然不足够。尽管很多浏览器提供了密码记忆和自动填充功能,但它们在浏览器和一些 APP 之间的互通性依然有限。因此,今天我们将通过 Docker 在自己的服务器上搭建一个简单实用的密码管理工具 Bitwarden。

二. 介绍


Bitwarden 是一款开源密码管理器,最重的是它允许自建密码管理服务,完全不用担心密码被别人管理的问题。同时 biwarden 对 Windows,Linux,Mac,iPhone,Android 以及 Chrome 等多种主流浏览器都支持,完全满足个人跨平台、跨终端的密码管理需求。

它的工作方式与 LastPass、1Password 或 Dashlane 相同。

官方版本的 Bitwarden 对服务器硬件要求较高,搭建过程也相对复杂,尤其是官方版本使用 MSSQL 数据库,需要至少 2GB 内存。然而,GitHub 上有开发者通过 Rust 实现了 Bitwarden 的 API 替代,称为 Vaultwarden,并且提供了 Docker 镜像。这个实现大大降低了对机器配置的要求,且 Docker 镜像体积小,部署非常方便。Vaultwarden 目前在 GitHub 上已经获得了 9.8k 个 star,受到了广泛欢迎。

三. 效果预览


四. 相关地址


五. 部署教程


下面是搭建过程,以及如何关闭用户注册、开启两步验证等操作。

1. Docker CLI:

docker run -d \
  --name bitwarden \
  --restart=always \
  --network bridge \
  --cpus='1.0' \
  --memory='1024m' \
  -e MYSQL_HOST=true \
  -e DOMAIN=https://xxx.com \
  -e DATABASE_URL=/data/bitwarden.db \
  -e LOG_LEVEL=warn \
  -e EXTENDED_LOGGING=true \
  -e ROCKET_WORKERS=10 \
  -e LOG_FILE=data/access.log \
  -e WEB_VAULT_ENABLED=true \
  -e ADMIN_TOKEN=xxxxxxx \
  -e SMTP_HOST=smtp.163.com \
  -e [email protected] \
  -e SMTP_PORT=465 \
  -e [email protected] \
  -e SMTP_PASSWORD=xxxx \
  -e SMTP_SECURITY=force_tls \
  -e INVITATIONS_ALLOWED=false \
  -e SENDS_ALLOWED=true \
  -p 7777:80 \
  -v $(pwd)/vaultwarden/data:/data \
  vaultwarden/server:latest

2. Docker Compose:

version: '3'

services:
  vaultwarden:
    image: vaultwarden/server:latest   # 拉取最新镜像
    container_name: bitwarden          # 容器名称
    restart: always                    # 重启策略
    network_mode: bridge
    deploy:
      resources:
        limits:
          cpus: '1'
          memory: 1024M
    environment:
      MYSQL_HOST: true                 # 是否开放注册用户,创建账户后,使用 'false' 停用此选项,这样就不会有陌生人注册了
      DOMAIN: https://xxx.com          # Bitwarden 服务使用的域名
      DATABASE_URL: /data/bitwarden.db # 数据库在容器内的路径
      LOG_LEVEL: warn                  # 日志级别选项:trace、debug、info、warn、error 以及 off
      EXTENDED_LOGGING: true           # 配合 LOG_LEVEL 一起使用
      ROCKET_WORKERS: 10               # 修改线程,默认为10,若用户多可修改为更大,一般默认不需要设置
      LOG_FILE: data/access.log        # 设置日志路径
      WEB_VAULT_ENABLED: true          # 是否开启 Web 客户端
      ADMIN_TOKEN: xxxxxxx             # 启用管理后台并设置 token,默认为空不启用,设置 token 后则启用

      # 设置 SMTP
      SMTP_HOST: smtp.163.com          # 设置 SMTP:SMTP 服务器的地址
      SMTP_FROM: [email protected]            # 设置 SMTP:发件人的邮箱地址,邮件会从这个地址发出
      SMTP_PORT: 465                   # 设置 SMTP:SMTP 服务的端口

      # 邮箱账号,密码
      SMTP_USERNAME: [email protected]        # 设置 SMTP:身份验证的邮箱账号
      SMTP_PASSWORD: xxxx              # 设置 SMTP:身份验证的邮箱密码

      # 自 v1.25.0 起,不再设置 SMTP_SSL和SMTP_EXPLICIT_TLS,使用 SMTP_SECURITY 替代,它有以下选项: starttls、force_tls 和 off。
      # 465 端口使用 force_tls,587 端口使用 starttls,25 端口使用 off。
      SMTP_SECURITY: force_tls         # 强制使用 TLS 协议进行加密通信
      INVITATIONS_ALLOWED: false       # 启用或禁用邀请:true 启用,false 禁用
      SENDS_ALLOWED: true              # 启用或禁用分享发送功能,默认开启,启用 true,禁用 false
    ports:
      - '7777:80'
    volumes:
      - ./vaultwarden/data:/data

也可以使用 .env 进行环境变量配置,如果是通过 Portainer 进行堆栈部署的,命名为 stack.env 可正常引用。

vim config.env

# 是否开放用户注册
SIGNUPS_ALLOWED=true

# Bitwarden 服务使用的域名
DOMAIN=https://xxxx.xxx

# 数据库在容器内的路径
DATABASE_URL=/data/bitwarden.db

# 设置日志路径
LOG_FILE=data/access.log

# 日志级别选项:trace、debug、info、warn、error 以及 off
LOG_LEVEL=warn
EXTENDED_LOGGING=true

# 修改线程,默认为10,若用户多可修改为更大,一般默认不需要设置
ROCKET_WORKERS=10

# 是否开启 Web 客户端
WEB_VAULT_ENABLED=true

详细配置说明:Home · dani-garcia/vaultwarden Wiki · GitHub

环境配置:vaultwarden/.env.template at main · dani-garcia/vaultwarden · GitHub

六. 使用教程


1. 网页端登录

如果无法创建账号,需要 ssl 证书开启访问 https。

2. 浏览器插件

安装后,填入自己的服务器域名,保存登录。

Send 功能,可以做一些临时的记录,多端同步。

随机密码生成器

3. Mac 客户端

4. Windows 客户端

5. Android 客户端

Android 客户端截屏时,提示涉及隐私没有成功,操作没有什么特殊的内容。

6. 其他客户端

Install and Sync All of Your Devices | Bitwarden

7. 其他

7.1 关闭用户注册

注册完用户后,不希望其他人登录注册,可以关闭用户注册。通过修改 config.env 中的 SIGNUPS_ALLOWED=false 重新安装。

Docker-compose.yml 文件中我们已经对数据进行了持久化映射 - ./vaultwarden:/data,在环境变量中设置了数据库位置 DATABASE_URL=/data/bitwarden.db,下面我们删除 docker 容器,使用原有数据重新安装。

# 进入存放 docker-compose.yml 文件夹,停止容器
docker-compose stop

# 防止意外,先备份数据
cp -r ~/vaultwarden bitwarden.archive

# 删除原容器
docker-compose down

# 修改config.env文件SIGNUPS_ALLOWED=false
vim config.env

# 重新运行
docker-compose up -d   # 完成

7.2 开启两步验证

7.2.1 开启邮件功能

首先编辑环境配置文件 config.env,配置 SMTP 服务功能。在最后面增加如下内容

# 启用管理后台并设置 token,默认为空不启用,设置 token 后则启用,这里是一个例子
ADMIN_TOKEN=SDcWJuiL5eTysdcbnigcFEskgv9mu76GvTgUEqpoA3f92Uvj

# 是否启用 WebSocket 通知,实时同步:true 启用,false 禁用
WEBSOCKET_ENABLED=true

# 显示密码提示:true 启用,false 禁用
SHOW_PASSWORD_HINT=false

# 设置 SMTP
SMTP_HOST=smtp.163.com
[email protected]
SMTP_PORT=465

# 邮箱账号,密码
SMTP_USERNAME=xxxxx
SMTP_PASSWORD=XXXXXXXX
# 自 v1.25.0 起,不再设置 SMTP_SSL和SMTP_EXPLICIT_TLS,使用 SMTP_SECURITY 替代,它有以下选项: starttls、force_tls 和 off。
# 465 端口使用 force_tls,587 端口使用 starttls,25 端口使用 off。
SMTP_SECURITY=force_tls

# 启用或禁用邀请:true 启用,false 禁用
INVITATIONS_ALLOWED=false

# 启用或禁用分享发送功能,默认开启,启用 true,禁用 false
SENDS_ALLOWED=true

ADMIN_TOKEN 为管理面板密码,可以使用密码生成器生成。开启邮箱的 SMTP 服务,这里推荐 163 的邮箱服务。打开邮箱进设置POP3/SMTP/IMAP开启IMAP/SMTP服务新增授权密码 ,一定要记好授权密码(只显示一次,以后无法查询,只能重新获取)。

设置完后重新安装容器。

登录后会发现多了一个 验证电子邮件 的提示。

按照提示我们验证一下。

7.2.2 开启两步验证

账户设置安全两步验证电子邮箱管理,按下面提示操作。

这样就开启成功了。

7.2.3 获取恢复代码

这里依赖邮箱发送验证码,验证登录。为了防止邮箱服务出现问题,我们还需要获取并记恢复代码,防止意外发生,操作如下

7.2.4 测试两步验证

以上工作完成后,注销账户,我们使用两步验证重新登录一下。

开启两步验证后,如果有其他人登录你的账号,未通过两步验证,会得到如下的邮件提醒。

google 翻译:

有人试图用正确的主密码登录您的帐户,但没有提供正确的令牌或操作,以便在首次登录尝试后的3分钟内完成两步登录过程。

日期:2024年9月6日(星期五)06:21:18 AM +00:00

IP地址:xxxx

设备类型:xxxx

如果这不是你或你授权的人,那么你应该尽快更改你的主密码,因为它很可能被泄露。

7.2.5 通过恢复代码登录

点击参看官方介绍:https://bitwarden.com/help/lost-two-step-device

有恢复代码:https://bitwarden.com/help/two-step-recovery-code/#use-your-recovery-code

恢复账号两步登录地址:https://your.domain.com/#/recover-2fa

需要将 your.domain.com 修改为自己的域名地址。

7.3 忘记主密码怎么办(官方答复:删号重建)

我忘记了主密码 - Bitwarden 帮助中心中文版

7.4 系统管理

当设置了 ADMIN_TOKEN= 后,可以登录系统管理 https://your.domain.com/admin。链接在登录后的 15 分钟内有效。可以通过删除 ADMIN_TOKEN= 或者 DISABLE_ADMIN_TOKEN=false 方式关闭系统管理员功能。

这里也可以设置 SMTP 服务

Gmail 生成应用密码

https://myaccount.google.com/apppasswords

七. 常见问题及注意点


待补充

参考资料