­

【玩轉騰訊雲】打造個人專屬密碼管理服務

  • 2020 年 3 月 29 日
  • 筆記

概述

在我們的生活和工作當中,會接觸到N多的APP或網頁,因為並不是每個服務都能用類似QQ一鍵登錄的方式來綁定賬號,所以也就有了N多的賬號密碼,記密碼成為了讓我們非常頭疼的事情。太簡單或者過於單一的密碼容易被撞庫或「脫褲」,而太複雜的密碼又難以記憶。因此,市面上就有了多款幫助我們記錄密碼的軟件服務,比如1password、Lastpass等。這些軟件能夠自動抓取我們提交的賬號密碼保存到雲端,實現多終端同步、自動填充密碼等功能。

雖說這類服務一般還是比較靠譜的,而且還有一些付費套餐。但是密碼存在別人的服務器上你總是會有些不放心,誰知道哪天會不會出現數據泄露之類的問題?

鑒於此,本文分享一個基於騰訊雲服務,低成本打造個人專屬密碼管理服務的方案。

一、準備工作

本文完整的方案會用到DNSPod、騰訊雲CDN、CVM以及COS 4個雲服務,因此我們先登錄騰訊雲控制台購買或激活服務:

  • 個人域名一個,下文以 mm.zhangge.net 代替(必須,最好是備案過的域名,如果沒有可以新註冊一個)
  • SSL證書一個(必須,可以申請騰訊雲免費證書
  • 域名解析平台賬號(必須,推薦使用 DNSPod)
  • 騰訊雲 CVM一台(必須,推薦安裝Centos7.2以上版本系統,如果沒有備案域名請購買香港或海外區域
  • 騰訊雲 CDN服務(可選/推薦 )
  • 騰訊雲 COS服務(可選/推薦)

Ps:對於新人,推薦使用【新人免費產品專區】的免費體驗產品來落地方案,等決定正式啟用也可以付費轉為正式服務。

這裡簡單說下騰訊雲免費證書的申請步驟:

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、部署反向代理(若使用騰訊雲CDN則可以跳過此步驟)

Bitwarden必須啟用HTTPS訪問管理界面才能正常註冊,所以如果不打算套一層騰訊雲CDN來做安全加固的話,還需要在本地部署一個Nginx來代理Bitwarden,以便開啟HTTPS,如果用騰訊雲CDN的話,這步可以跳過:

Nginx代理配置步驟如下:

①、上傳證書文件

上文我們已經提交了騰訊雲免費證書申請,等成功頒發後,可以下載到證書文件包:

騰訊雲免費SSL證書

然後將解壓後Nginx目錄下的crt和key文件上傳到服務器,放到/data/bitwarden/cert目錄即可:

騰訊雲免費SSL證書

②、如下編寫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;    }  }

③、啟動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.foobar.com 這個域名解析到這個CVM服務器的公網IP就能正常打開Bitwarden的管理後台了 :

Bitwarden後台登錄界面

Ps:其他反向代理配置可以參考:https://github.com/dani-garcia/bitwarden_rs/wiki/Proxy-examples

4、利用騰訊雲CDN開啟HTTPS

這裡我們可以使用騰訊雲CDN來實現HTTPS,同時對密碼管理後台進行安全加固,可以有效防止網絡上一些有心之人對這個敏感服務進行爆破等攻擊。因為騰訊雲CDN支持帶端口的後端,所以上一步反向代理在使用騰訊雲CDN的方案下是可以忽略不做的。

步驟如下:

①、打開騰訊雲CDN管理界面,確認已經激活服務:https://console.cloud.tencent.com/cdn/access

②、點擊添加域名:mm.zhangge.net,如圖:

  • 源站地址填寫CVM公網IP+上文bitwarden容器的暴露端口8080(即可以跳過第5步,不需要本地再部署一份反向代理);
  • 回源協議選擇 HTTP;
  • 緩存配置務必改為0,即禁止緩存。
CDN配置:注意紅框配置

③、提交後找到CDN給分配的CNAME地址:

CDN分配的CNAME地址

複製這個地址,前往DNS解析面板,如圖新增一個CNAME解析:

新增DNS解析記錄

④、啟用HTTPS

在等DNS解析生效期間,我們回到騰訊雲CDN配置面板,找到【高級配置】,啟用HTTPS和HTTP2.0:

配置HTTPS和 HTTP2.0

在證書選擇界面,選擇騰訊雲託管證書即可自動加載到我們在上文申請到的免費證書了:

選擇騰訊雲託管證書

提交後,我們回到域名配置,開啟強制HTTPS和HTTP2.0:

開啟HTTPS和HTTP2.0

做完以上配置,我們就可以正常訪問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上來 。里由於文章篇幅有限就不贅述了,網上已經有很多前人分享的文章,比如:https://www.cnblogs.com/woniu666/p/11922580.html

2、客戶端使用

Bitwarden支持Web、Chrome,Firefox、Opera 以及 Edge 瀏覽器插件,擁有 iOS、Android 客戶端,因此我們可以根據需要選擇安裝Bitwarden的客戶端即可。下面我主要介紹下Bitwarden的谷歌瀏覽器插件的使用。

①、安裝插件

  • 在線安裝:打開谷歌瀏覽器擴展商店,搜索Bitwarden就可以安裝;
  • 離線安裝:如果網絡上不方便打開谷歌瀏覽器擴展商店的朋友,可以使用離線下載方式

②、插件配置

安裝後點擊瀏覽器上的Bitwarden小盾牌圖標,彈出如圖界面,然後點擊彈出層左上角的選項按鈕,進入插件設置:

插件設置

在設置界面,我們只需要填寫【服務器URL】為上文自己部署的Bitwarden服務地址然後保存,這裡也就是 https://mm.zhangge.net/:

填寫Bitwarden服務器URL

保存後,我們就可以登錄上文創建的賬號了:

Bitwarden插件登錄

登錄後,我們切換到右下角設置–>選項:

Bitwarden設置

勾選自動填充選項,開啟網頁密碼賬號自動填充功能:

開啟自動填充

③、插件使用

現在我們隨便找個需要登錄的網頁,填寫賬號密碼點擊登錄後,Bitwarden插件就會彈出是否要保存的提示了,只要我們點擊保存,下次再打開這個頁面Bitwarden就能自動填充賬號密碼信息,如果是有多個賬號,則需要點擊小盾牌圖標從列表裏面選擇一個賬號來填充。

④、密碼生成

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(非長期提供,請勿正式使用),方便大家嘗鮮、對比:

因屬於公開服務,請大家千萬不要記錄真實密碼,避免帶來不必要的損失!!