部署自己的私人密码管理系统-Bitwarden

部署自己的私人密码管理系统-Bitwarden

hash070 1,471 2022-06-22

简介

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

这里我们使用Bitwarden_rs的Docker发行版镜像来部署,因为它使用Rust重构了服务端,速度更快、资源占用更小。

部署服务

前置条件:

  • 首先你需要有一台长期稳定的安全的服务器

如果你的服务器动不动就重装系统,那么就非常不适合用来存这些敏感且重要的数据,你应该知道这些数据的丢失将可能导致你永久失去一些服务的访问权。

  • 你应当拥有一定的相关技术知识

如果你不知道怎么配置Nginx反向代理,不知道什么是SSL/TLS加密,不会部署和维护容器,而且对于网络通信安全没有什么认知和概念的话,不建议使用自建的密码托管服务。

对于不满足上述的两种条件的同学,我推荐你直接去使用可信的第三方平台提供的密码托管服务。
下面列举一些知名的密码托管服务商

Bitwarden官方:https://bitwarden.com
1Password:https://1password.com/zh-cn/
Keepeer:https://www.keepersecurity.com
And so on…

  • 服务器需要有安装Docker和DockerCompose

如果你没有安装,可以看我的这篇文章:https://www.hash070.top/archives/docker-and-docker-compose-install.html

创建数据存放目录与docker-compose描述文件

首先我推荐创建一个全新的目录,专门用于存放Bitwarden的数据文件,后期如果需要迁移服务器的话直接把这个文件夹打包带走就可以了。

这里假设我们创建了一个名为Bitwarden的文件夹,专门存放该容器的数据文件。

mkdir Bitwarden
cd Bitwarden

然后使用vim创建并填写docker-compose描述文件。

vim docker-compopse.yml

向这个文件中写入如下文本

version: '3.3'
services:
    server:
        container_name: bitwardenrs
        restart: unless-stopped
        environment:
            - WEBSOCKET_ENABLED=true
            - SIGNUPS_ALLOWED=true
        volumes:
            - './data/:/data/'
        ports:
            - '35667:80'
            - '3012:3012'
        image: 'vaultwarden/server:latest'

其中35667:80意思是将容器的http端口映射到服务器的35567端口上,你可以根据自己的需求随意更改

另外一个3012端口是用于WebSocket通信的

以上两个端口不应在防火墙中开放,我们后面会使用Nginx反向代理这两个端口。

上线Docker容器

当你将compose描述文件正确填写并保存后,在当前文件夹下,通过执行下面这行命令就可以上线你的Bitwarden容器了。

docker-compose up -d

附 docker-compose常用命令:

# 上线容器
docker-compose up -d
# 停止容器
docker-compose stop
# 启动容器
docker-compose start
# 重启容器
docker-compose restart
# 下线(删除)容器
docker-compose down
# 删除容器不会导致你的数据丢失,你的数据库保存在了当前目录下的data文件夹内,请妥善保管该目录

反向代理

我们使用Nginx反向代理来实现网站的SSL加密以保证数据传输安全并隐藏与保护后端容器。

关于SSL证书

你可以通过acme脚本自动申请与部署,具体看这篇文章:https://www.hash070.top/archives/acme-sh-note-2.html

也可以向阿里云申请一年的免费SSL证书:https://www.hash070.top/archives/ali-free-ssl.html

Nginx基础配置太简单了,这里我们来着重讲一下反向代理部分吧

我的反向代理配置如下

    location / {
        proxy_pass http://127.0.0.1:35667;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
  
    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:35667;
    }

第一部分:声明了将根目录反向代理到容器映射到宿主机的http端口上。

第二部分:由于我们开启了WebSocket功能,所以需要将/notifications/hub路径反向代理到容器映射到宿主机的http端口上,即3012端口。

第三部分:根据文档描述,我们应该将这个目录反代到http端口上。

高级设置:后台管理员

注意,一旦设置管理员口令并启用管理员面板,该功能将无法关闭,且无法重置该口令

要启用后台管理员,你需要在compose描述文件中的environment项中添加如下配置

ADMIN_TOKEN=管理员口令

注意,口令的长度应该很长且无规律,弱口令将导致你的密码管理服务器不安全。

Tip:可以使用OpenSSL生成随机字符串来当管理员口令

下面这条命令可以生成一个48位的字符串,这些字符串可以充当口令

openssl rand -base64 48

image-20220622213424153

修改后的environemet部分应该看起来像是这样的

        environment:
        	- ADMIN_TOKEN=txWN3bnqTGJv9ENgNko0euISyiO51p7zXSl8QP/3wRO5VC1iJF0LiU2InLoO3Nzi
            - WEBSOCKET_ENABLED=true
            - SIGNUPS_ALLOWED=true

你需要通过下线(down)容器并重新上线(up)容器来让修改生效。

之后你可以通过访问域名+/admin的方式进入管理面板

https://password.apple.com/admin

你需要在这里输入你在环境变量中设置的Token

image-20220622214321902

关闭注册功能

在你自己注册完自己的帐号后可以选择关闭注册功能。

environment部分的SIGNUPS_ALLOWED的值调整为false

        environment:
        	- ADMIN_TOKEN=txWN3bnqTGJv9ENgNko0euISyiO51p7zXSl8QP/3wRO5VC1iJF0LiU2InLoO3Nzi
            - WEBSOCKET_ENABLED=false
            - SIGNUPS_ALLOWED=true

然后down掉容器并重新上线容器使其生效

docker-compose down
docker-compose up -d

更多的进阶配置可以看该镜像的官方文档:https://github.com/dani-garcia/vaultwarden/wiki

使用教程

注册帐号

在配置完反代后我们就可以输入域名,进入Bitwarden开始使用了

一定要确保在此之前你已经正确地配置了SSL证书,否则你的通信内容将全过程裸奔,还不如不用!

image-20220622225045905

image-20220622210102026

ps:如果是个人使用的话,注册完帐号后建议关闭注册功能。

更改语言

默认语言为英文,如果你用不习惯可以将语言改为中文

image-20220622220044393

导入你的密码

从浏览器中导出密码

以我所使用的Chrome浏览器为例:

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

image-20220623074655461
image-20220623074719208
image-20220623074816916

最终会导出一个csv文件,你在Chrome中储存的所有密码都会以明文的形式保存在里面

因此您应该明白该文件高度敏感和机密,不要使用任何第三方软件传输该文件,您应尽快将该文件导入到Bitwarden中并在这之后立即彻底销毁该文件。

在Bitwarden中导入密码

打开你的Bitwarden,找到工具->导入数据->选择格式->选择刚导出的文件->点击导入数据
导入格式根据你的实际情况来选择,我是用Chrome导出的csv,所以这里我理所应当地选择了Chrome(csv)

image-20220623075547588

然后你就可以看到你的密码库中已经可以看到刚刚导入的密码了。

image-20220623075834720

下载与使用app

appstore搜索bitwarden就能找到

进入软件后,点击右上角的设置图标

61660889-47C8-4372-8118-EC197EF23857.png

Server URL换成你自己的服务器地址

4BD6651E-D33D-40CB-93AC-33DAC477D6E5.png

然后点击登录,输入你自己的帐号密码即可。

在iOS系统中,设置->密码->自动填充中,勾选bitwarden后就可以让它来接管你的密码了。

1384629A-2801-475C-A474-AC63E86B353B.png

其他平台的软件使用方法我就不一一介绍了

使用方法都大同小异,点击右上角的获取应用按钮可以查看和下载官方发布的客户端

image-20220622223736474

image-20220622223822264