SSH使用FIDO2 USB進行身份驗證
在OpenSSH 8.2中,提供了對FIDO2的支持。這樣用戶就可以硬件USB密鑰證書進行用戶認證。這樣可以實現簡單、有效和安全的SSH認證了。本文我們就嘗試一下基于FIDO2的SSH認證,前提是需要一個USB key設備。
FIDO2
在硬件認證安全領域WebAuthn和FIDO2的發展,他給我們帶來了更便捷安全的方法。WebAuthn和FIDO2旨在通過標準化二者之間的通信方式使用安全設備的變得真正容易。
對每一個人來說這都是一個好消息,現在大家可以使用便捷的USB密鑰,無需額外的安全知識,即可非常輕松地保護所有身份驗證,完全避免網絡釣魚,密碼盜竊以及其他惡意攻擊的干擾,只需要插入USB密鑰,按小按鈕/輸PIN或者刷指紋,然后重新登錄。
雖然之前很多人可能都用過銀行的網銀,但是由于那是不標準通用的方式,不光要安裝各種各樣的驅動而且還要必須要特定版本的IE才行。而如果支持了FIDO2則可以被所有OS和任何瀏覽器所支持,當然包括今天要說的SSH。
截止目前根據有人統計國內也有很多企業加入了FIDO聯盟,包括阿里等大企業。
FIDO2分為WebAuthn和CTAP協議,最佳使用場景包括:
- 在設備上通過瀏覽器使用設備配置的指紋等生物識別能力進行身份認證;
- 在設備上通過瀏覽器使用外置Security key進行身份認證;
- 在設備上通過另一臺設備作為認證器完成身份認證。
結合使用FIDO2和SSH
對廣大使用Linux和Mac的技術人員來說,除了瀏覽器使用最多的要數SSH了。如果可以使用FIDO2密鑰通過SSH進行身份驗證,那將帶來很大方便和安全。為此OpenSSH也放棄一貫對硬件密鑰體系的傲慢態度,現在終于支持FIDO(U2F)和FIDO2進行身份驗證了,而帶有駐留鍵的FIDO2具有更好的便捷和安全性。流程是USB設備(FIDO2設備不一定是USB,但通常是USB設備)生成一個秘密密鑰。密鑰要么存儲在設備上(稱為駐留密鑰),要么需要設備支持存儲,要么不支持,需要將數據存儲在其他位置。
使用USB key設備的好處包括消除網絡釣魚,密碼盜竊,身份驗證重放以及許多其他攻擊。由于設備通過特定領域(服務器地址/URL/等)進行身份驗證,因此攻擊者無法在另一個站點上重復使用一個站點的身份驗證,這使得網絡釣魚無法進行。密碼或私鑰在設備上并無法復制提取,任何人都不能竊取密碼或私鑰。唯一可能的攻擊是你的USB Key丟了,但是由于設備有PIN密碼,并且有錯誤次數限制,嘗試幾次錯誤有,該設備將會鎖定實效。
可能有用過Yubikey的同學,使用SSH內置功能好處是不需要特別使用Yubikey,也不需要弄亂Yubikey代理,PIV模式或其他任何其他軟件。只需插入任何兼容FIDO2的密鑰,即可將其與SSH一起使用。有"駐留鍵"模式僅在Yubikey 5C和更高版本的FIDO2上有效。
使用方法
在了解了有關設備如何工作的所有不必要的細節之后,準備好將其中一個用于SSH。設置非常簡單,基本上只需一兩個命令(取決于方法),在客戶端和服務器上都運行OpenSSH 8.2,無需安裝其他軟件。下面我們分常駐密鑰模式和非常駐模式的兩種方法。
常駐密鑰模式
在支持FIDO 2設備的下,使用以下命令生成密鑰并將其存儲在設備上,支持的密鑰類型有"ed25519-sk"和"ecdsa-sk"兩種證書類型。
- ssh-keygen -t ed25519-sk -O resident -f ~/.ssh/id_ ed25519-sk
- ssh-keygen -t ed25519-sk -O resident -f ~/.ssh/id_ ecdsa-sk
SSH會要求輸入PIN碼并觸摸的設備,然后將密鑰對保存在設置目錄。
ssh-keygen將生成兩個文件,一個稱為id_ecdsa _sk,私鑰,一個稱為id_ecdsa _sk.pub公鑰。只需要將該公鑰添加到服務器上的authorized_keys即可中。
要將私鑰添加到SSH代理,需要將其復制到~/.ssh/目錄中,或者(如果在新計算機上并且沒有密鑰),請運行:
- ssh-add -K
插入設備。就會將密鑰添加到SSH代理,然后就將能夠連接到服務器。
非常駐密鑰模式
非駐留密鑰模式與前面模式基本相同,區別之處在于無法ssh-add -K直接從設備加載密鑰。和以前一樣,運行:
- ssh-keygen -t ed25519-sk -f ~/.ssh/id_ ed25519-sk
- ssh-keygen -t ed25519-sk -f ~/.ssh/id_ ecdsa-sk
SSH會要求輸入PIN并觸摸設備,然后將密鑰對保存在設置的目錄。需要手動將密鑰對存儲在~/.ssh/目錄中,并將公鑰文件添加到要登錄的任何服務器上的authorized_keys。既可以
當嘗試登錄時,OpenSSH會要求提供PIN并觸摸設備。
可以在生成密鑰時候設置no-touch-required選項來設置不需要每次都觸摸設備,但是啟用它并沒有取得很好的效果,但是這樣不是很安全。
將密鑰存儲在設備上意味著沒有人可以竊取它(設備設置了PIN或其他身份驗證方法),但是在連接后,不受信任的計算機仍可以通過SSH會話發送命令。不要從不信任的計算機上用SSH服務器,尤其是在使用SSH轉發(此-A選項)時要格外小心,因為服務器隨后可能會當做跳板或者代理而訪問其他服務器進行身份驗證。
非FIDO2設備和非openSSH 8.2客戶端
對于不支持FIDO2的其他設備(買不起Yubikey,比如幾十塊的國產飛天Usbkey),在使用其他ssh客戶端,而且ssh版本不是8.2的其實也有一種方法,只是需要下載一個第三方的代理軟件WinCryptSSHAgent(github:/ /buptczq/WinCryptSSHAgent)。
WinCryptSSHAgent基于 Windows證書管理系統, 不需要安裝任何驅動就能夠訪問智能卡上的證書.這個項目實現了 Windows 上各種各樣 SSH 客戶端的私有 Agent 協議, 在發生SSH 認證時, 客戶端將信息發給這個 Agent, 這個 Agent 會通過 Windows 提供的 API 對信息進行簽名, 完成認證。目前兼容的 SSH 客戶端有: Git for Windows、Windows Subsystem for Linux、Windows OpenSSH、Putty、Jetbrains、SecureCRT、Xshell、Cygwin、MINGW等。
啟動該代理軟件,然后就可以實現用USBKey登陸了。
當然使用該代理軟件有個缺點,啟動代理認證,完成一次認證后,支持該證書登陸服務器都可以直接登陸,這可會存在一定安全問題。可以通過定期關閉代理以保證安全。
總結
總的來說,OpenSSH對FIDO的支持給我們帶來了一種更便捷而且安全的身份認證方式。當然由于這是一個開始,可能還會存在著一些問題和bug,希望各種SSH客戶端軟件也能及時跟進,內置支持該協議,讓大家安全水平都提高一個檔次。