2
「玩转腾讯云」有奖征文活动正在如火如荼进行当中,不时有优秀的作品出现,本文是对其中一篇的摘录。你是否因为总记不住一大堆账号密码而烦恼?是否对第三方记录密码服务心存戒心?云+社区专栏热门作者,腾讯高级工程师张戈教大家基于腾讯云服务,低成本打造私有密码管理服务的方案!

引言

在我们的生活和工作当中,会用到非常多的网络应用,因为并不是每个应用都能用类似QQ/微信一键登录的方式来绑定账号,所以也就有了非常多的账号密码,记密码成为了让我们非常头疼的事情。太简单或者过于单一的密码容易被撞库或“脱裤”,而太复杂的密码又难以记忆。

因此,市面上就有了多款帮助我们记录密码的软件服务,比如1password、Lastpass等。这些软件能够自动抓取我们提交的账号密码保存到云端,实现多终端同步、自动填充密码等功能。虽说这类服务一般还是比较靠谱的,而且还有一些付费套餐。但是密码存在别人的服务器上你总是会有些不放心,谁知道哪天会不会出现数据泄露之类的问题?

鉴于此,本文分享一个基于腾讯云服务,低成本打造个人专属密码管理服务的方案,妈妈再也不用担心我记不住密码啦!

一、准备工作

本文完整的方案会用到DNSPod、腾讯云CDN、CVM以及COS 4个云服务,因此我们先登录腾讯云控制台购买或激活服务:

  • 个人域名一个,下文以 mm.zhangge.net 代替(必须,最好是备案过的域名,如果没有可以新注册一个)
  • SSL证书一个(必须,可以申请腾讯云免费证书)
  • 域名解析平台账号(必须,推荐使用 DNSPod)
  • 腾讯云 CVM一台(必须,安装Centos7.2以上版本系统,如果没有备案域名请购买香港或海外区域)
  • 腾讯云 CDN服务(可选/推荐 )
  • 腾讯云 COS服务(可选/推荐)

Ps:对于新人,推荐使用【新人免费产品专区】的免费体验产品来落地方案,等决定正式启用也可以付费转为正式服务;对于已经有服务器的老鸟,就可以直接复用已有服务器啦,当然也不仅限于腾讯云CVM;对于有自建NAS或树莓派的朋友,同样也可以参考部署,不过一定要注意数据备份哦!

这里简单说下腾讯云免费证书的申请步骤:

1、首先打开腾讯云的免费证书申请页面,如图填写信息:

腾讯云免费SSL证书申请

2、然后,在DNSPod管理的域名直接选自动验证即可,其他根据实际情况选择:

腾讯云免费SSL证书申请

3、最后,等待自动颁发即可:

腾讯云免费SSL证书申请

二、部署服务

以下步骤在全新的腾讯云CVM完成。

1. 环境初始化

这里采用Docker部署方案,因此需要先安装Dcoker,安装步骤如下(已经有Docker环境的请跳过):

# 1、登录root,获取在线安装脚本(这里直接使用root账号,简化流程)
curl -fsSL https://get.docker.com -o get-docker.sh

# 2、执行安装脚本
sh get-docker.sh --mirror AzureChinaCloud

# 3、修改Docker持久化目录(可选/推荐)
test -d /var/lib/docker && \
    mv /var/lib/docker /var/lib/docker_backup && \
    mkdir -p /data/docker && \
    ln -sf /data/docker /var/lib/docker

# 4、开启镜像加速(可选/推荐)
cat >/etc/docker/daemon.json<<EOF
{
  "registry-mirrors": [
    "https://dockerhub.azk8s.cn",
    "https://hub-mirror.c.163.com"
  ]
}
EOF

# 5、启动Docker并加入开机启动项
systemctl daemon-reload
systemctl enable docker
systemctl start docker

# 6、验证是否安装成功(有Docker信息输出即为成功):
docker info

2. 部署Bitwarden

没错!本次私有密码管理方案正是基于Bitwarden,张戈已经使用半年有余,非常满意!

这里使用Docker一键部署方式,命令如下:

docker run -d \
    --name bitwarden \
    -p 8080:80 \
    -p 3012:3012 \
    --restart=always \
    -e SIGNUPS_ALLOWED=true \
    -e WEB_VAULT_ENABLED=true \
    -e DOMAIN=https://mm.zhangge.net \
    -v /data/bitwarden/data:/data \
    bitwardenrs/server:latest

3. 部署反向代理

Bitwarden必须启用HTTPS访问管理界面才能正常注册,所以如果不打算套一层腾讯云CDN来做安全加固的话,还需要在本地部署一个Nginx来代理Bitwarden,以便开启HTTPS。

如果用腾讯云CDN的话,腾讯云CDN支持自定义源站端口,直接启用HTTPS,所以这步可以跳过。

Nginx代理配置步骤如下:

(1)上传证书文件

上文我们已经提交了腾讯云免费证书申请,等成功颁发后,可以下载到证书文件包:

腾讯云免费SSL证书

然后将解压后Nginx目录下的crt和key文件上传到服务器,放到 /data/bitwarden/cert 目录即可:

腾讯云免费SSL证书

(2)如下编写Nginx配置文件,保存为 /data/bitwarden/nginx/vhost.conf

server {
  listen 443 ssl http2;
  server_name mm.zhangge.net; # 根据实际情况修改!!!
  ssl_certificate /data/bitwarden/cert/1_mm.zhangge.net_bundle.crt; # 根据实际情况修改!!!
  ssl_certificate_key /data/bitwarden/cert/2_mm.zhangge.net.key>;# 根据实际情况修改!!!
  ssl_session_cache shared:le_nginx_SSL:1m;
  ssl_session_timeout 1440m;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_prefer_server_ciphers on;
  ssl_ciphers "ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS";
  
  # Allow large attachments
  client_max_body_size 128M;

  location / {
    proxy_pass http://127.0.0.1:8080;
    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_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
  }
  
  location /notifications/hub/negotiate {
    proxy_pass http://127.0.0.1:8080;
  }
}

(3)启动Nginx容器

docker run -d \
    --name nginx \
    --restart=always \
    --net=host \
    -v /data/bitwarden/cert:/data/bitwarden/cert \
    -v /data/bitwarden/nginx/vhost.conf:/etc/nginx/conf.d/default.conf \
    nginx:latest

若无意外,我们只需要在DNSPod将 mm.zhangge.net 这个域名解析到CVM服务器的公网IP就能正常打开Bitwarden的管理后台了:

Bitwarden后台登录界面

其他反向代理配置可以参考:https://github.com/dani-garci..._rs/wiki/Proxy-examples

4. 启用CDN

这里用到CDN主要起到3个作用:

  • 启用HTTPS:上文提到了Bitwarden必须要用HTTPS访问,这里借助腾讯云CDN可以快速开启HTTPS访问;
  • 安全加固:启用CDN可以有效的隐藏我们的服务器真实IP,而且CDN自带很多安全防护,比如WAF;
  • 访问加速:启用CDN之后,静态文件就能缓存到CDN节点实现访问加速。

因为腾讯云CDN支持自定义端口的源站,所以上一步反向代理在使用腾讯云CDN的方案下是可以忽略不做的。

CDN配置步骤如下:

(1)打开腾讯云CDN管理界面,确认已经激活服务

https://console.cloud.tencent...

(2)点击添加域名:mm.zhangge.net

  • 源站地址填写CVM公网IP+上文bitwarden容器的暴露端口8080(即可以跳过第5步,不需要本地再部署一份反向代理);
  • 回源协议选择 HTTP。

CDN基本配置

(3)缓存配置

  • 将全部类型-所有文件的刷新时间改为0天,即不缓存
  • 新增一个文件类型,内容为:.jpg;.png;.css;.woff;.woff2;.svg,刷新时间设置为30天或更长,即静态文件缓存到CDN(文件类型是从Bitwarden分析得出);
  • 然后如图调整下优先级,确保需要缓存的规则放到最前,全部-所有文件这个兜底类型放到最后。

CDN缓存过期配置

(4)域名解析

在基本配置界面CDN给分配的CNAME地址:

CDN分配的CNAME地址

复制这个地址,前往DNS解析面板,如图新增一个CNAME解析:

新增DNS解析记录

(5)开启HTTPS

在等DNS解析生效期间,我们回到腾讯云CDN配置面板,找到【高级配置】,启用HTTPS和HTTP2.0:

配置HTTPS和 HTTP2.0

在证书选择界面,选择腾讯云托管证书即可自动加载到我们在上文申请到的免费证书了:

选择腾讯云托管证书

提交后,我们回到域名配置,开启强制HTTPS和HTTP2.0:

开启HTTPS和HTTP2.0

5. 配置Bitwarden

做完以上配置,我们就可以正常访问Bitwarden的后台管理了:https://mm.zhangge.net/,刚部署的服务还没有账号,此时我们点击【Create Account】创建我们自己的账号:

登录界面

如图填写信息并提交:

创建账号

提交后返回了登录界面,此时我们就可以用刚刚创建的账号来登录后台了:

Bitwarden后台界面

如果还需要给家人或朋友提供这个服务,也可以邀请他们自己来注册账号,这样就能让我们部署的服务实现更大的价值了!说不定几十块的投入就能让你成功脱单哦!

另外,喜欢中文界面的朋友可以在设置里面改为中文简体:

设置为简体中文

保存后重新登录就变成中文界面了:

Bitwarden中文管理界面

最后,因为我们部署Bitwarden是私人使用场景,因此需要修改下Bitwarden的容器启动脚本,将前面的SIGNUPS_ALLOWED=true改为SIGNUPS_ALLOWED=false,也就是禁止用户注册。

具体步骤如下:

# 删除之前启动的bitwarden容器
docker rm -f  bitwarden
# 修改为禁止注册然后重新拉起容器
docker run -d \
    --name bitwarden \
    -p 8080:80 \
    -p 3012:3012 \
    --restart=always \
    -e SIGNUPS_ALLOWED=false \
    -e WEB_VAULT_ENABLED=true \
    -e DOMAIN=https://mm.zhangge.net \
    -v /data/bitwarden/data:/data \
    bitwardenrs/server:latest

这样一来,我们部署的Bitwarden就无法再新增注册用户了,当需要注册新用户时,只需要修改这个参数重建下容器即可 。

三、使用介绍

完成上述步骤后,我们已经部署了一套私有Bitwarden密码管理服务。下面简单介绍下常见使用场景。

1. 数据导入

很多朋友肯定用过一些市面上的密码管理,比如Lastpas、1Password等 ,如果在这些第三方密码管理平台上已经存在历史密码数据,我们可以通过导出导入的方式将密码数据迁移到我们自己部署的Bitwarden上来 。

2. 客户端使用

Bitwarden支持Web、Chrome,Firefox、Opera 以及 Edge 浏览器插件,拥有 iOS、Android 客户端,因此我们可以根据需要选择安装Bitwarden的客户端即可。下面我主要介绍下Bitwarden的谷歌浏览器插件的使用。

(1)安装插件

  • 在线安装:打开谷歌浏览器扩展商店,搜索Bitwarden就可以安装;
  • 离线安装:如果网络上不方便打开谷歌浏览器扩展商店的朋友,可以使用离线下载方式。

(2)插件配置

安装后点击浏览器上的Bitwarden小盾牌图标,弹出如图界面,然后点击弹出层左上角的选项按钮,进入插件设置:

插件设置

在设置界面,我们只需要填写【服务器URL】为上文自己部署的Bitwarden服务地址然后保存,这里也就是 https://mm.zhangge.net/:

填写Bitwarden服务器URL

保存后,我们就可以登录上文创建的账号了:

Bitwarden插件登录

登录后,我们切换到右下角设置-->选项:

Bitwarden设置

勾选自动填充选项,开启网页密码账号自动填充功能:

开启自动填充

(3)插件使用

现在我们随便找个需要登录的网页,填写账号密码点击登录后,Bitwarden插件就会弹出是否要保存的提示了:

Bitwarden密码保存提示

只要我们点击保存,下次再打开这个页面Bitwarden就能自动填充账号密码信息,如果是有多个账号,则需要点击小盾牌图标从列表里面选择一个账号来填充:

多个账号可以选择切换

(4)密码生成

Bitwarden插件同样还支持密码生成,我们在注册新的账号时,强烈推荐使用Bitwarden来生成随机密码,而不要使用我们经常好记的密码,这样安全性就能得到极大的提升。反正是这个随机密码由Bitwarden来记忆即可。

密码生成器

四、安全加固

自己的密码有多重要这事肯定不需要张戈来强调了,大家肯定都会谨慎对待。因此我们还需要对Bitwarden进行一些必要的安全加固。

1. 使用CDN加固

前文已经介绍,不再赘述。

2. 两步登录

Bitwarden支持开启两步登陆,也就是在我们设定的静态主密码的基础上进一步开启了动态验证码二次验证登录。支持如下渠道:

Bitwarden两步登录

这里推荐使用谷歌的Authenticator动态验证码APP,启动速度超快,IOS上直接搜索Authenticator就可以下载安装了。如图只需要3步就能完成动态验证器的关联:

开启两步登录验证

完成操作后,我们再登录Bitwarden就需要在手机上打开动态验证码来进行两步验证了:

两步登录,我们可以勾选“记住我”,来记住当前客户端。

谷歌验证码APP界面

如此一来,我们登录Bitwarden,就需要使用动态验证码了,麻是麻烦点,但是更安全了!

3. 数据备份

数据备份本身就是一个老生常谈、不能忽视的关键节点,更别提是我们的密码数据了!因此,对于Bitwarden我们还需要设置下定时的数据备份。这里依然使用张戈博客经常提到的7天循环数据备份方案,并保存一份副本到腾讯云的COS。

教程地址:https://zhang.ge/5117.html,先参考教程开通、设置下COS。

文章中的备份脚本在这里同样适用,这里再次贴一下脚本内容:

#!/bin/sh
###################################################################
#  Web Backup version 1.0.0 Author: Jager <im@zhang.ge>        #
# For more information please visit https://zhang.ge/5117.html #
#-----------------------------------------------------------------#
#  Copyright ©2016 zhang.ge. All rights reserved.              #
###################################################################
 
isDel=n
args=$#
isDel=${!args}
# 设置压缩包解压密码
mypassword=123456
 
test -f /etc/profile && . /etc/profile >/dev/null 2>&1
baseDir=$(cd $(dirname $0) && pwd)
zip --version >/dev/null || yum install -y zip
ZIP=$(which zip)
TODAY=`date +%u`
PYTHON=$(which python)
MYSQLDUMP=$(which mysqldump)
 
# coscmd工具上传函数
uploadToCOS()
 {
     file=$2
     domain=$1
     file_name=$(basename $2)
     coscmd upload $file $domain/$file_name
     if [[ $? -eq 0 ]] &&  [[ "$isDel" == "y" ]]
     then
         test -f $2 && rm -f $2
     fi
 }
 
printHelp()
{
clear
printf '
=====================================Help infomation=========================================
1. Use For Backup database:
The $1 must be [db]
    $2: [domain]
    $3: [dbname]
    $4: [mysqluser]
    $5: [mysqlpassword]
    $6: [back_path]
    $7: [isDel]
 
For example:./backup.sh db zhang.ge zhangge_db zhangge 123456 /home/wwwbackup/zhang.ge
 
2. Use For Backup webfile:
The $1 must be {file}:
    $2: [domain]
    $3: [site_path]
    $4: [back_path]
    $5: [isDel]
 
For example:./backup.sh file zhang.ge /home/wwwroot/zhang.ge /home/wwwbackup/zhang.ge
=====================================End of Hlep==============================================
 
'
exit 0
}
 
backupDB()
{
    domain=$1
    dbname=$2
    mysqluser=$3
    mysqlpd=$4
    back_path=$5
    test -d $back_path || (mkdir -p $back_path || echo "$back_path not found! Please CheckOut Or feedback to zhang.ge..." && exit 2)
    cd $back_path
    #如果是要备份远程MySQL,则修改如下语句中localhost为远程MySQL地址
    $MYSQLDUMP -hlocalhost -u$mysqluser -p$mysqlpd $dbname --skip-lock-tables --default-character-set=utf8 >$back_path/$domain\_db_$TODAY\.sql
    test -f $back_path/$domain\_db_$TODAY\.sql || (echo "MysqlDump failed! Please CheckOut Or feedback to zhang.ge..." && exit 2)
    $ZIP -P$mypassword -m $back_path/$domain\_db_$TODAY\.zip $domain\_db_$TODAY\.sql && \
    uploadToCOS $domain $back_path/$domain\_db_$TODAY\.zip
}
 
backupFile()
{
    domain=$1
    site_path=$2
    back_path=$3
    test -d $site_path || (echo "$site_path not found! Please CheckOut Or feedback to zhang.ge..." && exit 2)
    test -d $back_path || (mkdir -p $back_path || echo "$back_path not found! Please CheckOut Or feedback to zhang.ge..." && exit 2)
    test -f $back_path/$domain\_$TODAY\.zip && rm -f $back_path/$domain\_$TODAY\.zip
    $ZIP -P$mypassword -9r $back_path/$domain\_$TODAY\.zip $site_path && \
    uploadToCOS $domain $back_path/$domain\_$TODAY\.zip    
}
 
while [ $1 ]; do
    case $1 in
        '--db' | 'db' )
        backupDB $2 $3 $4 $5 $6
        exit
        ;;
        '--file' | 'file' )
        backupFile $2 $3 $4
        exit  
        ;;
        * )
        printHelp
        exit
        ;;
    esac
done
printHelp

将代码保存到 /data/bitwarden/opt/backup.sh,然后手工执行一次数据备份看看效果:

bash /data/bitwarden/opt/backup.sh file mm.zhangge.net /data/bitwarden/data /data/bitwarden/backup 

若备份成功,我们在crontab新增一个定时任务,实现定期备份数据:

# 编辑crontab
crontab -e
# 插入一条定时任务:
0 3 * * * bash /data/bitwarden/opt/backup.sh file mm.zhangge.net /data/bitwarden/data /data/bitwarden/backup >/dev/null 2>&1

五、总结

本文结合腾讯云CDN、CVM、COS、DNSPod及免费SSL证书等服务,基于Bitwarden开源密码管理软件打造了个人私有密码管理服务。并在常见使用场景及安全加固方面做了较为详细的介绍。想自己部署私有密码管理服务的朋友可以参考完成。

最后,附上本文部署的Bitwarden Demo(非长期提供,请勿正式使用),方便大家尝鲜、对比:

因属于公开、临时服务,请大家千万不要记录真实密码,避免带来不必要的损失!!


腾讯云开发者
21.9k 声望17.3k 粉丝