比 LastPass 更安全? Bitwarden 自托管避坑指南
一、前言Bitwarden 作为一个开源的密码管理器,有着丰富的社区生态,我们可以将它轻松部署在自己的云服务器、单板机上,确保自己的密码库绝对安全。本教程会提供 Bitwarden 自托管方案,同时给出数据库的备份方案
二、部署 Vaultwarden & Backup 服务1. 安装 Docker Engine通过 SSH 连接到你的服务器,执行以下命令:sudo apt update && sudo apt install curl -y
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh ./get-docker.sh
sudo usermod -aG docker $USER
2. 部署 Vaultwarden 备份服务2.1 获取 Google Drive API 密钥我这里以 Google Drive 为例,你也可以使用阿里云盘等云服务,更多云盘的实现可以参考 rclone 官方文档。
首先需要在 Google Cloud Console 创建一个项目,并进入 API 与服务板块,点击启动 API 和服务:
创建 Google Drive API搜索 Google Drive API 并添加,然后进入“凭证”界面,配置权限请求界面,用户类型记得选择“外部”,其余没有什么特别的,正常填写即可:
配置权限请求界面点击“客户端”,创建一个桌面应用类型的客户端,名称随意:
创建 OAuth 客户端创建完成后,切记将 客户端 ID 和 客户端密钥 复制到安全地方,待会需要使用:
Google Drive 客户端 ID 和密钥最后,在目标对象中将自己添加到测试用户中即可大功告成:
将自己添加到测试用户中2.2 配置 Rclone 服务在你的云服务器终端执行:
docker run --rm -it \
--mount type=volume,source=vaultwarden-rclone-data,target=/config/ \
ttionya/vaultwarden-backup:latest \
rclone config
进入 Rclone 交互式命令界面后,请根据自身需求进行选择,我的配置如下:
Option service_account_file.
Service Account Credentials JSON file path.
Leave blank normally.
Needed only if you want use SA instead of interactive login.
Leading `~` will be expanded in the file name as will environment variables such as `${RCLONE_CONFIG_DIR}`.
Enter a value. Press Enter to leave empty.
service_account_file>
Edit advanced config?
y) Yes
n) No (default)
y/n> n
Use web browser to automatically authenticate rclone with remote?
* Say Y if the machine running rclone has a web browser you can use
* Say N if running rclone on a (remote) machine without web browser access
If not sure try Y. If Y failed, try N.
y) Yes (default)
n) No
y/n> n
Option config_token.
For this to work, you will need rclone available on a machine that has
a web browser available.
For more help and alternate methods see: https://rclone.org/remote_setup/
Execute the following on the machine with the web browser (same rclone
version recommended):
rclone authorize "drive" "eyJjbGllbnRfaWQiOiI2NTYxMjcxMDU1MS02OGZodGI4N2k3MDUwNDNoa2htNnQ1OWR0Y2tsaW1wdS5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsImNsaWVudF9zZWNyZXQiOiJHT0NTUFgtdHdwV2tSVHYxdi1GNFlwTDl4Z0FhdkgyMnNCUiIsInNjb3BlIjoiZHJpdmUifQ"
Then paste the result.
Enter a value.
config_token>
然后使用你的 Windows 电脑(注意不是云服务器),打开终端,输入以下命令:
winget install Rclone.Rclone
然后在新的终端执行:
# 注意:这个命令请根据你的终端复制粘贴对应命令,不能使用我的
rclone authorize "drive" "eyJjbGllbnRfaWQiOiI2NTYxMjcxMDU1MS02OGZodGI4N2k3MDUwNDNoa2htNnQ1OWR0Y2tsaW1wdS5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsImNsaWVudF9zZWNyZXQiOiJHT0NTUFgtdHdwV2tSVHYxdi1GNFlwTDl4Z0FhdkgyMnNCUiIsInNjb3BlIjoiZHJpdmUifQ"
进行正常的授权后,你的 Windows 终端会出现类似以下内容:
Paste the following into your remote machine --->
eyJ0b2tlbiI6IntcImFjY2Vzc190b2tlblwiOlwieWEyOS5hMEFTM0g2TnpnS0wwMnM5N1NZTmJvVnl3bUMyU1JUQUlnOXZIeTFkMk1COWlqZi1aRWd5ei1DdGNramJBRVloTm90OWtVZXBGV3hTS1kxdmN4X2hzd2xqdHBQNDY0RTRTTmtxeEIyRkd4Y2VZVjJaay1XMC1DNHZVUHJ4eXZnLXE2MnNDWGZ5NEVNb1JFQXpJTlpmWHZ5cjFUSVBMaGFmNGgyek5JdlZyZ2FDZ1lLQVJJU0FSUVNGUUhHWDJNaXkzZW1rVGZHVGF4Vk5xVXdudFZjU3cwMTc1XCIsXCJ0b2tlbl90eXBlXCI6XCJCZWFyZXJcIixcInJlZnJlc2hfdG9rZW5cIjpcIjEvLzA2UWdUZDJ1NzlLczdDZ1lJQVJBQUdBWVNOd0YtTDlJclZPeDMxYXlXYmR6WVI0dTRxTjFvZFNtZDFKR0poR0JralZhakc1UTQwa3dUSzNGODNobmpqM19ZcV9zRWt2WUl1WDRcIixcImV4cGlyeVwiOlwiMjAyNS0wNi0yOVQwMToxOTowNy4zNjc3NTIyKzA4OjAwXCIsXCJleHBpcmVzX2luXCI6MzU5OX0ifQ
<---End paste
将中间那一长串字符串粘贴到你的云服务器终端中,后续所有选项默认即可。现在,终于完成了所有配置中最难的部分。通过以下命令测试是否配置成功:
# 注意:命令末尾的 vaultwarden: 请根据自己配置的 Remote Name 进行修改,例如如果你的配置名为 test,则将命令末尾修改为 test:
docker run --rm -it --mount type=volume,source=vaultwarden-rclone-data,target=/config/ ttionya/vaultwarden-backup:latest rclone lsd vaultwarden:
如果配置无误,则会返回你的 Google Drive 根目录下的所有文件
2.3 安装 Vaultwarden你可以选择自行编写 docker-compose.yml 也可以使用我的,你可以在你的云服务器终端执行:
git clone https://gist.github.com/3bc836e9ca1059e321ca4b75924602a0.git vaultwarden && cd vaultwarden
docker compose up -d
如果没有出错的话,即可访问你的云服务器的 8200 端口进入 Web 界面,访问 admin 目录即可进入管理页面。Bitwarden 要求服务端使用 TLS 加密连接,所以你需要配置证书。关于证书配置,建议直接将 DNS 托管到 Cloudflare,这样你就不需要手动配置了。同时你也不需要配置 Fail2Ban 来提升安全性了
这种方式的加密并不会加密源服务器到 Cloudflare 的数据,建议还是使用 Canddy 进行反向代理
至此,你已经完成了部署。当然,还有很多自定义选项可以配置,如果感兴趣,请继续和我一起探索
三、后记3.1 Vaultwarden 安全设置如果你是仅自己使用或者小面积人群使用,建议禁用注册,限制为仅邀请使用 Argon2 对 ADMIN_TOKEN 进行哈希处理,避免明文存储密码# 将 Password 替换为你的密码,并将输出填写在管理页面对应位置即可
echo -n "Password" | argon2 "$(openssl rand -base64 32)" -e -id -k 65540 -t 3 -p 4
3.2 备份配置具体配置细节请参考我的配置文件:
version: '3.4'
services:
vaultwarden:
image: vaultwarden/server:latest
restart: always
ports:
- 8200:80
volumes:
- vaultwarden-data:/data/
backup:
image: ttionya/vaultwarden-backup:latest
restart: always
environment:
RCLONE_REMOTE_NAME: 'vaultwarden' # Rclone 远程存储配置名称
RCLONE_REMOTE_DIR: '/vaultwarden/' # 远程存储目录路径
ZIP_ENABLE: 'TRUE' # 启用 ZIP 压缩功能
# ZIP_PASSWORD: 'your_password' # ZIP 文件加密密码
ZIP_TYPE: '7z' # 压缩文件格式,支持 zip 和 7z
# BACKUP_FILE_SUFFIX: '%Y%m%d' # 备份文件名后缀格式
BACKUP_KEEP_DAYS: 0 # 本地备份保留天数,0 表示不自动删除
MAIL_SMTP_ENABLE: 'true' # 启用邮件通知功能
# SMTP邮件服务器配置参数
# MAIL_SMTP_VARIABLES: '-S smtp-use-starttls -S smtp=smtp://your_address:port -S smtp-auth=login -S smtp-auth-user=your_user -S smtp-auth-password=your_password -S from=your_sender'
# MAIL_TO: '[email protected]' # 接收备份通知的邮箱地址
# MAIL_WHEN_SUCCESS: 'false' # 备份成功时是否发送邮件通知
# MAIL_WHEN_FAILURE: 'TRUE' # 备份失败时是否发送邮件通知
volumes:
- vaultwarden-data:/bitwarden/data/
- vaultwarden-rclone-data:/config/
volumes:
vaultwarden-data:
name: vaultwarden-data
vaultwarden-rclone-data:
external: true
name: vaultwarden-rclone-data
建议一开始就配置好自动备份,因为谁也不知道你的服务器会在什么时候突然宕机导致数据丢失,特别是像我这种在家搭建服务器的环境,宕机更容易发生,并且使用 Google Drive 的免费套餐就可以获得很好的备份体验