使用bitwaredn(vaultwarden)搭建自己的密码库

  本人一直在所有网站使用同一个密码,直到之前有很多网站的数据库泄露了,这些网站居然在明文储存密码,真是无语。我的密码就这样活生生在某些软件(telegram)上面被明文放了出来,这使我不得不考虑密码安全。之前考虑使用edge或者chrome直接储存密码,但这样也不是很安全(==Chrome浏览器保存的密码很不安全,第三方软件可以很轻松的获取==)。所以使用密码管理器来管理自己的密码。
  密码管理器有很多,比如1password和lastpass这类的,但我发现了bitwarden这个神器,它支持自主部署服务端,而且是开源的。下面就教大家如何搭建一个属于自己的bitwarden密码管理器。

这里使用非官方的bitwarden实现vaultwarden,使用rust编写,节省服务器资源。


  首先你需要一台服务器,或者自家的群晖和树莓派等等都可以。选择服务器并且使用vaultwarden实现的话1h1g的服务器足矣。首先连接到服务器:

  1. 安装docker和docker-compose,命令如下:

    #docker
    curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun  
    #docker-compose
    sudo curl -L "https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose  
    
    sudo chmod +x /usr/local/bin/docker-compose  # 设置权限,应用可执行权限
    sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose  # 添加软连接
    docker-compose --version  # 查看安装信息

    PS:也可以不使用docker,但很麻烦,感兴趣的可以去vaultwarden官方github查看他们的使用文档。

  2. 安装nginx

    也可以使用apache,caddy等反向代理软件。

      这里使用lnmp.org提供的一键lnmp安装包来安装nginx,这是他们官方网站的截图,具体使用方法可以去查看他们的官方文档。
    wp3.webp

    • 输入以下命令进行安装:

    如果你打算使用mysql作为数据库,那么这里可以一并安装。

    wget http://soft.vpser.net/lnmp/lnmp1.9.tar.gz -cO lnmp1.9.tar.gz && tar zxf lnmp1.9.tar.gz && cd lnmp1.9 && ./install.sh lnmp
    
    ./lnmp.org nginx #安装nginx
    ./lnmp.org mysql #如果要安装mysql
  3. 准备环境

    • 申请ssl证书

      如果你使用内网环境,此步可以使用自签证书,否则请使用真实的证书。如果没有https,vaultwarden将拒绝启动。

      具体申请过程可以去看我的另一篇文章:使用freessl.cn申请免费证书

    • 配置vaultwarden docker容器

      1. 创建vaultwarden配置文件
        先建一个vaultwarden的目录,创建docker-compose.yml和config.env。
      • docker-compose.yml的内容(按需更改文件内容):
      version: '3'
      services:
      bitwarden:
       image: vaultwarden/server:latest #使用最新镜像
       container_name: 'bitwarden'
       restart: always
       volumes:
         - /apps/bitwarden/data:/data  #容器内的 /data 目录挂载到宿主机的目录;
       env_file:
         - /apps/bitwarden/config.env
       ports:
         - "8880:80" 
         - "3012:3012"
      • config.env的内容(==一定要先开放注册==):
      SIGNUPS_ALLOWED=true #是否开放用户注册,先开启之后再关闭,不然你没法创建自己账户
      DOMAIN=https://bitwarden.xxxx.com/ #Bitwarden 服务使用的域名
      #DATABASE_URL='mysql://vaultwarden:g0SsWSEuF1lS5Rpf@172.17.0.1:3306/vaultwarden'  #数据库在容器内的路径,如果使用sqlite此行需要注释,使用mysql请将内容换成你的。
      ROCKET_WORKERS=10  #设置服务器线程
      WEB_VAULT_ENABLED=true #是否开启 Web 客户端
      LOG_FILE=/data/bitwarden.log
      WEBSOCKET_ENABLED=true
      ENABLE_DB_WAL='true'
      TZ="Asia/Shanghai"
      SERVER_ADMIN_EMAIL=你的邮箱
      ADMIN_TOKEN=你的后台管理密码

      bw0.webp

      • (可选)如果你的数据库为mysql,请先这样创建数据库

        1. 为 Vaultwarden 创建一个新的(空)数据库(确保字符集和排序规则正确!):
        CREATE DATABASE vaultwarden CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
        1. 创建数据库
        • 创建一个新的数据库用户并授予数据库权限(对于 MariaDB,版本低于 v8 的 MySQL):

          CREATE USER 'vaultwarden'@'localhost' IDENTIFIED BY 'yourpassword';
          GRANT ALL ON vaultwarden.* TO 'vaultwarden'@'localhost';
          FLUSH PRIVILEGES;
        • 如果使用 MySQL v8.x,则需要这样创建用户:

          -- 在 MySQLv8 安装上这样使用
          CREATE USER 'vaultwarden'@'localhost' IDENTIFIED WITH mysql_native_password BY 'yourpassword';
          GRANT ALL ON vaultwarden.* TO 'vaultwarden'@'localhost';
          FLUSH PRIVILEGES;
        1. 赋予权限:
        GRANT ALTER, CREATE, DELETE, DROP, INDEX, INSERT, SELECT, UPDATE ON vaultwarden.* TO 'vaultwarden'@'localhost';
        FLUSH PRIVILEGES;
    1. 启动容器

      systemctl start docker
      docker-compose up -d
    2. 配置nginx反向代理

      这里仅展示server块内容,将下面内容放如http块即可。

      server {
        listen 443 ssl http2;
        #listen [::]:443 ssl http2;  #有ipv6可以取消注释
        server_name  你的域名;
      
        ssl_certificate 你证书路径;
        ssl_certificate_key 你的私钥路径;
      
        ssl_protocols          TLSv1.2 TLSv1.3;
        ssl_ciphers            ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
        #ssl_early_data         on;
        ssl_prefer_server_ciphers    off;
        ssl_session_tickets    off;
        ssl_session_cache shared:SSL:10m;
        ssl_session_timeout    1d;
      
        ssl_stapling           on;
        ssl_stapling_verify    on;
        resolver               1.1.1.1 1.0.0.1 8.8.8.8 8.8.4.4 208.67.222.222 208.67.220.220 valid=60s;
        resolver_timeout       2s;
      
        access_log  /apps/nginx/logs/bitwarden/access.log  main;  #日志路径
        error_log   /apps/nginx/logs/bitwarden/error.log  warn;
      
        #include /apps/nginx/conf/cloudflare.conf;
      
        #keepalive_timeout  0;
        proxy_connect_timeout       15m;
        proxy_send_timeout          15m;
        proxy_read_timeout          15m;
        send_timeout                15m;
        client_max_body_size       128M;
      
        location / {
            #include /apps/nginx/conf/cloudflare.conf;
      
            proxy_pass http://127.0.0.1:8880;
      
            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;
        }
      
        location /notifications/hub {
            proxy_pass http://127.0.0.1:3012;
      
            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;
        }
      
        location /notifications/hub/negotiate {
            proxy_pass http://127.0.0.1:8880;
      
            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;
        }
      
        location /admin {
            proxy_pass http://127.0.0.1:8880;
            #    auth_basic "Administrator’s Area";
            #    auth_basic_user_file /etc/apache2/.htpasswd;
            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;
        }
      
        add_header Referrer-Policy                      "no-referrer"   always;
        add_header X-Content-Type-Options               "nosniff"       always;
        add_header X-Download-Options                   "noopen"        always;
        add_header X-Frame-Options                      "SAMEORIGIN"    always;
        add_header X-Permitted-Cross-Domain-Policies    "none"          always;
        add_header X-Robots-Tag                         "none"          always;
        add_header X-XSS-Protection                     "1; mode=block" always;
        add_header Strict-Transport-Security "max-age=63072000;includeSubdomains; preload" always;
      }

      配置完毕后重启重启nginx:

      systemctl restart nginx

      如果一切配置正确,打开你的域名现实如下内容,那么恭喜,运行是正常的:

      bw1.webp

  4. 配置vaultwarden

    1. 首先进行注册,点击创建账户
      bw2.webp
      按照提示完成账户即可

      如果无法注册,请将之前的config.env中的SIGNUPS_ALLOWED=false 改为true,然后重建容器即可。

      命令为docker-compose down && docker-compose up -d。

    2. 登录账户
      bw3.webp
      加入如图界面说明你的bitwarden已经可以使用了。然后如果你一个人使用,请将允许注册关闭:

      # config.env
      SIGNUPS_ALLOWED=false
      
      # shell
      docker-compose down && docker-compose up -d

      登录后台管理界面:
      https://你的域名/admin 输入你设置的管理员密码:
      bw4.webp
      bw5.webp
      在这里你可以更改各种设置,以及备份数据库。


到此,你的bitwarden已经可以使用了,enjoy:satisfied:!

文末附上官方文档的翻译:关于 - Vaultwarden Wiki 中文版 (ppgg.in)

版权声明:
作者:anoixa
链接:https://blog.imtop1.moe/archives/249/
来源:anoixa的博客
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>
文章目录
关闭
目 录