使用bitwarden_rs搭建自己的密码管理服务器
28 7 月, 2019 | 添加评论
写在前面
一直以来1password付费密码管理,从最早的时候一次性购买,到apple推出订阅制之后,它也搞订阅制了,每月好多个美元,吃不消
Lastpass使用免费的当然也可以使用,但是谁知道什么时候来给你掐了,那就尴尬了。
最近github上找到一个bitwarden_rs,可以自己搭建密码管理服务器,自己的密码自己管理,太方便了。
让我们来看看bitwarden_rs要如何搭建
我个人喜欢使用debian9系统,其他系统自行参考研究
搭建docker环境
官方Debian存储库中提供的Docker安装包可能不是最新版本。 为了确保我们获得最新版本,我们将从官方Docker存储库安装Docker。 为此,我们将添加一个新的包源,从Docker添加GPG密钥以确保下载有效,然后安装该包。
首先,更新现有的包列表:
apt update
接下来,安装一些必备软件包,这些软件包允许通过HTTPS使用软件包:
apt install apt-transport-https ca-certificates curl gnupg2 software-properties-common
然后将官方Docker存储库的GPG密钥添加到您的系统:
curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
将Docker存储库添加到APT源:
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
接下来,使用新添加的repo中的Docker包更新包数据库:
apt update
确保您要从Docker repo而不是默认的Debian repo安装:
apt-cache policy docker-ce
虽然Docker的版本号可能不同,但您会看到这样的输出:
docker-ce:
Installed: (none)
Candidate: 18.06.1~ce~3-0~debian
Version table:
18.06.1~ce~3-0~debian 500
500 https://download.docker.com/linux/debian stretch/stable amd64 Packages
请注意,未安装docker-ce ,但安装的候选者来自Debian 9的Docker存储库( stretch )。
最后,安装Docker:
apt install docker-ce
现在应该安装Docker,守护进程启动,并启用进程启动进程。 检查它是否正在运行:
systemctl status docker
输出应类似于以下内容,表明该服务处于活动状态并正在运行:
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2018-07-05 15:08:39 UTC; 2min 55s ago
Docs: https://docs.docker.com
Main PID: 21319 (dockerd)
CGroup: /system.slice/docker.service
├─21319 /usr/bin/dockerd -H fd://
└─21326 docker-containerd --config /var/run/docker/containerd/containerd.toml
安装bitwarden_rs
在 Linux 上可以一行命令安装:
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
如果要更新 docker-compose,也可以直接使用这条命令,只需要修改版本号为最新的 docker-compose 版本号。
配置文件
假设你准备在主目录中存放数据,新建一个目录:
cd ~ && mkdir bitwarden && cd bitwarden
pwd
# 应当输出 /root/bitwarden
准备一个配置文件:
cat >> config.env <<EOF
SIGNUPS_ALLOWED=true
DOMAIN=https://example.com
DATABASE_URL=/data/bitwarden.db
ROCKET_WORKERS=10
WEB_VAULT_ENABLED=true
EOF
# https://example.com这个改成你自己的域名即可
以上配置文件的说明:
SIGNUPS_ALLOWED 控制是否开放用户注册,因为你必须先注册才能存储数据,所以暂且先打开;
DOMAIN 填入你准备分配给 Bitwarden 服务使用的域名;
DATABASE_URL 设置数据库在容器内的路径,你可以不设置,默认位于 /data/db.sqlite3;
ROCKET_WORKERS 设置服务器使用几个线程。10 是默认值,你可以根据机器性能和个人需求适当调整;
WEB_VAULT_ENABLED 设置是否开启 Web 客户端。如果开启,可以通过访问你的域名来打开 Web 客户端,用户登录后即可通过网页管理密码。因为注册用户需要,所以也暂且先打开;
准备服务描述文件
cat >> docker-compose.yml <<EOF
version: '3'
services:
bitwarden:
image: bitwardenrs/server:latest
container_name: bitwarden
restart: always
volumes:
- ./data:/data
env_file:
- config.env
ports:
- "6666:80"
EOF
这个文件主要描述了这些内容:
bitwarden 现在是唯一一个服务;
image: mprasil/bitwarden:latest 指定使用 Docker Hub 的 mprasil/bitwarden 最新镜像;
volumes 中指定将容器内的 /data 目录挂载到宿主机的当前目录下的 data 目录,这样你可以在宿主机上执行数据库的备份操作;
ports 指定将容器内的 80 端口映射到了宿主机的 6666 端口;
以后对 bitwarden 服务做的所有操作,都需要预先进入这两个配置文件所在的目录内。
反向代理和 HTTPS、启动服务
因为服务描述文件中将 bitwarden 服务的 80 端口映射到了宿主机的 6666 端口,你可以在宿主机上使用 nginx 或其他反向代理,为你的域名配置对应的代理规则,使得访问域名时,流量可以经由 bitwarden 服务来处理。
如果你安装了lnmp后也可以用nginx的反代
server
{
listen 80;
#listen [::]:80;
server_name password.330621.xyz ;
rewrite ^(.*)$ https://$host$1 permanent;
index index.html index.htm index.php default.html default.htm default.php;
root /home/wwwroot/password.330621.xyz;
include rewrite/other.conf;
#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_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;
proxy_pass http://localhost:6666;
}
location ~ .*\.(php|jsp|cgi|asp|aspx|flv|swf|xml)?$
{
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://localhost:6666;
}
}
server
{
listen 443 ssl http2;
#listen [::]:443 ssl http2;
server_name password.330621.xyz ;
index index.html index.htm index.php default.html default.htm default.php;
root /home/wwwroot/password.330621.xyz;
ssl_certificate /usr/local/nginx/conf/ssl/password.330621.xyz/fullchain.cer;
ssl_certificate_key /usr/local/nginx/conf/ssl/password.330621.xyz/password.330621.xyz.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers "TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256: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;
include rewrite/other.conf;
#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_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;
proxy_pass http://localhost:6666;
}
location ~ .*\.(php|jsp|cgi|asp|aspx|flv|swf|xml)?$
{
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://localhost:6666;
}
}
喜欢使用宝塔面板管理vps,新建一个站点,配置一下免费的ssl,然后在反向代理中设置如下:
最后启动服务:
docker-compose up -d
关闭用户注册、关闭 web vault
现在你的 Bitwarden 服务器允许任何人注册帐号使用,你可能希望关闭这个功能。在前面生成的 config.env 中,调整以下两项值:
SIGNUPS_ALLOWED=false
WEB_VAULT_ENABLED=false
修改之后,需要重启 bitwarden 服务才生效。运行以下命令来删除并重新创建容器。不必担心,因为指定了 volume 映射,你的数据不会被删除。
docker-compose down && docker-compose up -d
这样就关闭了用户注册功能,并禁用了 web vault 的访问。密码数据之后还是可以在客户端中进行编辑的。
配置数据备份
安装7Z,为的是把数据加密打包然后再传到dropbox
wget https://astuteinternet.dl.sourceforge.net/project/p7zip/p7zip/16.02/p7zip_16.02_src_all.tar.bz2
tar -jxvf p7zip_16.02_src_all.tar.bz2
cd p7zip_16.02
make && make install
mkdir /root/backup
cd /root/backup
vi /root/backup/backup.sh
wget https://raw.githubusercontent.com/andreafabrizi/Dropbox-Uploader/master/dropbox_uploader.sh
chmod +x backup.sh dropbox_uploader.sh
/root/backup/dropbox_uploader.sh
/root/backup/backup.sh
crontab -e
backup.sh脚本
#!/bin/bash
#Funciont: Backup website and mysql database
#Author: licess
#Website: https://lnmp.org
Bit_name="bitwarden"
dropboxshell_dir="/root/backup/dropbox_uploader.sh"
drop_dir=/${Bit_name}/$(date +"%Y%m%d%H")
password="stone700127"
#IMPORTANT!!!Please Setting the following Values!
Zip_Dir="/usr/local/bin/7za"
Backup_Home="/root/backup/"
######~Set Directory you want to backup~######
Backup_Dir=("/root/bitwarden")
#Values Setting END!
OldBackup=${Bit_name}$(date -d -7day +"%Y%m%d%H").7z
Old_DROPBOX_DIR=/${Bit_name}/$(date -d -30day +"%Y%m%d%H")
Backup_Dir()
{
Backup_Path=$1
Dir_Name=`echo ${Backup_Path##*/}`
Pre_Dir=`echo ${Backup_Path}|sed 's/'${Dir_Name}'//g'`
tar zcf ${Backup_Home}bit-${Dir_Name}-$(date +"%Y%m%d%H").tar.gz -C ${Pre_Dir} ${Dir_Name}
}
if [ ! -f ${MySQL_Dump} ]; then
echo "mysqldump command not found.please check your setting."
exit 1
fi
if [ ! -d ${Backup_Home} ]; then
mkdir -p ${Backup_Home}
fi
echo "Backup bitwarden files..."
for dd in ${Backup_Dir[@]};do
Backup_Dir ${dd}
done
echo "compass with 7z..."
${Zip_Dir} a -mhe -p${password} ${Backup_Home}${Bit_name}$(date +"%Y%m%d%H").7z ${Backup_Home}bit-${Dir_Name}-$(date +"%Y%m%d%H").tar.gz
rm -rf ${Backup_Home}bit-${Dir_Name}-$(date +"%Y%m%d%H").tar.gz
echo "upload to dropbox..."
${dropboxshell_dir} upload $Backup_Home/${Bit_name}$(date +"%Y%m%d%H").7z $drop_dir/${Bit_name}$(date +"%Y%m%d%H").7z
${dropboxshell_dir} delete $Old_DROPBOX_DIR
echo "Delete old backup files..."
rm -f ${Backup_Home}${OldBackup}
注册dropbox验证邮箱后,进入https://www.dropbox.com/developers/apps建立一个app并生成密钥
运行/root/backup/dropbox_uploader.sh后将密钥填进去
运行一次/root/backup/backup.sh是为了测试备份是否有效
最后crontab添加定时任务
0 13 * * * /root/backup/backup.sh
0 22 * * * /root/backup/backup.sh
在每天13点和22点备份到dropbox