在远程Linux服务器,自建密码管理工具---VaultWarden
Vaultwarden官方仓库:Vaultwarden: Unofficial Bitwarden compatible server written in Rust, formerly known as bitwarden_rs
1. 创建新用户和工作空间
- 创建bitwarden用户
sudo adduser bitwarden
- 设置密码
sudo passwd bitwarden
- 创建并添加bitwarden至docker组
sudo groupadd docker sudo usermod -aG docker bitwarden
后续可能会遇见文件权限问题 — 可以询问ai解决
2. 创建数据存储路径(包含数据库和配置文件)
su bitwarden # 切换到bitwarden用户
mkdir /home/bitwarten/vaultwarden/data # 创建数据目录,这里可以自行设置,之后的配置文件和数据库都会在这里。
创建docker-compose.yml
推荐使用docker compose方式安装vaultwarden
cd /home/bitwarden/vaultwarden # 进入你准备安装vaultwarden的目录,可自行修改
vi docker-compose.yml
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: always
volumes:
- ./data:/data
ports:
- "8031:80"
- "9031:3012"
environment:
- WEBSOCKET_ENABLED=true # 启用WebSocket通知
- SIGNUPS_ALLOWED=false # 禁止新用户注册,建议部署后更改为false
- ADMIN_TOKEN=msksmksmksmssksmskmsskmsmk # 取消注释并更改为强随机密码用于管理员>界面
- DOMAIN=https://xxxxx.com
密码生成网站:安全、强大的密码生成器 | 1Password
3. 启动
docker compose up -d && docker compose logs -f
docker compose logs -f
是为了查看日志,如果报错的话可以查一查原因
如果更新compose文件之后的话用下面的命令启动:
docker compose pull && docker compose up -d && docker compose logs -f
此时,如果你的端口是打开的就可以用ip:port
访问了
或者使用nginx/caddy进行配置 使用域名访问
4. 备份
必要工具
确保您的系统已经安装以下工具:
- Docker:用于运行 Vaultwarden。
- Rclone:用于将备份文件上传到 OneDrive。
- GPG:用于加密备份文件。
- Argon2:用于生成
ADMIN_TOKEN
的哈希值。 - Cron:用于定时执行备份和更新脚本。
sudo apt update
sudo apt install docker.io rclone gpg argon2
sudo systemctl start docker
sudo systemctl enable docker
安装rclone
(记不清了,网上找的,这部分最好询问ai或查询官网)
-
安装rclone 运行以下命令来下载并安装
rclone
:curl https://rclone.org/install.sh | sudo bash
确认安装是否成功:
rclone version
-
初始化rclone配置
- 运行
rclone config
命令启动配置过程:rclone config
- 输入
n
来创建一个新的remote。 - 输入remote的名称(例如
onedrive
) - 继续按提示操作,直到要求进行OAuth认证的步骤
在这一步,通常
rclone
会自动打开浏览器来完成OAuth认证,但由于我们是在远程服务器上,这就需要在本地的机器上进行认证。
- 运行
-
在本地机器上完成OAuth认证 (可能国内无法访问, 忘记当时遇见的问题了,也可以看下其他认证方式)
- 获取认证URL
- 当
rclone
提示你需要在浏览器中打开一个URL来完成认证时,它会输出一个类似于下面的链接:
https://accounts.google.com/o/oauth2/auth?client_id=XXXXXXX&response_type=code&scope=XXXXX
- 复制这个链接,你需要将它复制到本地的机器。
- 当
- 在本地机器上打开浏览器并完成认证
- 在本地Windows电脑上,打开浏览器,并粘贴刚才从远程服务器上复制的OAuth认证URL。
- 按照浏览器中的指示进行登录,并授权
rclone
访问你的云存储账户。 - 完成认证后,浏览器将返回一个包含认证代码的页面。这时候会显示一段长的代码。
- 将认证代码粘贴回远程Linux服务器
- 复制认证完成后页面中显示的授权代码。
- 回到你连接远程Linux服务器的终端,在
rclone
提示你输入认证代码的地方,粘贴该代码并按回车。
- 获取认证URL
-
完成rclone配置
-
继续完成后续的配置。通常是选择默认值(除非你有其他自定义需求),然后保存并退出。
-
你可以通过以下命令测试配置是否成功(以Google Drive为例):
rclone lsd onedrive:vaultwarden_backup
如果能够列出你的云存储目录结构,说明配置成功。
如果目录不存在,可以手动创建:
rclone mkdir onedrive:vaultwarden_backup
-
配置GPC
-
生成一个随机密码
我们可以使用
openssl
或pwgen
生成一个强密码:# 使用 openssl 生成随机密码 openssl rand -base64 32 > /vaultwarden_backup/gpg_passphrase_file # 确保文件权限是 600 chmod 600 /vaultwarden_backup/gpg_passphrase_file
这样会在
/vaultwarden_backup/gpg_passphrase_file
中生成一个 32 字节的随机密码,并设置为仅当前用户可读。 -
安装GPC
sudo apt update sudo apt install gnupg -y
-
使用 GPG 创建加密测试文件
你可以测试一下这个 GPG 密码文件是否正常工作:
# 读取生成的密码到变量 GPG_PASSPHRASE=$(< /vaultwarden_backup/gpg_passphrase_file) # 创建一个测试文件 echo "This is a test backup file." > test_file.txt # 使用 GPG 加密测试文件 gpg --batch --yes --symmetric --cipher-algo AES256 --passphrase "$GPG_PASSPHRASE" -o test_file.txt.gpg test_file.txt # 检查是否生成了加密文件 ls test_file.txt.gpg
-
解密文件测试
确保可以使用相同的密码文件解密:
# 解密文件 gpg --batch --yes --passphrase "$GPG_PASSPHRASE" -o decrypted_test_file.txt -d test_file.txt.gpg # 检查解密结果 cat decrypted_test_file.txt
-
清理测试文件
如果一切正常,可以删除测试文件:
rm test_file.txt test_file.txt.gpg decrypted_test_file.txt
-
注意事项
- 文件权限:确保
/vaultwarden_backup/gpg_passphrase_file
的权限是600
,以保证安全:chmod 600 /vaultwarden_backup/gpg_passphrase_file
- 备份密码文件:将该密码文件妥善保存(例如在安全的地方备份),因为如果丢失,将无法解密备份文件。可以存到onedrive的保险库中.
- 文件权限:确保
生成 ADMIN_TOKEN
的哈希值
Vaultwarden 官方推荐使用 argon2
生成 ADMIN_TOKEN
的哈希值。请按照以下步骤操作:
生成哈希值并保存:
使用以下命令生成 ADMIN_TOKEN
的哈希值,并将其保存到 /vaultwarden_backup/admin_token_hash
文件中:
# 替换 "123456789" 为您实际的管理员密码
echo -n "123456789" | argon2 "$(openssl rand -base64 32)" -e -id -k 65540 -t 3 -p 4 > /vaultwarden_backup/admin_token_hash
# 设置文件权限,确保只有授权用户可以读取
sudo chmod 600 /vaultwarden_backup/admin_token_hash
示例输出(保存在 /vaultwarden_backup/admin_token_hash
文件中):
$argon2id$v=19$m=65540,t=3,p=4$bXBGMENBZUVzT3VUSFErTzQzK25Jck1BN2Z0amFuWjdSdVlIQVZqYzAzYz0$T9m73OdD2mz9+aJKLuOAdbvoARdaKxtOZ+jZcSL9/N0
注意:将 "123456789"
替换为您的实际管理员密码,确保密码足够强壮。
备份脚本
-
设置备份目录和权限
确保备份目录存在,并设置正确的权限:
sudo mkdir -p /vaultwarden_backup sudo chmod -R 700 /vaultwarden_backup
-
备份脚本
将以下脚本保存为
/vaultwarden_backup/backup_update_script.sh
,并赋予可执行权限BACKUP_DIR="/home/bitwarden/vaultwarden_backup/backup" # 本地备份存储路径 SOURCE_DIR="/home/bitwarden/vaultwarden/data" # 需要备份的源目录 REMOTE="alioss:xxx/vw-backup/" # rclone 远程 oss 目录 DATE=$(date +"%Y-%m-%d") # 当前日期 BACKUP_FILE="backup_$DATE.tar.gz" # 备份文件名 GPG_FILE="$BACKUP_FILE.gpg" # 加密后的备份文件名 GPG_PASSPHRASE_FILE="/home/bitwarden/vaultwarden_backup/gpg_passphrase_file" # GPG 加密密码文件 RETENTION_DAYS=30 # 保留的天数 LOG_FILE="/home/bitwarden/vaultwarden_backup/backup_update_script.log" # 日志文件 # Docker 配置 IMAGE_NAME="vaultwarden/server:latest" # 镜像名称 CONTAINER_NAME="vaultwarden" # 容器名称 # 日志函数 log() { echo "$(date +"%Y-%m-%d %H:%M:%S") - $1" | tee -a $LOG_FILE } # 检查 GPG 密码文件是否存在 if [ ! -f "$GPG_PASSPHRASE_FILE" ]; then log "GPG 密码文件不存在,备份终止" exit 1 fi log "文件地址:$GPG_PASSPHRASE_FILE" # 读取 GPG 密码 GPG_PASSPHRASE=$(cat "$GPG_PASSPHRASE_FILE") if [ -z "$GPG_PASSPHRASE" ]; then echo "GPG_PASSPHRASE 为空" exit 1 fi # 创建备份 log "开始备份" if tar -czf "$BACKUP_DIR/$BACKUP_FILE" -C "$SOURCE_DIR" .; then log "备份文件已创建: $BACKUP_FILE" else log "备份失败" exit 1 fi # GPG 加密 if gpg --batch --yes --passphrase "$GPG_PASSPHRASE" --cipher-algo AES256 -c "$BACKUP_DIR/$BACKUP_FILE"; then log "备份文件已加密: $GPG_FILE" else log "加密失败,备份终止" exit 1 fi # 删除未加密的文件 rm "$BACKUP_DIR/$BACKUP_FILE" log "未加密的备份文件已删除" # 同步到 Ali-oss if rclone copy "$BACKUP_DIR/$GPG_FILE" "$REMOTE"; then log "已同步到 Ali-oss: $GPG_FILE" else log "同步到 Ali-oss 失败" exit 1 fi # 清理本地和远程超过保留期的备份 find "$BACKUP_DIR" -name "backup_*.tar.gz.gpg" -type f -mtime +$RETENTION_DAYS -delete rclone delete --min-age ${RETENTION_DAYS}d "$REMOTE" log "超过 $RETENTION_DAYS 天的旧备份已删除" log "备份完成"
-
设置脚本执行权限
确保脚本具有可执行权限,并设置正确的所有者和权限:
sudo chmod +x /vaultwarden_backup/backup_update_script.sh sudo chown your_backup_user:your_backup_group /vaultwarden_backup/backup_update_script.sh
注意:将
your_backup_user
和your_backup_group
替换为实际的用户和组,确保只有授权用户可以执行和修改脚本。我使用的是chown vaultwarden:vaultwarden /vaultwarden_backup/backup_update_script.sh
-
配置定时任务(Cron)
使用
cron
定期执行备份和更新脚本。以下示例将脚本设置为每天凌晨2点执行。- 编辑 Crontab:
sudo crontab -e
- 添加以下行:
0 5 * * * /vaultwarden_backup/backup_update_script.sh >> /vaultwarden_backup/backup.log 2>&1
- 保存并退出
- 编辑 Crontab:
-
验证脚本
在首次运行脚本之前,建议手动执行一次以确保一切正常:
sudo /vaultwarden_backup/backup_update_script.sh
检查日志文件
/vaultwarden_backup/backup.log
以确保所有步骤顺利完成。
5. bitwarden配置
- 选自托管
- 填解析到vps的域名
- 注册第一个用户,第一个注册用户就是管理员
- 进入后台管理,关闭新用户注册,因为这只是我们自己用
6. 安全提示
- 密码安全:确保
/vaultwarden_backup/gpg_passphrase_file
和/vaultwarden_backup/admin_token_hash
文件的权限为600
,且仅限授权用户访问。 - 脚本权限:确保脚本拥有适当的执行权限,并且只有授权用户可以修改。
- 定期检查:定期检查备份日志,确保备份和更新过程正常运行。
- 套CDN: 给解析到VPS的域名套上CDN,防止泄露VPS IP,这个可以在
Cloudcone
中打开 - 开防火墙: 注意放行443和80端口
感谢L站的佬友 转载+合并