程序員是怎麼記住一堆密碼的?

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

引言

在咱們的生活和工做當中,會用到很是多的網絡應用,由於並非每一個應用都能用相似QQ/微信一鍵登陸的方式來綁定帳號,因此也就有了很是多的帳號密碼,記密碼成爲了讓咱們很是頭疼的事情。太簡單或者過於單一的密碼容易被撞庫或「脫褲」,而太複雜的密碼又難以記憶。css

所以,市面上就有了多款幫助咱們記錄密碼的軟件服務,好比1password、Lastpass等。這些軟件可以自動抓取咱們提交的帳號密碼保存到雲端,實現多終端同步、自動填充密碼等功能。雖然說這類服務通常仍是比較靠譜的,並且還有一些付費套餐。可是密碼存在別人的服務器上你老是會有些不放心,誰知道哪天會不會出現數據泄露之類的問題?html

鑑於此,本文分享一個基於騰訊雲服務,低成本打造我的專屬密碼管理服務的方案,媽媽不再用擔憂我記不住密碼啦!python

1、準備工做

本文完整的方案會用到DNSPod、騰訊雲CDN、CVM以及COS 4個雲服務,所以咱們先登陸騰訊雲控制檯購買或激活服務:mysql

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

Ps:對於新人,推薦使用【新人免費產品專區】的免費體驗產品來落地方案,等決定正式啓用也能夠付費轉爲正式服務;對於已經有服務器的老鳥,就能夠直接複用已有服務器啦,固然也不只限於騰訊雲CVM;對於有自建NAS或樹莓派的朋友,一樣也能夠參考部署,不過必定要注意數據備份哦!nginx

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

一、首先打開騰訊雲的免費證書申請頁面,如圖填寫信息:github

騰訊雲免費SSL證書申請web

二、而後,在DNSPod管理的域名直接選自動驗證便可,其餘根據實際狀況選擇:sql

騰訊雲免費SSL證書申請docker

三、最後,等待自動頒發便可:

騰訊雲免費SSL證書申請

2、部署服務

如下步驟在全新的騰訊雲CVM完成。

1. 環境初始化

這裏採用Docker部署方案,所以須要先安裝Dcoker,安裝步驟以下(已經有Docker環境的請跳過):

# 一、登陸root,獲取在線安裝腳本(這裏直接使用root帳號,簡化流程)
curl -fsSL https://get.docker.com -o get-docker.sh

# 二、執行安裝腳本
sh get-docker.sh --mirror AzureChinaCloud

# 三、修改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

# 四、開啓鏡像加速(可選/推薦)
cat >/etc/docker/daemon.json<<EOF
{
  "registry-mirrors": [
    "https://dockerhub.azk8s.cn",
    "https://hub-mirror.c.163.com"
  ]
}
EOF

# 五、啓動Docker並加入開機啓動項
systemctl daemon-reload
systemctl enable docker
systemctl start docker

# 六、驗證是否安裝成功(有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就沒法再新增註冊用戶了,當須要註冊新用戶時,只須要修改這個參數重建下容器便可 。

3、使用介紹

完成上述步驟後,咱們已經部署了一套私有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來記憶便可。

密碼生成器

4、安全加固

本身的密碼有多重要這事確定不須要張戈來強調了,你們確定都會謹慎對待。所以咱們還須要對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

5、總結

本文結合騰訊雲CDN、CVM、COS、DNSPod及免費SSL證書等服務,基於Bitwarden開源密碼管理軟件打造了我的私有密碼管理服務。並在常見使用場景及安全加固方面作了較爲詳細的介紹。想本身部署私有密碼管理服務的朋友能夠參考完成。

最後,附上本文部署的Bitwarden Demo(非長期提供,請勿正式使用),方便你們嚐鮮、對比:

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

相關文章
相關標籤/搜索