Featured image of post vaultwarden - 一个强大的密码管理服务器

vaultwarden - 一个强大的密码管理服务器

你是不是有很多账号都是一样的密码, 但是又怕撞库攻击? 亦或者是虽然都是不同的密码但是很难全部记住? Vaultwarden针对这种情况提供了有效的密码管理解决方案, 功能强大, 支持跨平台

不久之前发现我的网易账号被撞库攻击了,用的密码是我最早用的密码,还有最近一次密码泄露事件是超星学习通的数据库被脱裤的消息,涉及了1.6亿条个人信息,种种消息表明,我应该考虑使用密码管理器了。

经过了解之后发现,密码管理器市面上虽然有1Password等优秀商业方案,但是要付费。主流浏览器Chrome,Firefox等也提供原生的密码保存方案,但是也仅仅只能在浏览器使用,不能跨平台使用。

最后发现了 bitwarden ,通过使用 GitHub 开源的 vaultwarden 服务端,bitwarden 官方客户端实现跨平台 (PC, Mac, browser, android, IOS) 密码管理服务

📒 简介

bitwarden 是一款可靠的开源密码管理系统,它可以安全地接管你的所有密码,并将其加密保存在你自己的服务器上,支持全平台客户端,包括网页端、桌面端、浏览器拓展、手机应用以及Linux命令行客户端。

服务端

vaultwarden 是一个使用 Rust 编写的非官方 Bitwarden 服务器实现,较于官方版具有占用内存小、性能好的特点,它与官方的任意平台上的客户端兼容。

客户端

使用官方的客户端即可,具体 点击链接 下载各平台版本

📌 事前说明

为了文章简洁,以下参数值在本教程中用作示例,无论在哪里看到,都需要将它们替换成你的实际值:

  • 域名:vault.example.com
  • 端口号:8086

🛠 前提条件

  • 一台长期稳定运行的服务器
  • 会部署 docker
  • 会 nginx 或者 traefik 反向代理
  • 签发好了需要部署的域名的证书

✈ 部署

服务端

执行 cd 命令到你想要安装 vaultwarden 的目录,然后执行以下步骤:

自动备份配置

  1. 配置 Rclone

    执行以下命令,根据终端提示选择合适的选项进行配置

    1
    2
    3
    4
    
    docker run --rm -it \
     -v $(pwd)/back-up/config:/config/ \
     ttionya/vaultwarden-backup:latest \
     rclone config
    

    支持的远程储存系统请看 rclone

  2. 检测 Rclone

    1
    2
    3
    4
    
    docker run --rm -it \
     -v $(pwd)/back-up/config:/config/ \
     ttionya/vaultwarden-backup:latest \
     rclone config show
    

运行服务端

  1. 创建 docker-compose.yml

     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
    35
    36
    37
    38
    39
    40
    
    version: '3.7'
    
    services:
      vaultwarden:
        image: vaultwarden/server:latest
        restart: always
        ports:
          - '8086:80' # 这里设置你镜像映射的端口
        environment:
          LOG_FILE: /data/log/vaultwarden.log # 镜像内 log 文件存储位置
          TZ: Asia/Shanghai # 镜像时区
          ADMIN_TOKEN: '' # vaultwarden 管理员 token (登录后台需要)
          SIGNUPS_ALLOWED: 'false' # 是否允许用户注册 (为false则只有管理员邀请才能使用你部署的vaultwarden)
        volumes:
          - ./vaultwarden/data:/data/
          - ./vaultwarden/log:/data/log
    
      backup:
        image: ttionya/vaultwarden-backup:latest
        restart: always
        environment:
          RCLONE_REMOTE_NAME: 'aliyun' # 填刚刚在 Rclone 配置的远程名称
          RCLONE_REMOTE_DIR: '/vaultwarden-stellarisw' # 填 Rclone 备份文件存储的位置
    #      RCLONE_GLOBAL_FLAG: ''
          CRON: '5 * * * *' # 备份时间的 Cron 表达式
          ZIP_ENABLE: 'TRUE' # 将所有备份文件打包为压缩文件
          ZIP_PASSWORD: 'WHEREISMYPASSWORD?' # 压缩文件的密码
          ZIP_TYPE: 'zip' # 压缩文件格式
          BACKUP_FILE_DATE_SUFFIX: '' # 备份文件名后缀
          BACKUP_KEEP_DAYS: 0 # 保存最近 x 天的备份文件,设置为 0 会保存所有备份文件
          TIMEZONE: 'Asia/Shanghai' # 镜像时区
        #   PING_URL: ''
        #   MAIL_SMTP_ENABLE: 'FALSE'
        #   MAIL_SMTP_VARIABLES: ''
        #   MAIL_TO: ''
        #   MAIL_WHEN_SUCCESS: 'TRUE'
        #   MAIL_WHEN_FAILURE: 'TRUE'
        volumes:
          - ./back-up/data:/bitwarden/data/
          - ./back-up/config:/config/
    
  2. 运行镜像

    1
    
    docker-compose up -d
    

反向代理

介绍两种方式设置反向代理,Nginx 和 Traefik,任选一种即可

Nginx
 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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
server
	{
		listen 80;
		server_name vault.example.com www.vault.example.com;
		#rewrite ^(.*) https://$host$1 permanent;
		
		# 防止被搜索引擎收录
		if ($http_user_agent ~* "qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-			Google|Feedfetcher-Google|Yahoo! Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web 						spider|MSNBot|ia_archiver|Tomato Bot|^$") {  
        		return 404;
            }
		
		return 301 https://$server_name$request_uri;
}

server
    {	
        listen 443 ssl;
        server_name vault.example.com www.vault.example.com;
        charset utf-8;
		
		# 填写你的域名证书文件位置
        ssl_certificate /www/cert/cert.pem;
        ssl_certificate_key /www/cert/key.pem;
		
		ssl_session_cache shared:SSL:10m;
		ssl_session_timeout 5m;
		ssl_protocols TLSv1.2 TLSv1.3; 
		ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
		ssl_prefer_server_ciphers on;
		proxy_ssl_session_reuse off;
		
		access_log /www/wwwlogs/blog.stellaris.wang/gf-app-access.log;
		error_log /www/wwwlogs/blog.stellaris.wang/gf-app-error.log;
		


		location / {
  	    	proxy_pass http://127.0.0.1:8086;
        	proxy_http_version                 1.1;
        	proxy_cache_bypass                 $http_upgrade;

        	# Proxy headers
        	proxy_set_header Upgrade           $http_upgrade;
        	proxy_set_header Connection        $connection_upgrade;
        	proxy_set_header Host              $host;
        	proxy_set_header X-Real-IP         $remote_addr;
        	proxy_set_header Forwarded         $proxy_add_forwarded;
        	proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
        	proxy_set_header X-Forwarded-Proto $scheme;
        	proxy_set_header X-Forwarded-Host  $host;
        	proxy_set_header X-Forwarded-Port  $server_port;

        	# Proxy timeouts
        	proxy_connect_timeout              60s;
        	proxy_send_timeout                 60s;
        	proxy_read_timeout                 60s
		}
		
}
traefik

静态配置:

 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
35
36
37
38
39
api:
  dashboard: true
#  insecure: true

entryPoints:
  web:
    address: ":80"
    http:
      redirections:
        entryPoint:
          to: webSecure
          scheme: https
  webSecure:
    address: ":443"

providers:
  file:
    filename: "/traefik/config/dynamic_conf.yaml" # 你的动态配置文件位置
    watch: true

# 网站证书自动签发配置
certificatesResolvers:
  dns:
    acme:
      email: "" # 你的邮箱
      storage: "/traefik/acme.json"
      # 2021年1月11日之后颁发的新证书需要使用新的CA根目录 需要指定preferredChain参数
      # 而不再使用https://acme-staging-v02.api.letsencrypt.org/directory
      caServer: "https://acme-v02.api.letsencrypt.org/directory"
      certificatesDuration: 2160
      preferredChain: 'ISRG Root X1'
      keyType: RSA4096
      # 这里使用 DNS 解析来签发证书
      dnsChallenge:
        provider: dnspod # 设置你的域名提供商
        delayBeforeCheck: "1s"
        resolvers:
          - "1.1.1.1:53"
          - "8.8.8.8:53"

动态配置:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
http:
  routers: 
    vaultwarden:
      rule: Host(`vault.example.com`)
      service: vaultwarden
      tls:
        certResolver: dns
  services:
    vaultwarden:
      loadBalancer:
        servers:
          - url: "http://172.21.95.142:8086" # 设置你的内网 IP 地址

后台设置

进入管理页面 https://vault.example.com/admin 配置,具体配置选项说明看 Bitwarden 部署和使用

在邮箱设置中多说一点,邮箱一定要设置,因为要必须要管理员邀请用户才能使用你部署的 vault

image-20220908195559702

如果你没有自己的邮件服务器,请看我的这篇文章 [搭建一个自己的邮件服务器](https://blog.stellaris.wang/p/experience/mail-server/)

当然,你也可以先在 docker-compose.yml 文件中将 environment 部分的 SIGNUPS_ALLOWED 的值调整为 false

在你自己注册完自己的帐号后可以选择在后台管理页面关闭注册功能

客户端

各平台的下载页面请进入 bitwarden 官网下载

使用方法以 app 为例:

  1. 进入登录主页面后,点击右上角的设置按钮

    image-20220908200252416

  2. Server URL 换成你自己的服务器地址即可

    image-20220908200326564

另外提示一下,可以在 app 设置中文界面

使用技巧

可以进入 chrome://extensions/shortcuts 地址,设置 bitwarden 插件自动填充的快捷键

image-20220908200604384

推荐设置为 Ctrl+Q

如果一个网站有多个账户的话,你可以多次按快捷键进行切换账户和密码

导入密码

相信大家在用 bitwarden 之前都是用的 chrome 来保存或者自动填充你的密码吧?

bitwarden 支持从众多其他密码平台批量导入密码,非常全面。包括各种浏览器,LassPass,1Password等商业平台,也支持如passbolt等开源平台,很方便!

chrome 导出密码并导入进 bitwarden 为例:

  1. 依次进入设置->自动填充->密码->导出密码

    image-20220908201014960

  2. 点击按钮->导出密码

    image-20220908200945292

  3. 进入 vault.example.com 将刚刚得到的 .csv 文件导入到密码库中

    image-20220908201141982

📝 参考链接

BitWarden 部署和使用

Docker部署Vaultwarden(Bitwarden_RS)

部署自己的密码库 Vaultwarden

渝ICP备2022001449号
本站总访问量