前言
大家平时都是如何管理自己的账号密码的?是使用浏览器自带的密码管理器?还是购买诸如 LastPass、1Password 之类的专业密码管理器?你真的放心将账号密码这么重要的数据存放在别人那里吗?
带着各种疑问,我找到了 Bitwarden。这是一款开源的跨平台密码管理器,支持所有主流浏览器与操作系统,最重要的是它支持自托管。从某种程度上来说,自托管能够有效规避大规模的密码泄露事件。
准备工作
- 准备一台内存 ≥ 2GB 的 Linux 服务器,我使用的是 Ubuntu Server 22.04 LTS。
- 配置服务器对外开放 80 和 443 端口,前者是 Certbot 的注册端口,后者是 HTTPS 的默认端口。
- 在域名提供商处添加一条 DNS A 记录指向服务器的公网 IP 地址,如
vault.waddledee.com
。 - 访问 https://bitwarden.com/host,申请自托管 Bitwarden 所需的安装 ID 和 Key:
安装 Docker Engine
- SSH 远程连接到服务器,更新 apt 包索引:
1
sudo apt-get update
- 安装软件包以允许 apt 通过 HTTPS 使用存储库,按 Y 继续:
1
sudo apt-get install ca-certificates curl gnupg lsb-release
- 添加 Docker 官方的 GPG 密钥:
1
2sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg - 配置 stable 版本的 Docker 存储库:
1
2
3echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null - 再次更新 apt 包索引:
1
sudo apt-get update
- 安装 Docker Engine,按 Y 继续:
1
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
- 检查 Docker Engine 是否安装成功:
1
docker --version
安装 Docker Compose
- 下载 stable 版本的 Docker Compose:
1
sudo curl -SL https://github.com/docker/compose/releases/download/v2.14.1/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
- 为 Docker Compose 添加执行权限:
1
sudo chmod +x /usr/local/bin/docker-compose
- 检查 Docker Compose 是否安装成功:
1
docker-compose --version
创建服务账户
创建一个专门用于运行 Bitwarden 的服务账户,目的是为了隔离 Bitwarden 实例。
- 创建用户 bitwarden,输入密码和基本信息后按 Y 确认:
1
sudo adduser bitwarden
- 添加该用户到 docker 组:
1
sudo usermod -aG docker bitwarden
- 创建目录 /opt/bitwarden:
1
sudo mkdir /opt/bitwarden
- 配置该目录的执行权和所有权:
1
2sudo chmod -R 700 /opt/bitwarden
sudo chown -R bitwarden:bitwarden /opt/bitwarden - 切换到 bitwarden 用户:
1
su bitwarden
- 切换到 /opt/bitwarden 目录:
1
cd /opt/bitwarden
安装 Bitwarden
- 下载 Bitwarden 安装脚本并为其添加执行权限:
1
curl -Lso bitwarden.sh https://go.btwrdn.co/bw-sh && chmod 700 bitwarden.sh
- 安装 Bitwarden:安装过程需要输入参数,如下所示:
1
./bitwarden.sh install
- Enter the domain name for your Bitwarden instance (ex. bitwarden.example.com):
输入在准备工作中事先配置的域名vault.waddledee.com
。 - Do you want to use Let’s Encrypt to generate a free SSL certificate? (y/n):
选择是否使用 Let’s Encrypt 的 SSL 证书,输入 y。 - Enter your email address (Let’s Encrypt will send you certificate expiration reminders):
输入用于接收 Let’s Encrypt 证书过期提醒的邮箱,如parasol@waddledee.com
。 - Enter the database name for your Bitwarden instance (ex. vault):
输入新 Bitwarden 数据库的名称,如vault
。 - Enter your installation id (get at https://bitwarden.com/host):
输入在准备工作中事先申请的安装 ID76a32426-a6fb-4fde-b4c6-af780093ddc4
。 - Enter your installation key:
输入在准备工作中事先申请的安装 KeyAcTf08x2O22T8HmaAUcY
。
- Enter the domain name for your Bitwarden instance (ex. bitwarden.example.com):
- 启动 Bitwarden:
1
./bitwarden.sh start
- 检查 Bitwarden 容器的状态:首次启动需要花费一些时间,耐心等待所有容器的状态变为 healthy:
1
docker ps
1
2
3
4
5
6
7
8
9
10
11
12CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a93f8cf12ba8 bitwarden/nginx:2022.12.0 "/entrypoint.sh" About a minute ago Up About a minute (healthy) 80/tcp, 0.0.0.0:80->8080/tcp, :::80->8080/tcp, 0.0.0.0:443->8443/tcp, :::443->8443/tcp bitwarden-nginx
b1a6ba29fd34 bitwarden/admin:2022.12.0 "/entrypoint.sh" About a minute ago Up About a minute (healthy) 5000/tcp bitwarden-admin
2522752d32a0 bitwarden/api:2022.12.0 "/entrypoint.sh" About a minute ago Up About a minute (healthy) 5000/tcp bitwarden-api
07ebd607fd75 bitwarden/identity:2022.12.0 "/entrypoint.sh" About a minute ago Up About a minute (healthy) 5000/tcp bitwarden-identity
aa4f48cef3af bitwarden/web:2022.12.0 "/entrypoint.sh" About a minute ago Up About a minute (healthy) bitwarden-web
0b4ee0c29c52 bitwarden/notifications:2022.12.0 "/entrypoint.sh" About a minute ago Up About a minute (healthy) 5000/tcp bitwarden-notifications
659f1f3e5556 bitwarden/mssql:2022.12.0 "/entrypoint.sh" About a minute ago Up About a minute (healthy) bitwarden-mssql
319543e05b88 bitwarden/sso:2022.12.0 "/entrypoint.sh" About a minute ago Up About a minute (healthy) 5000/tcp bitwarden-sso
0125ba5e879a bitwarden/icons:2022.12.0 "/entrypoint.sh" About a minute ago Up About a minute (healthy) 5000/tcp bitwarden-icons
0ed826f85d4a bitwarden/events:2022.12.0 "/entrypoint.sh" About a minute ago Up About a minute (healthy) 5000/tcp bitwarden-events
0f2879b8c9e8 bitwarden/attachments:2022.12.0 "/entrypoint.sh" About a minute ago Up About a minute (healthy) bitwarden-attachments
配置 Bitwarden
- 打开 Bitwarden 环境文件:
1
nano ./bwdata/env/global.override.env
- 配置下列用于发送邮件的参数,完成后按 Ctrl+X 保存并退出,按 Y 确认,按 Enter 返回命令行:
1
2
3
4
5
6
7
8...
globalSettings__mail__replyToEmail=no-reply@vault.waddledee.com
globalSettings__mail__smtp__host=REPLACE
globalSettings__mail__smtp__port=587
globalSettings__mail__smtp__ssl=false
globalSettings__mail__smtp__username=REPLACE
globalSettings__mail__smtp__password=REPLACE
... - 重启 Bitwarden 以应用最新配置:
1
./bitwarden.sh restart
- 访问 Bitwarden 网页版
https://vault.waddledee.com/
,注册一个新账户: - 注册成功后登录,点击右上角的 Send Email 验证邮箱:
- 收到邮件后点击 Verify Email Address Now 激活账户:
至此,Bitwarden 的基本配置已全部完成,接下来可以开始正常使用了。
配置客户端
- 安装浏览器插件 Bitwarden - Free Password Manager:
- 打开插件,点击左上角的设置图标,输入 Server URL 保存后即可登录:
- 安装应用程序 Bitwarden Password Manager:
- 打开 APP,点击右上角的设置图标,输入 Server URL 保存后即可登录:
更新 Bitwarden
保持 Bitwarden 服务器的最新状态对密码库的安全至关重要,我使用 cron 任务定期更新 Bitwarden。
- 创建 Bitwarden 更新脚本:
1
nano ./bwdata/scripts/updatebw.sh
- 复制如下内容,按 Ctrl+X 保存并退出,按 Y 确认,按 Enter 返回命令行:
1
2
3#!/bin/bash
/opt/bitwarden/bitwarden.sh updateself
/opt/bitwarden/bitwarden.sh update - 为脚本添加执行权限:
1
chmod 700 ./bwdata/scripts/updatebw.sh
- 打开 crontab 配置文件,首次打开时选择一款编辑器:
1
crontab -e
- 配置 cron 任务,完成后按 Ctrl+X 保存并退出,按 Y 确认,按 Enter 返回命令行。以下示例配置为每周一 00:00 触发 Bitwarden 更新脚本,并将日志输出到 /home/bitwarden/updatebw.log:
1
2PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
0 0 * * 1 /opt/bitwarden/bwdata/scripts/updatebw.sh >/home/bitwarden/updatebw.log 2>&1 - 检查脚本是否执行成功:成功的输出结果如下所示:
1
cat /home/bitwarden/updatebw.log
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34_ _ _ _
| |__ (_) |___ ____ _ _ __ __| | ___ _ __
| '_ \| | __\ \ /\ / / _` | '__/ _` |/ _ \ '_ \
| |_) | | |_ \ V V / (_| | | | (_| | __/ | | |
|_.__/|_|\__| \_/\_/ \__,_|_| \__,_|\___|_| |_|
Open source password management solutions
Copyright 2015-2022, 8bit Solutions LLC
https://bitwarden.com, https://github.com/bitwarden
===================================================
bitwarden.sh version 2022.12.0
Docker version 20.10.22, build 3a2c30b
Docker Compose version v2.14.1
Updated self.
_ _ _ _
| |__ (_) |___ ____ _ _ __ __| | ___ _ __
| '_ \| | __\ \ /\ / / _` | '__/ _` |/ _ \ '_ \
| |_) | | |_ \ V V / (_| | | | (_| | __/ | | |
|_.__/|_|\__| \_/\_/ \__,_|_| \__,_|\___|_| |_|
Open source password management solutions
Copyright 2015-2022, 8bit Solutions LLC
https://bitwarden.com, https://github.com/bitwarden
===================================================
bitwarden.sh version 2022.12.0
Docker version 20.10.22, build 3a2c30b
Docker Compose version v2.14.1
Update not needed
备份 Bitwarden
如果不慎丢失了 Bitwarden 密码库,那将是一件非常头疼的事情,因此我们需要定期备份 Bitwarden。下面提供了三种不同的备份方案,选择最适合自己的一种即可:
- 定期备份 Bitwarden 服务器,在必要时还原服务器快照。
- 定期备份 Bitwarden 数据库,在必要时还原数据库,方法可参考:
- 定期导出 Bitwarden 密码库,推荐通过 CLI 编写脚本的方式实现,方法可参考:
更多安全性建议
- 如果是仅供个人使用的 Bitwarden 服务器,则建议关闭新用户注册功能。具体方法是将 Bitwarden 环境文件的 globalSettings__disableUserRegistration 设置为 true 并重启 Bitwarden。
- 为 Bitwarden 账户启用 2FA 可以有效防止由主密码泄露引起的密码库泄露,方法可参考: