为什么需要一个密码系统?

现如今,密码管理是一个令人头疼的问题,不仅要记得住,还要保证密码的安全和不泄露。为了避免撞库,所有账号用同一个密码显然不是一个好方法,那么今天介绍的 Bitwarden 或许可以提供一个新思路。
Bitwarden 开源免费跨平台,支持 iOS / Android,并且提供多款主流浏览器扩展,可以在任何设备上同步使用和管理你的密码,它的工作方式介于 1Password 和 LastPass 之间,它先使用高强度的 AES256 算法对你的个人数据进行本地加密,然后再传输到云端服务器来实现网络同步。
更厉害的是它可以搭建在自己的私人服务器上,安全性上自然要比放在微软、Google、苹果、华为等等任何服务提供商手里都要安全得多,毕竟像苹果”艳照门“那种事儿大家都不想的嘛=。=

相比于1Password,Bitwarden自建密码存储系统好处有三点:

一是不用支付“高额”的费用,1Password一年需要35美元的费用,有这个钱买个视频网站会员不香吗?而且自己买服务器要更省钱得多,而且除了搭建这个之外,还可以用来干别的;
二是Bitwarden提供了全平台的插件,电脑PC端、手机APP、Chrome、Firefox等插件,自动填充功能和1Password相差无异;
三是安全性掌握在自己手里,再也不用担心1Password“删库跑路”了。

今天,就来介绍如何用自己的VPS搭建Bitwarden密码存储系统。

一、Bitwarden密码管理系统搭建前期准备

1、开源地址

官网:https://bitwarden.com/
第三方项目:https://github.com/dani-garcia/bitwarden_rs

Bitwarden官方推荐使用Docker镜像安装,但是Bitwarden 服务器使用 .Net 开发,如果使用 Docker 来部署,镜像体积过大;此外它使用 MSSQL 数据库,部署这个数据库对服务器配置要求比较高。

而bitwarden_rs采用 Rust 实现了 Bitwarden服务器,这个实现更进一步降低了对机器配置的要求,并且 Docker 镜像体积很小,部署非常方便。此外,官方服务器中需要付费订阅的一些功能,在这个实现中是免费的。

2、需要的准备

一台VPS主机、一个域名。
我刚好在腾讯云活动时买了4年的升配,还是很便宜的。

3、配置好Nginx

建议使用Oneinstack或者LNMP一键包,一键安装好Nginx。

OneinStack是一键PHP/JAVA安装脚本工具,包含lnmp,lamp,lnmpa,ltmp,lnmh,MySQL,PostgreSQL,MongoDB等。
通过创建虚拟机和指定端口,可以分出多个虚拟主机进行应用部署与网站存放等。Bitwarden不影响VPS建站,你可以在你的Web服务器上运行Bitwarden,这也是节省成本的原因了。

OneinStack支持一键安装的操作系统有:CentOS 6~7(包括redhat) 、Debian 6~8 、Ubuntu 12~16 、Aliyun Linux 15.1。主要包括以下组合:

lnmp(Linux + Nginx+ MySQL+ PHP)
lamp(Linux + Apache+ MySQL+ PHP)
lnmpa(Linux + Nginx+ MySQL+ PHP+ Apache):Nginx处理静态,Apache(mod_php)处理动态PHP
lnmt(Linux + Nginx+ MySQL+ Tomcat):Nginx处理静态,Tomcat(JDK)处理JAVA
lnmh(Linux + Nginx+ MySQL+ HHVM)

(1)交互安装

安装命令:

yum -y install wget screen             #for CentOS/Redhat
# apt-get -y install wget screen     #for Debian/Ubuntu

wget http://mirrors.linuxeye.com/oneinstack-full.tar.gz #包含源码,国内外均可下载
tar xzf oneinstack-full.tar.gz
cd oneinstack #如果需要修改目录(安装、数据存储、Nginx日志),请修改options.conf文件
screen -S oneinstack #如果网路出现中断,可以执行命令`screen -R oneinstack`重新连接安装窗口
./install.sh    #请勿sh install.sh或者bash install.sh这样执行
#注意如果权限有问题,前面记得加上sudo先。整个安装过程速度很慢,耐心等待……

(2)如何添加附加组件?

如果之前没有安装组件,后续补充安装,统一入口为./install.sh,如之前没有安装php redis扩展,
补充安装命令:./install.sh --php_extensions redis

~/oneinstack/addons.sh

(3)Nginx启动、重启、关闭

cd /usr/local/nginx/sbin
# 启动
./nginx    #有时候占用80端口,一般是nginx已经启动了,直接运行重启命令
# 重启
./nginx -s reload

(4)安装好Docker

你需要在VPS主机上先安装好 Docker CE (社区版)和Docker Compose,官网如下

安装 Docker CE (社区版):https://docs.docker.com/install/linux/docker-ce/ubuntu/
安装 Docker Compose:https://docs.docker.com/compose/install/#install-compose

以下命令基于Cent OS7.6系统演示:
安装Docker CE (社区版):

[root@VM-4-5-centos sbin]# yum-config-manager \
>     --add-repo \
>     http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
已加载插件:fastestmirror, langpacks
adding repo from: http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
grabbing file http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
repo saved to /etc/yum.repos.d/docker-ce.repo
[root@VM-4-5-centos sbin]# yum install docker-ce docker-ce-cli containerd.io
从 https://mirrors.aliyun.com/docker-ce/linux/centos/gpg 检索密钥
导入 GPG key 0x621E9F35:
 用户ID     : "Docker Release (CE rpm) <docker@docker.com>"
 指纹       : 060a 61c5 1b55 8a7f 742b 77aa c52f eb6b 621e 9f35
 来自       : https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
是否继续?[y/N]:y
完毕!
[root@VM-4-5-centos sbin]# sudo systemctl start docker
[root@VM-4-5-centos sbin]# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete 
Digest: sha256:9f6ad537c5132bcce57f7a0a20e317228d382c3cd61edae14650eec68b2b345c
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

安装 Docker Compose:

[root@VM-4-5-centos sbin]# curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   633  100   633    0     0    555      0  0:00:01  0:00:01 --:--:--   555
100 12.1M  100 12.1M    0     0   774k      0  0:00:16  0:00:16 --:--:--  358k
[root@VM-4-5-centos sbin]# chmod +x /usr/local/bin/docker-compose
#检测一下是不是成功安装
[root@VM-4-5-centos sbin]# docker-compose --version
docker-compose version 1.29.2, build 5becea4c

二、安装Bitwarden密码管理系统

1、做好DNS解析

在域名DNS管理处添加好A记录,将你的域名解析到你的VPS主机上。

2、创建虚拟主机

#命令
[root@VM-4-5-centos sbin]# ./vhost.sh

#互动安装
#######################################################################
#       OneinStack for CentOS/RedHat 7+ Debian 8+ and Ubuntu 16+      #
#       For more information please visit https://oneinstack.com      #
#######################################################################

What Are You Doing?
        1. Use HTTP Only
        2. Use your own SSL Certificate and Key        #自己购买ssl替换,自动配置http、https
        3. Use Let's Encrypt to Create SSL Certificate and Key
        q. Exit
Please input the correct option: 3    #Let's免费证书,自动配置http、https

Please input domain(example: www.example.com): pwd.linjoey.cn        #添加的虚拟主机域名
domain=pwd.linjoey.cn

Please input the directory for the domain:pwd.linjoey.cn :
(Default directory: /data/wwwroot/pwd.linjoey.cn):         #网站根目录,要用绝对路径
Virtual Host Directory=/data/wwwroot/pwd.linjoey.cn

Create Virtul Host directory......
set permissions of Virtual Host directory......

Do you want to add more domain name? [y/n]: n    #是否添加更多域名或IP访问同一个网站根目录

Do you want to redirect all HTTP requests to HTTPS? [y/n]: y    #是否设置http强制跳转至https协议
[Sat 24 Apr 2021 01:32:12 AM CST] Using CA: https://acme-v02.api.letsencrypt.org/directory
[Sat 24 Apr 2021 01:32:12 AM CST] Creating domain key
[Sat 24 Apr 2021 01:32:12 AM CST] The domain key is here: /root/.acme.sh/pwd.linjoey.cn/pwd.linjoey.cn.key
[Sat 24 Apr 2021 01:32:12 AM CST] Single domain='pwd.linjoey.cn'
[Sat 24 Apr 2021 01:32:12 AM CST] Getting domain auth token for each domain
[Sat 24 Apr 2021 01:32:15 AM CST] Getting webroot for domain='pwd.linjoey.cn'
[Sat 24 Apr 2021 01:32:15 AM CST] pwd.linjoey.cn is already verified, skip http-01.
[Sat 24 Apr 2021 01:32:15 AM CST] Verify finished, start to sign.
[Sat 24 Apr 2021 01:32:15 AM CST] Lets finalize the order.
[Sat 24 Apr 2021 01:32:15 AM CST] Le_OrderFinalize='https://acme-v02.api.letsencrypt.org/acme/finalize/120047872/9249683891'
[Sat 24 Apr 2021 01:32:18 AM CST] Downloading cert.
[Sat 24 Apr 2021 01:32:18 AM CST] Le_LinkCert='https://acme-v02.api.letsencrypt.org/acme/cert/03a09b6e4fbb93c57c27d83b4e5fafea1a35'
[Sat 24 Apr 2021 01:32:19 AM CST] Cert success.
-----BEGIN CERTIFICATE-----
MIIFIzCCBAugAwIBAgISA6Cbbk+7k8V8J9g7Tl+v6ho1MA0GCSqGSIb3DQEBCwUA
MDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQD
EwJSMzAeFw0yMTA0MjMxNjMyMTdaFw0yMTA3MjIxNjMyMTdaMBkxFzAVBgNVBAMT
DnB3ZC5saW5qb2V5LmNuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
uPiHzJ9n4j+lQmWJMGtGgdB8CwoqqUUG9LRvHJpOpxvNufwx768UKqXxGwfbcdqc
XlRUWTUEBSQFJYMBzEzCzRbfG5nEB7ctpSu0TRyupTsAaqeOHVrsirTLmftS6dKV
PyKHb6FpkOvZNW9+uNVsi+B9OVMb530X9DdccN0S2d1BgmTwrJuzjpz6Ehi0JgsY
Qk9FAZXIYsYEkI5td2ripIjitH6QEgB3nyepm3Ilf6qG6n6NL7w4c3Z9LuCW7sEC
QY6f+ZvYH8AtfGTrK7Fn8K5VC8UCBcPN0rfuEa+fGLzAiEJoqUT5XdEWNncOozNq
7zoKP2zo4IS3o5La1r5iYQIDAQABo4ICSjCCAkYwDgYDVR0PAQH/BAQDAgWgMB0G
A1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAMBgNVHRMBAf8EAjAAMB0GA1Ud
DgQWBBR++uDiRt9GwNOEGrYaRjp5xBQVQzAfBgNVHSMEGDAWgBQULrMXt1hWy65Q
CUDmH6+dixTCxjBVBggrBgEFBQcBAQRJMEcwIQYIKwYBBQUHMAGGFWh0dHA6Ly9y
My5vLmxlbmNyLm9yZzAiBggrBgEFBQcwAoYWaHR0cDovL3IzLmkubGVuY3Iub3Jn
LzAZBgNVHREEEjAQgg5wd2QubGluam9leS5jbjBMBgNVHSAERTBDMAgGBmeBDAEC
ATA3BgsrBgEEAYLfEwEBATAoMCYGCCsGAQUFBwIBFhpodHRwOi8vY3BzLmxldHNl
bmNyeXB0Lm9yZzCCAQUGCisGAQQB1nkCBAIEgfYEgfMA8QB2AESUZS6w7s6vxEAH
2Kj+KMDa5oK+2MsxtT/TM5a1toGoAAABeP/KFwYAAAQDAEcwRQIgR20ZoUYdv7zu
CQM0gnLVzGuLfxUc33E2hX0dtRJ1NlkCIQDA5J4qJDCo+uUVs9V1CISfsFvUTGzb
JwD+oKVHG7qKhAB3APZclC/RdzAiFFQYCDCUVo7jTRMZM7/fDC8gC8xO8WTjAAAB
eP/KGO8AAAQDAEgwRgIhANu6Y0WgymYrFNb9rYX2AcsFODfM+jSOfAgw+fNHF/DS
AiEAwC4Ysk90CoQBwBq4No5HzSZlgHX7goBYinsos/SnefgwDQYJKoZIhvcNAQEL
BQADggEBAFqvDXnNLjfXgYcSa1JiBe4YKAiG4JDnIm18zEZbKXdLMUWazCnCyW6k
HAy3mJ7HPXqz82U3XMjeJ36Pmc09KyNHeW8GPBmbJDdER8M9stNh2ki9ok7RpkUA
UZvRhhMuOorjllqBUkkQnFBBLO08M83AkHGy80dWySp6Q611Fd0Y76kpZGJymDcW
PbJLH/ueZhJ1lz/C9EUJhV2DsmBXLpFEQ9/5nt2O300A8yoWPszRyBwDF/9VI4qI
s1JJlMnJ3bxCjq7ri2YtR5ZYbDjafT19fn6A+KCcsHatqO+ubp6m3bRE5u97RuHL
CnKjdxU4wHjb2iTmYFX5LaP238S9cic=
-----END CERTIFICATE-----
[Sat 24 Apr 2021 01:32:19 AM CST] Your cert is in  /root/.acme.sh/pwd.linjoey.cn/pwd.linjoey.cn.cer 
[Sat 24 Apr 2021 01:32:19 AM CST] Your cert key is in  /root/.acme.sh/pwd.linjoey.cn/pwd.linjoey.cn.key 
[Sat 24 Apr 2021 01:32:19 AM CST] The intermediate CA cert is in  /root/.acme.sh/pwd.linjoey.cn/ca.cer 
[Sat 24 Apr 2021 01:32:19 AM CST] And the full chain certs is there:  /root/.acme.sh/pwd.linjoey.cn/fullchain.cer 

Do you want to add hotlink protection? [y/n]: n        #是否设置防盗链

Allow Rewrite rule? [y/n]: y    #是否设置伪静态

Please input the rewrite of programme :
wordpress,opencart,magento2,drupal,joomla,codeigniter,laravel
thinkphp,pathinfo,discuz,typecho,ecshop,nextcloud,zblog,whmcs rewrite was exist.
(Default rewrite: other): pwd        #手动设定伪静态规则名字
You choose rewrite=pwd

Allow Nginx/Tengine/OpenResty access_log? [y/n]: y    #是否记录访问日志
You access log file=/data/wwwlogs/pwd.linjoey.cn_nginx.log

nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
Reload Nginx......

#######################################################################
#       OneinStack for CentOS/RedHat 7+ Debian 8+ and Ubuntu 16+      #
#       For more information please visit https://oneinstack.com      #
#######################################################################
#以下为各配置文件的路径
Your domain:                  pwd.linjoey.cn
Virtualhost conf:             /usr/local/nginx/conf/vhost/pwd.linjoey.cn.conf
Directory of:                 /data/wwwroot/pwd.linjoey.cn
Rewrite rule:                 /usr/local/nginx/conf/rewrite/pwd.conf
Let's Encrypt SSL Certificate:/usr/local/nginx/conf/ssl/pwd.linjoey.cn.crt
SSL Private Key:              /usr/local/nginx/conf/ssl/pwd.linjoey.cn.key

3、绑定域名并反代

在“/usr/local/nginx/conf/vhost/pwd.linjoey.cn.conf”路径打开Nginx配置文件,参考以下配置做好反代:(主要是后半部分复制粘贴过去,前部分每个网站不一样,需要保留你自己的原先的配置)

server {
  listen 80;
  listen [::]:80;
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  ssl_certificate /usr/local/nginx/conf/ssl/password.linjoey.cn.crt;
  ssl_certificate_key /usr/local/nginx/conf/ssl/password.linjoey.cn.key;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
  ssl_ciphers TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
  ssl_prefer_server_ciphers on;
  ssl_session_timeout 10m;
  ssl_session_cache builtin:1000 shared:SSL:10m;
  ssl_buffer_size 1400;
  add_header Strict-Transport-Security max-age=15768000;
  ssl_stapling on;
  ssl_stapling_verify on;
  server_name password.linjoey.cn;
  access_log /data/wwwlogs/password.linjoey.cn_nginx.log combined;
  index index.html index.htm index.php;
  root /data/wwwroot/password.linjoey.cn;
  if ($ssl_protocol = "") { return 301 https://$host$request_uri; }
  
  #主要修改替换这半部分
  client_max_body_size 128M;
    location / {
        proxy_set_header  Host  'password.linjoey.cn';    #这里也要记得换
        proxy_pass http://127.0.0.1:8880;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     }
    location /notifications/hub {
    proxy_pass http://127.0.0.1:3012;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    }
    location /notifications/hub/negotiate {
    proxy_pass http://127.0.0.1:8880;
    }
}

4、安装bitwarden_rs

#安装
docker pull vaultwarden/server:latest

三、Bitwarden密码管理系统运行

0、生成管理后台所需admin_token

# 生成admin_token
[root@VM-4-5-centos ~]# openssl rand -base64 30
TOYKzjH/sZURLEtCFUHL1Zsv2EDZYysRkMbrxWhe

之后域名后加 /admin 即可进入管理后台。

1、Bitwarden运行与配置

#部署Bitwarden
docker run -d --name vaultwarden \
  -e SIGNUPS_ALLOWED=true \
  -e WEBSOCKET_ENABLED=true \
  -e ADMIN_TOKEN=TOYKzjH/sZURLEtCFUHL1Zsv2EDZYysRkMbrxWhe \
  -e LOG_FILE=/data/bitwarden.log \
  -p 20001:80 \
  -p 20002:20002 \
  -v /vw-data/:/data/ \
  vaultwarden/server:latest
# SIGNUP_ALLOWED:是否允许注册
# LOG_FILE:日志保存文件路径

2、Bitwarden服务停止与启动

# 停止服务
docker stop vaultwarden
# 启动服务
docker start vaultwarden
# 查看运行容器
docker ps
# 列出所有容器
docker ps -a
# 删除某个容器
docker rm <CONTAINER ID|NAME>

3、Bitwarden禁止注册

为了保证bitwarden服务器的稳定,你可以禁止bitwarden注册新用户。

# 重新拉取镜像
docker pull vaultwarden/server:latest
# 停止原容器
docker stop vaultwarden
#删除原容器
docker rm vaultwarden
# 重新运行 docker run 命令
docker run -d --name vaultwarden \
  -e SIGNUPS_ALLOWED=false \
  -e WEBSOCKET_ENABLED=true \
  -e ADMIN_TOKEN=TOYKzjH/sZURLEtCFUHL1Zsv2EDZYysRkMbrxWhe \
  -e LOG_FILE=/data/bitwarden.log \
  -p 20001:80 \
  -p 20002:20002 \
  -v /vw-data/:/data/ \
  vaultwarden/server:latest
# 查看镜像文件
docker image ls
# 删除原镜像文件,
docker image rm $ID

4、Bitwarden升级命令

# 重新拉取镜像
docker pull vaultwarden/server:latest
# 停止原容器
docker stop vaultwarden
#删除原容器
docker rm vaultwarden
# 重新运行 docker run 命令
docker run -d --name vaultwarden \
  -e SIGNUPS_ALLOWED=true \
  -e WEBSOCKET_ENABLED=true \
  -e ADMIN_TOKEN=TOYKzjH/sZURLEtCFUHL1Zsv2EDZYysRkMbrxWhe \
  -e LOG_FILE=/data/bitwarden.log \
  -p 20001:80 \
  -p 20002:20002 \
  -v /vw-data/:/data/ \
  vaultwarden/server:latest
# 查看镜像文件
docker image ls
# 删除原镜像文件,
docker image rm $ID

四、Bitwarden密码管理系统使用

详细介绍跳转:自建超级安全密码管理服务Bitwarden保姆级使用教程

五、Bitwarden导入导出与备份

1、导入

打开你的Bitwarden网页端,选择“工具”下的“导入数据”,即可导入1Password等不同密码库的数据。

2、导出

打开你的Bitwarden网页端,选择“工具”下的“导出密码库”即可。

3、备份

bitwarden备份最关键的就是 sqlite3 数据库文件了,可以直接进入到 vw-data 目录下,将sqlite3数据库保存下来。当然你也可以将 /vw-data 目录下所有的包括附件文件夹、图标缓存文件夹、密钥等文件备份下来。

最后修改:2021 年 07 月 01 日 08 : 32 PM