Skip to content
Go back

自建VaultWarden

Published:  at  11:00 PM

在远程Linux服务器,自建密码管理工具---VaultWarden

Vaultwarden官方仓库:Vaultwarden: Unofficial Bitwarden compatible server written in Rust, formerly known as bitwarden_rs

1. 创建新用户和工作空间

  1. 创建bitwarden用户 sudo adduser bitwarden
  2. 设置密码 sudo passwd bitwarden
  3. 创建并添加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. 备份

必要工具

确保您的系统已经安装以下工具:

  sudo apt update
  sudo apt install docker.io rclone gpg argon2
  sudo systemctl start docker
  sudo systemctl enable docker

安装rclone

(记不清了,网上找的,这部分最好询问ai或查询官网)

  1. 安装rclone 运行以下命令来下载并安装rclone

    curl https://rclone.org/install.sh | sudo bash

    确认安装是否成功:

    rclone version

  2. 初始化rclone配置

    1. 运行rclone config命令启动配置过程: rclone config
    2. 输入n来创建一个新的remote。
    3. 输入remote的名称(例如onedrive
    4. 继续按提示操作,直到要求进行OAuth认证的步骤 在这一步,通常rclone会自动打开浏览器来完成OAuth认证,但由于我们是在远程服务器上,这就需要在本地的机器上进行认证。
  3. 在本地机器上完成OAuth认证 (可能国内无法访问, 忘记当时遇见的问题了,也可以看下其他认证方式)

    1. 获取认证URL
      1. rclone提示你需要在浏览器中打开一个URL来完成认证时,它会输出一个类似于下面的链接:
        https://accounts.google.com/o/oauth2/auth?client_id=XXXXXXX&response_type=code&scope=XXXXX
      2. 复制这个链接,你需要将它复制到本地的机器。
    2. 在本地机器上打开浏览器并完成认证
      1. 在本地Windows电脑上,打开浏览器,并粘贴刚才从远程服务器上复制的OAuth认证URL。
      2. 按照浏览器中的指示进行登录,并授权rclone访问你的云存储账户。
      3. 完成认证后,浏览器将返回一个包含认证代码的页面。这时候会显示一段长的代码。
    3. 将认证代码粘贴回远程Linux服务器
      1. 复制认证完成后页面中显示的授权代码。
      2. 回到你连接远程Linux服务器的终端,在rclone提示你输入认证代码的地方,粘贴该代码并按回车。
  4. 完成rclone配置

    1. 继续完成后续的配置。通常是选择默认值(除非你有其他自定义需求),然后保存并退出。

    2. 你可以通过以下命令测试配置是否成功(以Google Drive为例):

      rclone lsd onedrive:vaultwarden_backup

      如果能够列出你的云存储目录结构,说明配置成功。

      如果目录不存在,可以手动创建:

      rclone mkdir onedrive:vaultwarden_backup

配置GPC

  1. 生成一个随机密码

    我们可以使用 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 字节的随机密码,并设置为仅当前用户可读。

  2. 安装GPC

    sudo apt update
    sudo apt install gnupg -y
  3. 使用 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
  4. 解密文件测试

    确保可以使用相同的密码文件解密:

    # 解密文件
    gpg --batch --yes --passphrase "$GPG_PASSPHRASE" -o decrypted_test_file.txt -d test_file.txt.gpg
    
    # 检查解密结果
    cat decrypted_test_file.txt
  5. 清理测试文件

    如果一切正常,可以删除测试文件:

    rm test_file.txt test_file.txt.gpg decrypted_test_file.txt

  6. 注意事项

    1. 文件权限:确保 /vaultwarden_backup/gpg_passphrase_file 的权限是 600,以保证安全: chmod 600 /vaultwarden_backup/gpg_passphrase_file
    2. 备份密码文件:将该密码文件妥善保存(例如在安全的地方备份),因为如果丢失,将无法解密备份文件。可以存到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" 替换为您的实际管理员密码,确保密码足够强壮。

备份脚本

  1. 设置备份目录和权限

    确保备份目录存在,并设置正确的权限:

    sudo mkdir -p /vaultwarden_backup
    sudo chmod -R 700 /vaultwarden_backup
  2. 备份脚本

    将以下脚本保存为 /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 "备份完成"
  3. 设置脚本执行权限

    确保脚本具有可执行权限,并设置正确的所有者和权限:

    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

  4. 配置定时任务(Cron)

    使用 cron 定期执行备份和更新脚本。以下示例将脚本设置为每天凌晨2点执行。

    1. 编辑 Crontab: sudo crontab -e
    2. 添加以下行: 0 5 * * * /vaultwarden_backup/backup_update_script.sh >> /vaultwarden_backup/backup.log 2>&1
    3. 保存并退出
  5. 验证脚本

    在首次运行脚本之前,建议手动执行一次以确保一切正常:

    sudo /vaultwarden_backup/backup_update_script.sh

    检查日志文件 /vaultwarden_backup/backup.log 以确保所有步骤顺利完成。

5. bitwarden配置

  1. 选自托管
  2. 填解析到vps的域名
  3. 注册第一个用户,第一个注册用户就是管理员
  4. 进入后台管理,关闭新用户注册,因为这只是我们自己用

6. 安全提示

感谢L站的佬友 转载+合并

自建BitWarden

自建vaultwarden, 实现自动同步与镜像更新



Previous Post
MySQL -- 查询&删除触发器