3D Model Loading

私有化部署Bitwarden密码管理服务

2021年09月20日 软件分享 ,
本站文章除注明转载外,均为原创文章。如需转载请注明出处:
https://www.kwokronny.com/bitwarden-private-deploy/

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

私有环境

  • 申请公网 IP,端口转发
  • CentOS 7
  • Docker
  • 自有域名

部署

由于密码库的相对私密性,所以端口选择非常规的端口,APP 连接私有服务需要 https 的支持,可以通过 nginx 的反向代理。

  1. 部署 bitwarden

    1
    2
    3
    4
    5
    6
    7
    docker volume create bitwarden_data // 创建 bitwarden_data 卷

    docker run --name bitwarden \
    -v bitwarden_data:/data \
    -p 39434:80
    --restart always
    vaultwarden/server

    浏览器访问 宿主 IP:39434 即可看到 Bitwarden 的服务

  2. 部署 nginx

    1
    2
    yum -y install nginx
    service nginx start
  3. 生成证书

    由于 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
    27
    mkdir -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
    # 还有些交互式回答就是些是否订阅及是否同意遵守协议的问答就个人自行选择了
  4. 编写 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
    30
    server{
    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服务
    }
    }
  5. 端口转发并应用

    由于为内网的 NAS 服务,部署完成后当然还需要通过路由器端口转发将 nginx 为 bitwarden 服务定的随机端口名转发至外网
    至于域名如何与路由器绑定可搜索动态域名之类的,主要就是通过 NAS 定时请求域名更新 IP 的 URL 完成。

    浏览器输入 https://vault.example.com/3KD63sjY2dd85/ ,进入服务

    到这一步基本就可以完成注册,导入密码库啦。

    在 APP 及 各平台应用上,都可以找到在右上角点击设置图标的按钮,输入托管服务的网址

  6. 定时更新证书

    Let’s Encrypt 证书的有效期是 90 天,需要定时为其更新证书,所以也就需要为写个脚本定时执行一下

    1
    2
    3
    touch 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文件夹内的信息,自动更新证书
    nginx -s reload
    # 重启nginx
    1
    2
    # 编辑定时任务
    crontab -e
    1
    0 0 1 */2 * sh ~/shell/renew.sh > ~/shell/letsencrypt.log #每2个月执行一次
  7. 关闭注册功能

    为自己和家人都注册帐号后,保证安全性,就关闭密码库的注册功能啦。

    1
    2
    3
    4
    5
    6
    7
    8
    docker 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
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;