1. 程式人生 > 實用技巧 >Linux實現ssh雙因子登陸,with Google Authenticator

Linux實現ssh雙因子登陸,with Google Authenticator

之前聽別人說,用了XX家的雲,安裝一個手機APP,每次登陸需要先驗證動態密碼,再輸入密碼,安全性大大提高,實現了傳說中的雙因子登陸,當時覺得好洋氣.

因為之前關注的角度不同,我更多的是從登陸統計以及報警來觀察,畢竟讓你直接登陸的堡壘機或者跳板機並不多,是我太out,聽說過雙因子登陸卻一直沒有去行動,於是心血來潮詳細百度谷歌了一些文章,更多的都是通過新增第三方模組增加二次驗證,於是幾個較為出名的就來了:谷歌認證google-authenticator,freeotp,洋蔥令牌,對比了一下名字,發現還是谷歌的名頭讓我比較有安全感,同時瞭解了一下洋蔥令牌,國產貨,號稱可以儲存在雲上,不用擔心換手機的後遺症,下面就講講我的安裝,相關的文件其實已經挺多了,步驟也挺簡單,拾人牙慧吧


首先是環境準備,我是常年自備虛擬機器:2臺centos6.7最小化安裝



1.安裝方式,centos6的環境下

1) epel源自帶google-authenticator,可以直接yum安裝,就是這麼簡單粗暴

rpm-ivhhttps://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
yuminstallgoogle-authenticator


2) github上直接拉最新原始碼安裝,centos7下會提示缺少m4目錄,先安裝好依賴環境

yuminstallgitwgetmakegccpam-develyuminstallautomakeautoconflibtoollibpng-develqrencode-y


gitclonehttps://code.google.com/p/google-authenticator/
cdgoogle-authenticator/libpam/
./bootstrap.sh
./configure
make
makeinstall

2.生成金鑰以及一次性金鑰,如果是按照以上方式安裝了qrencode,會在執行程式時生成一張大大的二維碼圖,手機掃一掃即可,也可以手動輸入驗證碼,還有另外一種方式直接開啟生成的url地址,裡邊是一張同樣的二維碼圖,只不過你需要×××才能看,效果是這樣的

wKiom1bpVJKjB0I4AACVESuca8U342.png


1) google-authenticator,會在你的家目錄生成一個.google_authenticator 檔案

同時會問詢一些機制和方式,如果看不懂的話一路yes也是好的

Doyouwantauthenticationtokenstobetime-based


是否基於時間生成密碼,這種認證方式分為HOPT和TOPT,一個是基於計數器來計算,一個是通過時間來計算,國內大多是基於TOPT,然而已經有云提供這種二次驗證了,表示沒用過,不心動...


2)

Doyouwantmetoupdateyour"/root/.google_authenticator"file(y/n)

是否將更新到/root/.google_authenticator檔案中,在執行到這一步的時候往上看,會顯示這些內容:


https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/[email protected]%3Fsecret%3DJ2UDL6O3DT7QVZA3%26issuer%3DBase
Yournewsecretkeyis:J2UDL6O3DT7QVZA3
Yourverificationcodeis312253
Youremergencyscratchcodesare:
37117552
96751003
22043179
27575526
80187267


如果包沒有漏裝的話還會顯示出一個特大號的二維碼圖,開啟提供的url地址也是可以的,但是你懂的

似乎verification code is 312253這個是手動輸入手機APP的驗證碼,相當於銀行U盾和你的手機繫結,這個和secret key都沒測過,直接通過二維碼掃描就可以了,如果手動的話還需要輸入使用者和主機資訊,下面一串數字是緊急驗證碼,每個只能用一次,比如手機沒帶


3)

Doyouwanttodisallowmultipleusesofthesameauthentication
token?Thisrestrictsyoutooneloginaboutevery30s,butitincreasesyourchancestonoticeorevenpreventman-in-the-middleattacks


是否多個相同的令牌限制每30秒只能登陸一個,這樣會更安全


4)

Bydefault,tokensaregoodfor30secondsandinordertocompensatefor
possibletime-skewbetweentheclientandtheserver,weallowanextra
tokenbeforeandafterthecurrenttime.Ifyouexperienceproblemswithpoor
timesynchronization,youcanincreasethewindowfromitsdefault
sizeof1:30mintoabout4min.Doyouwanttodoso(y/n)


如果你的時間同步不靠譜,可以增加視窗1分半到4分鐘...意思應該是增加容錯率吧,有效時間變相增大,不再是預設的30秒,友情提示,一定要先做好時間同步,某些應用依賴TOPT的,當時間錯誤以後會有漏洞產生


5)

Ifthecomputerthatyouareloggingintoisn'thardenedagainstbrute-force
loginattempts,youcanenablerate-limitingfortheauthenticationmodule.
Bydefault,thislimitsattackerstonomorethan3loginattemptsevery30s.


30秒內只能登陸3次



3.既然伺服器端已經完成了google認證的配置,手機上來一發app對接上吧,我的是依舊堅挺的5s,蘋果使用者之間登陸AppStore搜尋google authenticator,介面簡單粗暴,點選身份驗證器,然後選擇二維碼掃描即可,給大家看看這個介面

提示:相信從APP介面中能夠看出不同使用者和主機的密碼是不同的,這意味著你必須在伺服器上的每個使用者都執行一遍google-authenticator,生成獨立的.google-authenticator檔案,以及產生獨立的緊急密碼

wKiom1bpWSPC5wZMAACLNRxSVPc975.png

安卓客戶端沒有測試,谷歌商店肯定是有的,其餘應用商店大家可以自己找找,同樣簡單粗暴,掃描新增完成後會每30秒重新整理一次6位數密碼,是不是和各種U盾,XX寶的動態密碼一毛一樣了,如果有空的話還會嘗試一下洋蔥令牌,不是因為功能強大,而是因為它支援刷臉等各種姿勢...



4.手機和伺服器對接上了,最後就是伺服器上應用谷歌的驗證模組了

1)

vim/etc/pam.d/sshd

在第一行新增

authrequiredpam_google_authenticator.so


測試發現一定要在password-auth前面,就是說必須先驗證動態密碼,再驗證使用者密碼,順序不能調換,呼叫google的這個庫檔案才能啟用驗證

2)

vim/etc/ssh/sshd_config
ChallengeResponseAuthenticationyes
#把NO禁用,改為YES,開啟質疑--應答認證,不然光是開啟了pam模組的google驗證,在登陸時依然只是只詢問使用者密碼,但會返回Permissiondenied,pleasetryagain.必須兩個檔案同時修改,只關閉pam驗證時可以正常登陸


5.最後一下,然後浪起來

servicesshdreload


最後附上github地址:https://github.com/google/google-authenticator

新的測試環境一定要關閉selinux,不要問我是怎麼知道的,如果對詳細演算法有興趣的,可以谷歌一下,github上貌似也有


補充一下,假如各方面都配置好了,但是仍然不能有效工作的,找到你原始碼中的pam_google_authenticator.so檔案,拷貝到/lib64/security路徑中,有效的登陸介面應該是這樣子

wKioL1bpWXiyT_PYAAExR_JH_uE610.png




再次補充,重要,上生產環境前需要注意,百度和google的文章中也並未提起:

每個使用者需要單獨執行程式產生個人檔案,獨立的密碼,有點類似於mysql的賦權,同時基於使用者名稱和主機名的認證


當啟用金鑰認證的時候,動態密碼驗證無法生效


經測試,sshd_config檔案中即使關閉了密碼驗證,PAM模組pam_google_authenticator.so生效後仍然可以先驗證動態密碼,再輸入使用者密碼

在配置檔案中關閉密碼認證後,強制預設為優先驗證動態密碼,再驗證使用者密碼


當啟用金鑰之後,多個使用者中,有金鑰認證的依然會走金鑰認證這種方式,而刪除或者沒有金鑰認證的使用者則會走動態密碼+使用者密碼的方式,彼此沒有影響和衝突



轉載於:https://blog.51cto.com/oldtiger5/1751696