私有化部署Bitwarden密码管理服务
2021年09月20日 软件分享 docker, 服务本站文章除注明转载外,均为原创文章。如需转载请注明出处:
https://kwokronny.top/202109/bitwarden-private-deploy/

Bitwarden 是基佬又发现并推荐的另一个多平台密码管理工具,官方提供免费的存储服务,最赞的还是支持免费的私有化部署!
由于官方网站国内访问不畅😭,日常就不方便与家人共用,所以就只好将其私有化部署至自己的NAS上啦😉。

私有环境
- 家中自建NAS,申请公网IP
- CentOS 7
- Docker
- 自有域名
部署
由于密码库的相对私密性,所以端口自然不会使用常规端口,且暂时仅有些服务需要https的支持,需要nginx的反向代理完成,我这边就随机了个端口使用,常规端口就留给日后内网架设服务给家人使用吧。
部署 bitwarden
1
2
3
4
5
6
7docker volume create bitwarden_data // 创建 bitwarden_data 卷
docker run --name bitwarden \
-v bitwarden_data:/data \
-p 39434:80
--restart always
vaultwarden/server浏览器访问 宿主IP:39434 即可看到 Bitwarden 的服务
部署 nginx
1
2
3
4
5docker run --name Nginx \
-v /etc/nginx:/etc/nginx \
-v /usr/share/nginx:/usr/share/nginx \
-p 39435:39435 \
nginx生成证书
由于 Bitwarden 需要 HTTPS 的支持才可以在 chrome 等浏览器中应用,所以我为还需为 Bitwarden 服务反向代理开启 HTTPS。我们当然是使用免费的 Let’s Encrypt。
而证书生成需要验证域名是否为你持有,提供了以下认证方式:
- 在
example.com
下配置 DNS 记录 - 在
https://example.com/
的已知 URI 下放置一个 HTTP 资源
这个时候我们当然选择通过配置DNS记录完成认证获取证书啦,因为私有化的部署嘛,一般就不暴露常规接口啦。
通过 docker 运行 certbox 完成证书获取至 nginx 挂载配置文件夹下创建的cert内。
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
27mkdir -p /etc/nginx/cert
docker run -it --rm --name certbot -v /etc/nginx/cert:/etc/letsencrypt certbot/certbot --manual --preferred-challenges dns certonly
# 交互式提问:
# 请输入你想认证的域名(多个域名通过逗号或空格分隔)(取消输入 'c' )
Please enter the domain name(s) you would like on your certificate (comma and/or space separated) (Enter 'c' to cancel): vault.example.com
# 请求证书,为 域名 增加 一条 txt 记录,name 为 "_acme-challenge.vault.example.com" ,data 为 "qRbOGoLXA889-IplowmYFlT_dgHYTKya9RBW5l0B73Y"
# 完成后可通过下面提示的 google验证工具链接直接验证是否解析成功,验证成功按回车认证即可
Requesting a certificate for vault.example.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name:
_acme-challenge.vault.example.com.
with the following value:
qRbOGoLXA889-IplowmYFlT_dgHYTKya9RBW5l0B73Y
Before continuing, verify the TXT record has been deployed. Depending on the DNS
provider, this may take some time, from a few seconds to multiple minutes. You can
check if it has finished deploying with aid of online tools, such as the Google
Admin Toolbox: https://toolbox.googleapps.com/apps/dig/#TXT/_acme-challenge.vault.example.com.
Look for one or more bolded line(s) below the line \';ANSWER\'. It should show the
value(s) you\'ve just added.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue
# 还有些交互式回答就是些是否订阅及是否同意遵守协议的问答就个人自行选择了- 在
编写nginx配置
新增并编辑
vault.example.com.conf
配置文件1
vi /etc/nginx/conf.d/vault.example.com.conf
vault.example.com.conf 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
30server{
listen 443 ssl http2;
server_name vault.example.com;
index index.html index.htm default.htm default.html;
root /usr/share/nginx/www/vault.example.com;
add_header Permissions-Policy "geolocation=(),midi=(),sync-xhr=(),microphone=(),camera=(),magnetometer=(),gyroscope=(),fullscreen=(self),payment=()";
server_tokens off; # 不显示nginx版本信息
ssl_certificate cert/live/vault.example.com/fullchain.pem;
ssl_certificate_key cert/live/vault.example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5;
ssl_ecdh_curve secp384r1;
ssl_session_tickets off;
# OCSP stapling
ssl_stapling on;
ssl_stapling_verify on;
location ^~ /3KD63sjY2dd85 { # 指定到自己喜欢的随机数与字母的组合作为密码库服务的入口,增加其隐蔽性
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_hide_header X-Powered-By;
proxy_hide_header feature-policy;
proxy_pass http://宿主IP:39434/; # 指向bitwarden服务
}
}端口转发并应用
由于为内网的 NAS 服务,部署完成后当然还需要通过路由器端口转发将 nginx 为 bitwarden服务定的随机端口名转发至外网
至于域名如何与路由器绑定可搜索动态域名之类的,主要就是通过 NAS 定时请求域名更新IP的 URL 完成。浏览器输入 https://vault.example.com/3KD63sjY2dd85/ ,进入服务
到这一步基本就可以完成注册,导入密码库啦。
在 APP 及 各平台应用上,都可以找到在右上角点击设置图标的按钮,输入托管服务的网址
定时更新证书
Let’s Encrypt 证书的有效期是90天,需要定时为其更新证书,所以也就需要为写个脚本定时执行一下
1
2
3touch renew.sh
chmod -x renew.sh
vi renew.sh编辑更新脚本
renew.sh 1
2
3
4
5
6#!/bin/bash
docker run -it --rm --name certbot -v /etc/nginx/cert/:/etc/letsencrypt certbot/certbot renew --webroot -w /etc/letsencrypt
# 通过之前生成证书后生成的renew文件夹内的信息,自动更新证书
docker exec -it Nginx nginx -s reload
# 重启nginx1
2# 编辑定时任务
crontab -e1
0 0 1 * * ~/renew.sh > ~/letsencrypt.log #每月执行一次
关闭注册功能
为自己和家人都注册帐号后,保证安全性,就关闭密码库的注册功能啦。
1
2
3
4
5
6
7
8docker stop bitwarden
docker run --name bitwarden \
-v bitwarden_data:/data \
-p 39434:80
-e SIGNUP_ALLOWED=false
--restart always
vaultwarden/server
遇到的小坑
通过nginx简单的配置,HTTPS的标识依旧为红色锁,表示着不安全,虽说已不影响使用了;但强迫症的我还是找了下为什么。
继而发现了个检测 HTTPS 认证状态的网站:
SecurityHeaders
发现是少了一些Header属性以及部分属性已不安全等
根据 Missing Header 去谷歌必应搜索添加上即可
在搜索的过程中发现了下列文章,刚好教你 Apache 和 Nginx 如何配置安全头部信息的文章,对照上述网站可以快速将头部配置完成
Apache 和 Nginx 如何配置安全头部信息
由于我仅此服务需要 HTTPS 的支持,所以不可以使用 HSTS(强制HTTPS),所以也就不可添加以下头部:
1 |
|

