自己搭设开源密码管理工具 bitwarden

简介

Bitwarden是一款自由且开源的密码管理服务,用户可在加密的保管库中存储敏感信息(例如网站登录凭据)。Bitwarden平台提供有多种客户端应用程序,包括网页用户界面、桌面应用,浏览器扩展、移动应用以及命令行界面。[6]Bitwarden提供云端托管服务,并支持自行部署解决方案。[7]

官方服务器可以免费使用,但不包含高级服务。

官网地址

用 Rust 编写的 Bitwarden 服务器 API 的替代实现,与上游 Bitwarden 客户端兼容*,非常适合运行官方资源密集型服务可能不理想的自托管部署。

vaultwarden 自己搭设的好处:

  1. 密码仓库在自己手中更安全。
  2. 可以使用无限的账户、组织。
  3. 包含高级功能。

官方仓库

准备工作

  1. 在线云服务器
  2. 公网域名
  3. 一把时间

云服务器

我用的阿里云服务器 特价99一年
学生特价服务器
新老客户续费优惠服务器

地区选离自己近的

我选择的是centos8

配置安全组

服务器通过端口与外界通信,安全组就是设置哪些端口可以通过。

购买后进入控制台 ecs实例配置安全组

没有安全组就创建一个。

点击管理规则,添加入方向规则 22 80 443 分别对应ssh http 和 https通信。其他的根据自己需求添加。出方向默认不用管。

设置密码

我这边步骤是先关机,然后通过阿里云控制台修改密码,然后在启动实例。之后就可以通过ssh工具连接了。

域名

vaultwarden 需要通过https使用,所以需要一个域名。

我是在阿里云买的域名。

搜索域名,然后选择购买。

购买后需要实名和备案,阿里云一套流程走完。

备案通过后,设置dns解析。将域名解析到你的服务器公网ip。

我这里用的cloudflare,需要先在域名提供商(阿里云 域名)设置为cloudflare的dns。

然后在cloudflare设置域名解析。

设置完之后继续后面的步骤。

配置Vaultwarden

安装docker

安装所需的软件包。yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。

bash 复制代码
sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2

使用以下命令来设置稳定的仓库。

bash 复制代码
sudo yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装docker

bash 复制代码
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin

启动bitwarden 镜像

bash 复制代码
docker run --rm -d --name vaultwarden -v /home/bitwarden/:/data/   -e LOG_FILE=/data/vaultwarden.log--restart unless-stopped -p 80:80 vaultwarden/server:latest

启动docker

bash 复制代码
sudo systemctl start docker

配置反向代理

我使用的caddy2

安装caddy2

bash 复制代码
dnf install 'dnf-command(copr)'
dnf copr enable @caddy/caddy
dnf install caddy

更改反向代理信息

bash 复制代码
vi /etc/caddy/Caddyfile

参考下面的内容,配置反向代理。{{your email}}改成你的邮箱,www.exampledomain.com 改成你的域名。

caddy 支持自动配置https 省去了我们的麻烦,只需要写上tls 邮箱即可

json 复制代码
www.exampledomain.com {
  log {
    level WARN
    output file "/home/caddy/www.exampledomain.com.log" {
      roll_size 10MB
      roll_keep 10
    }
  }
  log {
    level WARN
    output file "/home/caddy/www.exampledomain.com-error.log" {
      rotate_size 10
      rotate_age 14
      rotate_keep 5
      rotate_compress
    }
  }
  tls "{{your email}}"
  encode gzip

  handle_path "/vaultwarden/*" {
    reverse_proxy "0.0.0.0:80" {
      transport http {
        dial_timeout 2s
        response_header_timeout 30s
      }
      header_up "Host" "{upstream_hostport}"
      header_up "X-Real-IP" "{remote_host}"
    }
  }

  handle {
    respond "Nope!" 404
  }
}

反向代理配置更新

bash 复制代码
caddy reload --config /etc/caddy/Caddyfile

访问你的 域名/vaultwarden/ 就能看到登陆页面了🎉

高级配置

定时备份

vaultwarden中存储了我们的密码,以防万一,设置一个定时备份方便恢复。

使用cron进行备份。/etc/cron.daily/ 目录下的脚本每天会自动执行一次。

bash 复制代码
vi /etc/cron.daily/backup

输入文件内容

shell 复制代码
#/bin/bash
bitwardenPath=/home/bitwarden
bitwardenBPath=你的备份目录
bitwardenBTDir=${bitwardenBPath}/tmp/

# bitwarden 备份
mkdir -p  ${bitwardenBTDir}
cp -r   ${bitwardenPath}/* ${bitwardenBTDir}

# 删除不需要备份的数据
rm -rf ${bitwardenBTDir}db.sqlite3-shm
rm -rf ${bitwardenBTDir}send/
rm -rf ${bitwardenBTDir}tmp/

tar -czf  ${bitwardenBPath}/$(date '+%Y%m%d-%H%M').tar.gz -C  ${bitwardenBTDir} .
rm -rf ${bitwardenBTDir}

后续如果需要恢复,就把挂载目录清空解压一个备份文件到里面重启docker即可。

定时更新镜像

vaultwarden 还在持续更新,为了及时用上最新的版本,设置一个定时任务,定时更新镜像。

bash 复制代码
vi /etc/cron.daily/dockerImageUpdate

脚本内容如下

bash 复制代码
#/bin/bash
docker run -d --name watchtower --rm -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --cleanup --run-once

watchtower 自动更新 Docker 容器基础镜像的流程。

多次失败屏蔽ip fail2ban

待续

填坑记录

domain 重启 404

设置domain参数后重启docker,访问就404,暂未搜到解决方法。

绕行方案,删除domain参数,重启docker后通过ip:端口访问admin管理页面设置domain。

TOTP 时区问题

报错如下

txt 复制代码
发生错误。
Invalid TOTP code! Server time: 2023-11-15 06:46:43 UTC IP: 172.xx.xx.xx

docker镜像内时间错误

启动时将时间挂载进去。

bash 复制代码
docker run ······ -v /etc/localtime:/etc/localtime ·····

改完之后依旧不行,苦苦寻找解决方案,最后发现存的totp太多了用错了 😅。

待续

相关推荐
阿尔帕兹1 小时前
构建 HTTP 服务端与 Docker 镜像:从开发到测试
网络协议·http·docker
ZHOU西口3 小时前
微服务实战系列之玩转Docker(十八)
分布式·docker·云原生·架构·数据安全·etcd·rbac
川石课堂软件测试8 小时前
性能测试|docker容器下搭建JMeter+Grafana+Influxdb监控可视化平台
运维·javascript·深度学习·jmeter·docker·容器·grafana
‍。。。8 小时前
使用Rust实现http/https正向代理
http·https·rust
Source.Liu8 小时前
【用Rust写CAD】第二章 第四节 函数
开发语言·rust
monkey_meng8 小时前
【Rust中的迭代器】
开发语言·后端·rust
余衫马8 小时前
Rust-Trait 特征编程
开发语言·后端·rust
monkey_meng8 小时前
【Rust中多线程同步机制】
开发语言·redis·后端·rust
追风林15 小时前
mac 本地docker-mysql主从复制部署
mysql·macos·docker
hikktn16 小时前
如何在 Rust 中实现内存安全:与 C/C++ 的对比分析
c语言·安全·rust