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