AuthN 和 AuthZ 分別是 Authentication 和 Authorization 的簡寫,也就是驗證和授權。
不光兩個英文字像...簡寫形式一樣容易讓人混淆?
不過比起全名或是 A12n 或 A11n ,這樣好分辨多了Orz...
那麼 WebAuthN 就是 Web 和 AuthN 的結合,也就是在 Web 上的身份驗證。這裡特別指的是由FIDO聯盟推出的FIDO2的其中一部分。特徵就是讓使用者在瀏覽器瀏覽網頁時,可以利用辨識、臉部辨識等方快速登入。至於FIDO是Fast IDentity Online的縮寫,也就是「快速線上身份識別」,也就不難理解聯盟成立的目的為何。
在之前系列「用Keycloak學習身份驗證與授權」--淺談身份驗證與授權(1)和再談身份驗證與授權中,將整個身份驗證、授權到取得資源處理業務邏輯分成幾個部分看。
這次主要談的是WebAuthN,也就是身份驗證這一塊。能夠證明身份的方式通常又分成這麼幾種:
說到這,簡訊驗證碼也蠻像是零知識證明的過程。
你說你持有這支手機門號?那我就發送一個簡訊到這支門號上,只有我和門號持有者才知道簡訊內容。
通常這個暫時性密碼不會太長,為了避免被暴力攻擊,一般會限制多少時間內必須完成。(就算如此,也有人找出破解方式,就是很花錢)
第一種,也就只是純文字訊息而已,不過很大程度上,其後兩種也都是基於第一種或第一種變形(二進位資料)和密碼學而來。由於實現容易又幾乎沒有什麼限制在,是至今最為廣泛的驗證方式。
第二種,這就必須購買某件物品,還必須讓服務能夠識別這件物品。這也比較容易轉移。
第三種,在以前來看還是非常高科技的技術。現在臉部特徵辨識、指紋辨識也都已經應用廣泛了。或許以後還有需要挖一挖嘴裡取出細胞進行DNA辨識的方式。不過需要科技對人體的了解與硬體支援才行。
但其實,後兩者還有一些限制存在。不管是持有物品還是身份特徵,都不容易透過網路傳遞給服務提供者驗證,即使可以傳遞也不安全。因此通常還包含一段基於密碼學的處理方式。在那些支援識別特定物件或生物特徵的設備硬體中,存在一個並不會洩漏的硬體金鑰。當註冊時,將驗證訊息加以簽名並連同公鑰發送到驗證服務,驗證服務檢查驗證訊息後將公鑰儲存,而這個過程通常也還是需要先經過第一種身份驗證方式。
隨後,當登入時,在經過身份識別(注意是識別)後,同樣發送簽名過的驗證訊息,驗證服務檢查驗證訊息的簽名,正確的話也就驗證通過。
也因此並不是所有設備都可以使用後兩種方式進行驗證的,需要特定的硬體支援。所以才會有特別標記支援Windows Hello的相機或筆電。
此功能僅適用於具備紅外線(IR)網路攝影機的電腦,如果您在Windows Hello中沒看到臉部登入選項或是顯示為此選項無法使用,表示您的電腦沒有紅外線網路攝影機。
截取自 ASUS說明
很遺憾我自己的私人桌機設備是已經使用了數年的電腦,看起來是硬體並不支援。
雖然還可以使用新買的筆電或手機來說明。不過還是拿之前玩玩的截圖來看看吧。
Keycloak在16.1.1版本以前就已經支援WebAuthN的驗證方式。如果Keycloak服務有設置正確,在註冊完帳號或登入以後,可以添加WebAuthN的驗證方式。服務會詢問你要添加的驗證方式:
如果你的設備包含指紋辨識、臉部辨識的硬體裝置(第三種驗證方式),可以使用「這個裝置」進行註冊驗證;如果你持有YubiKey等硬體金鑰,可以選擇「USB安全金鑰」註冊驗證(第二種驗證方式)。此外,幾乎所有Android裡的Chrome都支援協助驗證的方式,透過「新增Android手機」會顯式一個QR Code:
透過Android手機掃描加入瀏覽器關聯以後,當下次要登入就會跳出提示要求手機驗證。
在儲存方面,可以看到Keycloak針對有設定登入驗證方式的使用者,多記錄了幾種Credientials。下面Bob這個帳號除了本來的密碼登入外,另外加了兩個WebAuthN的免密碼登入方式。
從細節來看也可以看到儲存了驗證需要使用的公鑰。
當Bob在下次登入的時候,就只需要輸入自己的帳號(身份識別)。然後選擇登入方式,也就可以直接透過指紋辨識、手機登入等方式,不需要輸入密碼的登入使用服務了
不需要輸入密碼的登入方式,統稱為無密碼登入或Passwordless。WebAutnN並不是唯一種,還有 Client Side TLS Authenization 和 Kerberos ,或許還有其他種方式。這邊先說一下Kerberos的方式。
Kerberos,中文有時候翻成「色柏洛斯」,是希臘神話作為冥界的看門狗,也常被稱為「地獄三頭犬」。就如同看門狗一樣,Kerberos作為驗證和授權的機制保護著資料。不過其實稱之為無密碼登入其實有些並不正確,Kerberos並不是不需要輸入密碼,而是與輕型目錄存取協議(LDAP)合作後,當使用者登入作業系統後,使用網頁服務就不需要再輸入密碼。
詳細點說,現在企業或其他機構,有可能整合Microsoft Active Directory(AD)。再將服務向AD註冊後,使用起來,不光是整合的電腦可以使用AD帳號登入,在登入以後網頁服務同樣不需要再輸入一次帳號密碼。關於Kerberos的機制,我在參考資料放了一些我覺得不錯的資料。
至於 Client Side TLS Authenization ,這可以看作是反向的TLS/HTTPs機制,同樣有公開金鑰基礎建設(PKI)參予。這部分就我目前理解來說,和Kerberos其實也有幾份相像(Kerberos同樣有一個作為使用者和服務雙方都信任的機構)。在瀏覽器憑證管理員除了可以看到一些伺服器憑證外,也有可能有個人憑證。
當然我的私人電腦並沒有,但如果點開細節,會看到用圖是「Client Authentication」。
因為我個人並沒有機會實現並玩過Client Side TLS Authenization,所以也只能從比較片面的角度去理解。而我的感覺其實與Linux系統使用金鑰和SSH登入很像,只是這不再只是一對一的,透過中間的PKI有機會一對多,主要像PKI註冊一個個人金鑰,就可以在多個服務之間遊走。不過其實不管是哪種無密碼登入方式,幾乎都有密碼學的身影。(這裡沒有提及簡訊登入,因為簡訊經常是作為第二次驗證使用,不過有一些服務透過寄送特別的神奇連接就可以登入。但這兩種都屬於第一或第二種驗證方式--只有你知道登入連接或簡訊內容、只有你有電子信箱存取權限或手機門號--且實現上不算困難又沒有加解密上的問題)
本文同時發表於我的隨筆