让我们部署自己的密码管理服务器吧 - Bitwarden
Bitwarden 是一个开源的的密码管理器,可以部署自己的私有密码管理服务器
Preface
Google Chrome / Edge 等,都有自己的密码管理功能,还能自动的填充登录表单等,这很好,但又不很好,例如我不想让它自动填充的时候,它总是自动把我的邮箱地址填充上去@猫猫,而且浏览器保存的登录账号和密码,可以轻松的钓鱼获取到,这就很不安全了;我想拥有自己的密码管理器,购买那些付费服务对我而言还是太昂贵了;不得不承认的,某些付费的密码管理器做的真不错;所以看中了 Bitwarden
,这个可以部署到自己的服务器上面,数据迁移也很方便。不过官方的 System
又笨重,又臃肿,而且还需要购买付费版 Id 和 Key,才能解锁付费版本的高级功能,这就有点不是太爽。于是,我找到了 vaultwarden
,它基本复刻了所有的功能(包括需要付费解锁的高级功能),而且还支持两重校验(TOTP 验证码功能),意味着我不用分别安装 Google OR Microsoft 的密码管理器了,简直不要太舒服了。
Start
Deploy
开始,首先你得有 Docker + Docker-Compose + Nginx(任一可以进行反向代理的 Web 端) + SSL证书
Docker-Compose Version : >= 2.x
Docker Version : >= 20.10.x
官方示例的是 docker 命令,虽好,但是管理不够方便,我是非常推荐 docker-compose 一把梭,管理更加直观,方便多了。
docker-compose.yml 示例
version: '3.8'
services:
key:
container_name: key-server
image: vaultwarden/server:latest
environment:
- TZ=Asia/Shanghai # 传入的时区
- SIGNUPS_ALLOWED=false # 允许用户注册
- WEBSOCKET_ENABLED=true # 开启 Websocket
- ADMIN_TOKEN= # Admin 管理面板的 token ,访问路由 /admin
- SMTP_HOST=smtp.qiye.aliyun.com # SMTP 服务器地址
- SMTP_FROM= # STMP 的来源,可以忽略
- SMTP_PORT=587 # 发送邮件的端口,一般是 587,默认即可
- SMTP_SECURITY=starttls # 使用 TLS,默认即可
- SMTP_USERNAME= # SMTP 邮箱用户名
- SMTP_PASSWORD= # SMTP 邮箱密码
volumes:
- ./data/keycos:/data # 映射的数据卷,用于数据持久化
ports:
- '8080:80' # 映射的端口
networks:
- key-network
restart: on-failure:16
networks:
key-network:
driver: bridge
有 docker-compose.yml 文件,那就很简单了,我们填写好 docker-compose.yml 文件里面的信息,直接梭哈
注意:首次启动,上面的 SIGNUPS_ALLOWED
这一项应为 true
当你注册完毕,修改为 false
重新生成容器
sudo docker compose up -d # 2.x 版本用法
sudo docker-compose up -d # 1.x 版本用法,2.x仍兼容
看到上面的端口映射关系,你可能会好奇,为啥不直接暴露 80 端口?这样是不太安全的,我们需要使用 Nginx 进行反向代理
Reverse_Proxy
进行反向代理,让 Nginx 暴露出来,防止直接被确认后端服务指纹,也方便我们架设 WAF 去拦截非法请求。
反向代理+网站 配置文件示例如下
# The `upstream` directives ensure that you have a http/1.1 connection
# This enables the keepalive option and better performance
#
# Define the server IP and ports here.
upstream vaultwarden-default {
zone vaultwarden-default 64k;
server 127.0.0.1:8080;
keepalive 2;
}
# Redirect HTTP to HTTPS
server {
listen 80;
listen [::]:80;
server_name vaultwarden.example.tld;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name vaultwarden.example.tld;
# Specify SSL Config when needed
#ssl_certificate /path/to/certificate/letsencrypt/live/vaultwarden.example.tld/fullchain.pem;
#ssl_certificate_key /path/to/certificate/letsencrypt/live/vaultwarden.example.tld/privkey.pem;
#ssl_trusted_certificate /path/to/certificate/letsencrypt/live/vaultwarden.example.tld/fullchain.pem;
client_max_body_size 128M;
location / {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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;
proxy_pass http://vaultwarden-default;
}
# Optionally add extra authentication besides the ADMIN_TOKEN
# Remove the comments below `#` and create the htpasswd_file to have it active
#
#location /admin {
# # See: https://docs.nginx.com/nginx/admin-guide/security-controls/configuring-http-basic-authentication/
# auth_basic "Private";
# auth_basic_user_file /path/to/htpasswd_file;
#
# proxy_http_version 1.1;
# proxy_set_header "Connection" "";
#
# 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;
#
# proxy_pass http://vaultwarden-default;
#}
}
这样我们就部署好反向代理了,但是鉴于各种客户端和桌面端都需要借助于 HTTPS
OR WSS
访问;所以,我们还需要部署 SSL 证书,至于如何申请和安装 SSL 证书,我就不再赘述了,Google 上各个大佬都写的非常详尽。
Use
在浏览器上,我们可以使用插件,搜索 Bitwarden ,安装即可,记得登录的时候设置为自己的服务器。
例如
我们仅需要设置服务器地址即可,其他客户端操作同理,同时浏览器插件还可以与桌面端进行解锁联动,这个功能超赞!支持指纹快速解锁(WIndows Hello),在手机上也能自动识别到可以填充的表单,解锁方式可以设置为指纹解锁;当然,都支持 PIN 码解锁!
当然你也可以进入 /admin 进入超级管理员界面进行管理,这个 token 已经在 docker-compose.yml 传入环境变量值中,推荐使用复杂度比较高的 token
例如
➜ ~ openssl rand -hex 48
50f2830c5331dc624d761188b686e3ff87edaa1bd7c82f09003902cc978151d93559a9c713291f13bbaa1d199a253e53
可以生成一个复杂度比较高的 token ,然后写入 docker-compose.yml 即可,然后重新生成容器,就可以访问 /admin 管理界面了
End
享受你的私有密码管理服务器吧,浏览器插件也可以填充表单哦?享受它吧!
几天后,我愉快的把 Edge 和 Chrome 里面保存的登录密码和填充的表单清空了,这个东西用起来太舒服了!