google 實現TOTP(基於時間認證)原理
1.用戶需要開啓Google Authenticator服務時,服務器隨機生成一個類似於
『DPI45HKISEXU6HG7』的密鑰,並且把這個密鑰保存在.google_authenticator中。
2.客戶端掃描二維碼,把密鑰『DPI45HKISEXU6HG7』保存在客戶端,同
時客戶端也可以手動輸入密鑰,生成驗證碼
1.客戶端每30秒使用密鑰『DPI45HKISEXU6HG7』和時間戳通過一種『算法』
生成一個6位數字的一次性密碼,如『684060』
2.用戶登陸時輸入一次性密碼『684060』
3.服務器端使用保存在.google_authenticator中的密鑰『DPI45HKISEXU6HG7』
和時間戳通過同一種『算法』生成一個6位數字的一次性密碼。大家都懂控制
變量法,如果算法相同、密鑰相同,又是同一個時間(時間戳相同),那麼客
戶端和服務器計算出的一次性密碼是一樣的。服務器驗證時如果一樣,就登錄
成功了
安裝(centos7)
1.install
a.增加epel repo
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
# yum install google-authenticator
b.修改ssh配置,vim /etc/ssh/sshd_config 修改如下
#ChallengeResponseAuthentication yes ###允許交互
#AuthenticationMethods publickey,password publickey,keyboard-interactive #增加認證方法,默認只有密碼認證才需要輸入驗證碼,增加之後,有公鑰也需要輸入驗證碼
#重啓服務 systemctl restart sshd
c.在認證文件/etc/pam.d/sshd增加如下內容
#auth required pam_google_authenticator.so nullok #auth substack password-auth 放於前後取決於先輸入驗證碼還是先輸入密碼
d.生成認證文件
#google-authenticator -t -d -f -r 3 -R 30 -W #生成文件在當前家目錄的.google_authenticato,同時也會彈出生成的條形碼及5次緊急驗證碼,5次驗證碼使用一次少一次
#用cat .google_authenticator 打開文件後,其實內容很簡單,第一行是認證生成的密鑰,包括認證方法,時間等參數
#也可以一步一步生成,參考文檔:https://shenyu.me/2016/09/05/centos-google-authenticator.html
- 如果認證文件都每個用戶的加目錄下,如果用戶刪除文件.google_authenticator之後怎麼辦?難道寫監控腳本定期check文件是否存在及文件有無被修改,對於這個問題,可以將認證文件放在統一放置,並且只能root用戶可以訪問及修改,權限爲400
- 在/etc/pam.d/sshd 中,認證信息後面添加
auth required pam_google_authenticator.so user=root secret=/data/google_authenticator/${USER}
#指定用戶去讀取認證文件及認證文件的路徑
- 在/etc/pam.d/sshd 中,認證信息後面添加