程式設計師是怎麼記住一堆密碼的?

  • 2020 年 5 月 13 日
  • 筆記

「玩轉騰訊雲」有獎徵文活動正在如火如荼進行當中,不時有優秀的作品出現,本文是對其中一篇的摘錄。你是否因為總記不住一大堆帳號密碼而煩惱?是否對第三方記錄密碼服務心存戒心?雲+社區專欄熱門作者,騰訊高級工程師張戈教大家基於騰訊雲服務,低成本打造私有密碼管理服務的方案!

引言

 

在我們的生活和工作當中,會用到非常多的網路應用,因為並不是每個應用都能用類似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 //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": [
    "//dockerhub.azk8s.cn",
    "//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=//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 //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 //127.0.0.1:3012;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
  }
  
  location /notifications/hub/negotiate {
    proxy_pass //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後台登錄介面

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

4. 啟用CDN

這裡用到CDN主要起到3個作用:

  • 啟用HTTPS:上文提到了Bitwarden必須要用HTTPS訪問,這裡藉助騰訊雲CDN可以快速開啟HTTPS訪問;

  • 安全加固:啟用CDN可以有效的隱藏我們的伺服器真實IP,而且CDN自帶很多安全防護,比如WAF;

  • 訪問加速:啟用CDN之後,靜態文件就能快取到CDN節點實現訪問加速。

因為騰訊雲CDN支援自定義埠的源站,所以上一步反向代理在使用騰訊雲CDN的方案下是可以忽略不做的。

CDN配置步驟如下:

(1)打開騰訊雲CDN管理介面,確認已經激活服務

//console.cloud.tencent.com/cdn/access

(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的後台管理了://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=//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的Google瀏覽器插件的使用。

(1)安裝插件

  • 在線安裝:打開Google瀏覽器擴展商店,搜索Bitwarden就可以安裝;

  • 離線安裝:如果網路上不方便打開Google瀏覽器擴展商店的朋友,可以使用離線下載方式。

(2)插件配置

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

插件設置

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

填寫Bitwarden伺服器URL

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

Bitwarden插件登錄

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

Bitwarden設置

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

開啟自動填充

(3)插件使用

現在我們隨便找個需要登錄的網頁,填寫帳號密碼點擊登錄後,Bitwarden插件就會彈出是否要保存的提示了:

Bitwarden密碼保存提示

只要我們點擊保存,下次再打開這個頁面Bitwarden就能自動填充帳號密碼資訊,如果是有多個帳號,則需要點擊小盾牌圖標從列表裡面選擇一個帳號來填充:

多個帳號可以選擇切換

(4)密碼生成

Bitwarden插件同樣還支援密碼生成,我們在註冊新的帳號時,強烈推薦使用Bitwarden來生成隨機密碼,而不要使用我們經常好記的密碼,這樣安全性就能得到極大的提升。反正是這個隨機密碼由Bitwarden來記憶即可。

密碼生成器

四、安全加固

 

自己的密碼有多重要這事肯定不需要張戈來強調了,大家肯定都會謹慎對待。因此我們還需要對Bitwarden進行一些必要的安全加固。

1. 使用CDN加固

前文已經介紹,不再贅述。

2. 兩步登錄

Bitwarden支援開啟兩步登陸,也就是在我們設定的靜態主密碼的基礎上進一步開啟了動態驗證碼二次驗證登錄。支援如下渠道:

Bitwarden兩步登錄

這裡推薦使用Google的Authenticator動態驗證碼APP,啟動速度超快,IOS上直接搜索Authenticator就可以下載安裝了。如圖只需要3步就能完成動態驗證器的關聯:

開啟兩步登錄驗證

完成操作後,我們再登錄Bitwarden就需要在手機上打開動態驗證碼來進行兩步驗證了:

兩步登錄,我們可以勾選「記住我」,來記住當前客戶端。

Google驗證碼APP介面

如此一來,我們登錄Bitwarden,就需要使用動態驗證碼了,麻是麻煩點,但是更安全了!

3. 數據備份

數據備份本身就是一個老生常談、不能忽視的關鍵節點,更別提是我們的密碼數據了!因此,對於Bitwarden我們還需要設置下定時的數據備份。這裡依然使用張戈部落格經常提到的7天循環數據備份方案,並保存一份副本到騰訊雲的COS。

教程地址://zhang.ge/5117.html,先參考教程開通、設置下COS。

文章中的備份腳本在這裡同樣適用,這裡再次貼一下腳本內容:

#!/bin/sh
###################################################################
#  Web Backup version 1.0.0 Author: Jager <[email protected]>        #
# For more information please visit //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(非長期提供,請勿正式使用),方便大家嘗鮮、對比:

  • Demo地址://mm.zhangge.net/

  • Demo帳號:[email protected]

  • Demo密碼:vFnP9QJFoTB5N6

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