bitwarden_rs+nginx反向代理配置记录

bitwarden是一个开源的密码管理器,可以部署在私有服务器上。官方的bitwarden对服务器配置要求较高,网友开发了bitwardenrs适用于小用户,对配置要求低不怎么占内存。本次采用安装docker后在docker上安装bitwardenrs和nginx,通过nginx反向代理实现HTTPS加密访问bitwarden的方法。

服务器配置:Tencent Hong Kong centOS 7.6 1C1G 25GSSD 30M峰值带宽

服务器上已经运行bitnami wordpress堆栈,因此80和443端口都被apache占用,挂了个人博客。网络上大部分blog都采用nginx做反向代理,由于不懂技术因此也用nginx照做。

安装Docker

docker是一个虚拟机,他打包了多个不同主流应用,可以很方便的安装这些应用,并且每个应用都是以容器的形式存在,与宿主机的环境是隔离的,这些应用的配置与运行可以干净的删除不会对宿主机造成影响。

docker中有images 镜像和container 容器,比如我可以在宿主机下载一个nginx镜像,然后我制作两个容器:nginx_1 和 nginx_2,两个容器中都可以通过镜像安装nginx应用,两个nginx是分开的,可以各自用于不同用途,方便管理。

yum install -y docker #安装docker
systemctl docker #启动docker

安装bitwarden_rs

docker有几个需要事先理解的概念,比如目录映射。我们可以让容器的目录去映射一个宿主机的目录,简单来讲就是用一个宿主机的目录当做容器应用的目录,这样要修改应用配置或者上传文件只要动宿主机的目录就可以。

我们在run 应用的时候添加以下形式的配置:

-v /library:/library #':'前是要映射的宿主机目录,后面是容器应用的实际目录

端口映射:容器是一个虚拟环境,比如nginx监听的80和443端口,在我的宿主机中这两个端口被Apache占用了,因此我可以分配另外两个端口与容器的80端口和443端口进行映射。

这样一来避免了端口冲突,比如访问https://domain:4444实际上就会通过容器的443端口被nginx监听到。需要注意的是通过这种方式要在防火墙打开4444端口,否则浏览器还是无法访问的。

-p 8088:80/tcp 4444:443/tcp #8088映射到80 4444映射到443 映射端口根据需要选择空闲端口即可
mkdir /data/bitwarden #建立宿主机映射目录
docker run  -d \
            --rm \
            --name bitwarden \
            -p 8085:80 \
            -p 3012:3012 \
            -e SIGNUPS_ALLOWED=true \
            -e WEB_VAULT_ENABLED=true \
            -e DOMAIN=https://mydomain.cn \
            -v /data/bitwarden:/data \
            bitwardenrs/server:latest

上面命令的各个参数含义如下:
-d 在后台运行
--rm 容器停止运行后,自动删除容器文件
--name bitwarden容器的名字为bitwarden
-p 8085:80 容器的端口80映射到8085,在Nginx配置
-p 3012:3012 容器的端口3012映射到3012
-e SIGNUPS_ALLOWED=true 设置环境变量SIGNUPS_ALLOWED=true允许用户注册
-e WBE_VAULT_ENABLE=true 设置环境变量WBE_VAULT_ENABLE=true
-e DOMAIN=https://mydomain.cn设置域名,需要替换成自己申请的域名
-v /data/bitwarden:/data 容器的/data/目录映射到宿主机的/data/bitwarden目录

安装nginx

mkdir /data/nginx #建立宿主机映射目录

# 安装nginx
docker run \
           --rm \
           --name nginx \
           -d \
           -p 8088:80/tcp \
           -p 2443:443/tcp \
           nginx

# 由于不知道nginx目录下的内容,我们将容器的目录复制到宿主机目录/data下
docker cp nginx:/etc/nginx /data
# 创建用于存放ssl证书的文件夹,将申请到的.cert和.key证书文件上传到这个文件夹
mkdir /data/nginx/certs

修改/data/nginx/conf.d/default.conf文件添加以下内容,启用https访问并对bitwarden进行反向代理

server {
    listen 80;
    server_name domain; #替换ssl认证的域名
    ……此处省略无修改的内容
    return 301 https://$host$request_uri; #将http的域名请求转成https
}

server {
  listen 443 ssl http2;
  server_name domain; #替换ssl认证的域名
  ssl on;
  ssl_certificate /etc/nginx/certs/1_domain_bundle.crt; #配置证书文件 这个目录不用改,在接下来映射到宿主机的/data目录即可
  ssl_certificate_key /etc/nginx/certs/2_domain.key; #配置证书私钥文件
  ssl_session_timeout 5m;
  ssl_ciphers HIGH:!aNULL:!MD5;
  ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
  ssl_prefer_server_ciphers on;

  # 加大缓存机制容量,提高访问速度,不加的话bitwarden要加载很慢,且nginx会生成warn警告
  fastcgi_buffers      8 4K;
  client_max_body_size 2050m;
 
   #配置反向代理,请求代理发送到8085端口
  location / { 
    proxy_pass http://192.168.0.1:8085; #不用127.0.0.1,理由见下文。192.168.0.1是docker建立的bridge子网地址
    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; 
    root /usr/share/nginx/html;
   index index.html index.htm;
 }
  
 location /notifications/hub { 
    proxy_pass http://192.168.0.1:3012; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection "upgrade"; 
 }
  
 location /notifications/hub/negotiate { 
   proxy_pass http://192.168.0.1:8085; 
 }

}

docker新建bridge子网

反向代理后的效果是这样的:浏览器输入https://domain:2443被nginx443端口监听到,然后转去访问http://192.168.0.1:8085也就是bitwarden的实际url,从而起到https加密的效果。实验一下防火墙开放8085端口,直接访问http://宿主机IP:8085一样可以进入bitwarden,只是这个方式不安全。

由于nginx在虚拟机环境中,因此如果在代理中用127.0.0.1,访问的是虚拟机而不是宿主机,因此会报502拒绝访问错误。我们在虚拟机的nginx中访问到宿主机可以采用建立桥接子网的方式。

我们在Docker中新建一个名叫localNet的bridge子网,并设定其gateway范围,这样我们通过子网网关地址去访问宿主机127.0.0.1:

docker network create -d bridge --subnet 192.168.0.0/24 --gateway 192.168.0.1 localNet # 与default.conf中的地址对应
docker network --help #可以查看相关命令用法

最后一步

接下来我们让两个容器与这个子网建立连接并重新运行nginx容器建立宿主机目录映射:

# 运行中的容器bitwarden与子网建立连接
docker network connect localNet bitwarden

# 重新运行nginx,建立目录映射并加入子网

#先停止掉名叫nginx的容器,或者直接新建一个不同名的nginx容器
docker stop nginx
#重新运行nginx,-- network localNet加入网络,-v /data/nginx:/etc/nginx映射目录否则上传的ssl证书不生效
docker run \
           --rm \
           --name nginx \
           -- network localNet \
           -d \
           -p 8088:80/tcp \
           -p 2443:443/tcp \
           -v /data/nginx:/etc/nginx \
           nginx

接下来通过https://domain:2443应该就可以访问到bitwarden的登录界面了。

点击创建账号,创建账号成功以后修改一下bitwarden的配置关掉注册功能:

# 先停止bitwarden容器
docker stop bitwarden
# 设置环境变量不允许注册用户-e SIGNUPS_ALLOWED=false,再启动bitwarden容器
docker run -d \
 --rm \
 --name bitwarden \
 -p 8085:80 \
 -p 3012:3012 \
 -e SIGNUPS_ALLOWED=false \
 -e WEB_VAULT_ENABLED=true \
 -e DOMAIN=https://mydomain \
 -v /data/bitwarden:/data \
  bitwardenrs/server:latest

# 记得mydomain要改成自己的

大功告成!!!接下来下载bitwarden的浏览器插件和app,填上自己配置的domain就可以用了!!!

常用docker指令

docker ps #列出在运行的容器
docker rm container_id #删除容器
docker stop container_id #停止容器,对于在运行时添加了--rm参数的容器,停止即会自动删除
docker images #列出下载的镜像
docker rmi image_id #删除镜像

#要重新安装一个镜像需要完成以上步骤

docker logs -f container_id #查看指定容器运行日志

参考

https://www.zhihu.com/search?type=content&q=bitwarden

https://blog.csdn.net/weixin_39716800/article/details/111215226

https://blog.csdn.net/dhaiuda/article/details/82820318

https://www.cnblogs.com/littlewrong/p/7076459.html

https://www.bilibili.com/video/av543535091/

留下评论