使用Docker自建Bitwarden服务器
前段时间,Lastpass这样的专业密码管理软件也被爆出漏洞,泄露用户加密后的密码数据。使用Vaultwarden这种社区维护的开源软件,自建一套密码管理系统,是一个比较好的选择。
Vaultwarden是用Rust语言编写的Bitwarden服务端,它比官方服务端更轻量,所需资源更少,可以在更小的机器上运行。同时,它可以很好地兼容Bitwarden的客户端。
Bitwarden 和 Vaultwarden 对比
自建 Bitwarden 服务端需要多达11个容器,而Vaultwarden仅需1个,且后者所需资源大大小于前者。
Bitwarden | Vaultwarden | |
---|---|---|
CPU核心数 | 1 | 0.2 |
内存 | 2GB | 128MB |
储存 | 12GB | 200MB |
Bitwarden 虽说是开源软件,但是用了微软 SQL 闭源数据库,这可能让人有点不爽。
写作本文时,Bitwarden 正在开发简单一点的版本,目前在测试中,可单容器部署以及可选使用哪种数据库。
准备工作
如果使用DigitalOcean,Linode等虚拟服务器,则需要做好安全工作。
安装Docker和Docker-compose
sudo apt install docker.io docker-compose -y
安装完成后,把操作系统用户添加到docker用户组,这样就能直接执行docker命令,而不用每次都要加sudo。如果你想用sudo也可以跳过这步。sudo usermod -aG docker username
把username改为实际操作系统用户名。
域名 / 子域名
可以直接用IP访问,最好还是用域名,并配置SSL证书。
HTTPS / SSL 证书
必须使用HTTPS才能访问 Vaultwarden,否则会出错。可以用反向代理为其配置HTTPS。
防火墙 (非必须,但推荐)
不要把 Vaultwarden 直接暴露在公网。使用防火墙仅开启必要端口。
安装 Vaultwarden
创建一个目录,来存放所有相关文件。mkdir -p ~/docker/vaultwarden/data
进入该目录。cd ~/docker/vaultwarden
创建 Docker-compose.yml
使用nano编辑器来编辑 docker-compose.yml 文件nano docker-compose.yml
编辑完成后按Ctrl + O 再按 Enter 保存
按Ctrl + X 退出
Docker-compose.yml 基本设置
version: '3'
services:
vaultwarden:
container_name: vaultwarden
image: vaultwarden/server:latest
restart: unless-stopped
volumes:
- ./data/:/data/
ports:
- XXXX:80
- container_name
在你机器上显示的容器名,建议设置为 vaultwarden 便于识别。 - image
镜像名,容器使用的镜像,设置为 vaultwarden/server ,后面的 latest 表示使用最新版本 - restart
告诉 Docker ,如果这个容器停止运行了,应该何时重启。建议设置为 unless-stopped ,表示除非你手动停止,否则 Docker 会一直尝试重启。 - volumes
设置容器内外文件夹对应关系。按上面设置就好。 - ports
设置容器内外的端口对应关系。xxxx是宿主机的端口,任意端口都可以。如果你在同一台机器设置反向代理,则不用管防火墙设置。否则需要在防火墙打开对应端口。
Docker-compose.yml 环境设置
下面来添加其他设置,所有可配置项请参考官方文档。
系统设置
- DOMAIN=https://subdomain.yourdomain.com
- LOGIN_RATELIMIT_MAX_BURST=10
- LOGIN_RATELIMIT_SECONDS=60
- ADMIN_RATELIMIT_MAX_BURST=10
- ADMIN_RATELIMIT_SECONDS=60
- ADMIN_TOKEN=YourReallyStrongAdminTokenHere
- SENDS_ALLOWED=true
- EMERGENCY_ACCESS_ALLOWED=true
- WEB_VAULT_ENABLED=true
- DOMAIN
域名,访问 Vaultwarden 的域名 - LOGIN_RATELIMIT_MAX_BURST
在下面选项规定的时间内,最多能尝试登陆次数。 - LOGIN_RATELIMIT_SECONDS
规定一个时间,单位是秒。 - ADMIN_RATELIMIT_MAX_BURST
在下面选项规定的时间内,最多能尝试登陆管理面板次数。 - ADMIN_RATELIMIT_SECONDS
规定一个时间,单位是秒。 - ADMIN_TOKEN
登陆管理面板的密码,请设置复杂一点。如果不设置,则禁用管理面板。 - SENDS_ALLOWED
Bitwarden有个功能,可以通过链接分享文字和文件。该选项控制是否开启这项功能。 - EMERGENCY_ACCESS_ALLOWED
是否开启紧急联系人功能。你可以添加一个邮箱地址作为紧急联系人,系统将发送邮件到该邮箱,点击邮箱链接确认,你再次确认后,该邮箱就成为你的紧急联系人。通过该邮箱登陆后,该用户请求访问你的密码库,你可以手动同意或者拒绝,如果你没有任何操作,那么在发送请求7天后,系统将自动同意。 - WEB_VAULT_ENABLED
是否开启网页登陆。当你设置好账号,可以关闭容器,把该选项设置为 false ,再打开容器。关闭网页登陆,但你可以通过客户端登陆,这样可以提高安全性。
Docker-compose.yml 注册设置
- SIGNUPS_ALLOWED=false
- SIGNUPS_VERIFY=true
- SIGNUPS_VERIFY_RESEND_TIME=3600
- SIGNUPS_VERIFY_RESEND_LIMIT=5
- SIGNUPS_DOMAINS_WHITELIST=yourdomainhere.com,anotherdomain.com
- SIGNUPS_ALLOWED
用户是否无需登陆即可注册。 - SIGNUPS_VERIFY
注册是否需要验证邮箱地址。 - SIGNUPS_VERIFY_RESEND_TIME
验证邮件发送间隔。 - SIGNUPS_VERIFY_RESEND_LIMIT
验证邮件最大发送次数。 - SIGNUPS_DOMAINS_WHITELIST
注册邮箱允许的域名。
Docker-compose.yml SMTP邮件设置
- SMTP_HOST=smtp.youremaildomain.com
- [email protected]
- SMTP_FROM_NAME=Vaultwarden
- SMTP_SECURITY=SECURITYMETHOD
- SMTP_PORT=XXXX
- [email protected]
- SMTP_PASSWORD=YourReallyStrongPasswordHere
- SMTP_AUTH_MECHANISM="Mechanism"
- SMTP_HOST,发件服务器地址
- SMTP_FROM,发件人邮箱
- SMTP_FROM_NAME,发件人名称
- SMTP_SECURITY,发件服务器安全设置,可选: starttls, force_tls, off
- SMTP_PORT,发件服务器端口
- SMTP_USERNAME,发件服务器登陆用户名
- SMTP_PASSWORD,发件服务器登陆密码
- SMTP_AUTH_MECHANISM,发件服务器验证机制,可选: Plain, Login, Xoath2
完整 Docker-compose.yml
将以上配置组合到一起。
version: '3'
services:
vaultwarden:
container_name: vaultwarden
image: vaultwarden/server:latest
restart: unless-stopped
volumes:
- ./data/:/data/
ports:
- XXXX:80
environment:
- DOMAIN=https://subdomain.yourdomain.com
- LOGIN_RATELIMIT_MAX_BURST=10
- LOGIN_RATELIMIT_SECONDS=60
- ADMIN_RATELIMIT_MAX_BURST=10
- ADMIN_RATELIMIT_SECONDS=60
- ADMIN_TOKEN=YourReallyStrongAdminTokenHere
- SENDS_ALLOWED=true
- EMERGENCY_ACCESS_ALLOWED=true
- WEB_VAULT_ENABLED=true
- SIGNUPS_ALLOWED=false
- SIGNUPS_VERIFY=true
- SIGNUPS_VERIFY_RESEND_TIME=3600
- SIGNUPS_VERIFY_RESEND_LIMIT=5
- SIGNUPS_DOMAINS_WHITELIST=yourdomainhere.com,anotherdomain.com
- SMTP_HOST=smtp.youremaildomain.com
- [email protected]
- SMTP_FROM_NAME=Vaultwarden
- SMTP_SECURITY=SECURITYMETHOD
- SMTP_PORT=XXXX
- [email protected]
- SMTP_PASSWORD=YourReallyStrongPasswordHere
- SMTP_AUTH_MECHANISM="Mechanism"
Vaultwarden 启动!
docker-compose up
检查一下有没有报错,没问题就按Ctrl + C 退出,用下面命令让容器在后台执行。docker-compose up -d
停止容器 docker-compose down
更新容器 docker-compose pull
配置Nginx反代
server
{
listen 80;
server_name example.com;
rewrite ^(.*) https://$host$1 permanent;
}
server
{
listen 443 ssl http2;
#listen [::]:443 ssl http2;
server_name example.com;
index index.html index.htm index.php default.html default.htm default.php;
root /home/wwwroot/blog;
ssl_certificate /etc/ssl/example.cer;
ssl_certificate_key /etc/ssl/example.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE";
# ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
ssl_session_cache builtin:1000 shared:SSL:10m;
# openssl dhparam -out /usr/local/nginx/conf/ssl/dhparam.pem 2048
ssl_dhparam /usr/local/nginx/conf/ssl/dhparam.pem;
#error_page 404 /404.html;
# Deny access to PHP files in specific directory
#location ~ /(wp-content|uploads|wp-includes|images)/.*\.php$ { deny all; }
location / {
proxy_pass http://127.0.0.1:xxxx;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
access_log /home/wwwlogs/bitwarden.log;
}
将上面配置文件中的127.0.0.1:xxxx
替换为实际端口。
常用操作
进入/home/bitwarden
目录后运行以下命令。
- 启动容器
docker-compose up -d
- 停止容器
docker-compose down
更新服务端
cd /home/bitwarden docker-compose pull docker-compose up -d
其他
- 关闭网站图标
默认开启了网站图标功能,服务端会去请求网站的图标,搭在国内服务器上面的话,可能会有一些问题。可以关闭此选项。
参考链接
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。