用戶身份驗證真的很簡單嗎
前言
你現(xiàn)在要建立一個系統(tǒng)。無論系統(tǒng)的功能如何,用戶身份驗證都是始終存在的一個功能。實現(xiàn)它看起來應(yīng)該很簡單——只需“拖動”一些現(xiàn)成的身份驗證模塊,或使用一些基本選項(例如 Spring Security)對其進(jìn)行配置,就完成了。
是這樣嗎,不是的。上面說的是表面上的描述(就比如要實現(xiàn)一個搜索引擎就一個輸入框一個搜索按鈕就行了??),要做到正確的身份識別極其復(fù)雜。這不僅僅是登錄表單 -> 檢查用戶名/密碼 -> 設(shè)置 cookie,還有很多其他的問題需要考慮的:
- Cookie 安全性
如何確保 cookie 不會泄漏或無法偽造。是否使用 cookie,或者使用 JWT 之類的無狀態(tài)方法,使用 SameSite 寬松還是嚴(yán)格要求?
- 綁定IP
如果IP更改,將cookie綁定到IP并注銷用戶?
- 密碼要求
最小長度、特殊字符?幫助選擇密碼的用戶界面?
- 密碼存儲
在數(shù)據(jù)庫中存儲密碼——bcrypt、scrypt、PBKDF2、SHA 多次迭代?
- 免密登錄
允許存儲在瀏覽器中,一般為“是”,但有些應(yīng)用在發(fā)送前故意對其進(jìn)行哈希處理,使其無法自動存儲
- 賬號樣式
電子郵件、用戶名與手機(jī)號——你需要用戶名嗎?是否允許更改電子郵件、手機(jī)號碼?
- 限制登錄錯誤數(shù)次
限制身份驗證嘗試 – 應(yīng)該阻止多少次登錄失敗的帳戶,管理員應(yīng)該在多長時間內(nèi)收到通知或至少記錄鎖定帳戶?每個 IP、每個帳戶的限制是這些的組合嗎?
- 驗證碼
你需要驗證碼嗎,哪一種,允許多少次嘗試?刷新驗證碼是一種選擇嗎?
- 密碼重置
密碼重置令牌數(shù)據(jù)庫表或與 HMAC 的過期鏈接?限制密碼重置?
- SSO
您的服務(wù)是否應(yīng)該支持 LDAP/ActiveDirectory 身份驗證(也許是),它是否應(yīng)該支持 SAML 2.0 或 OpenID Connect,如果支持,哪些?還是全部?是否應(yīng)該只支持 SSO,而不是內(nèi)部身份驗證嗎?
- 2FA – TOTP
實施整個 2FA(雙因素認(rèn)證) 流程,包括啟用/禁用,或備份代碼;在一段時間內(nèi)不為特定設(shè)備請求 2FA來添加選項?根據(jù)某些組成員身份,配置 AD/LDAP 用戶子集進(jìn)行身份驗證?
- 強(qiáng)制配置 2FA
通過管理員配置強(qiáng)制 2FA – 在啟用全局選項后實現(xiàn)激活 2FA 的時間窗口?
- 一次性登錄
通過鏈接登錄 – 是否支持通過電子郵件發(fā)送一次性登錄鏈接的選項?
- XSS 保護(hù)
確保不存在 XSS 漏洞,特別是在登錄頁面上( XSS 可以竊取 cookie)
- 身份驗證日志
專用身份驗證日志 - 保留所有登錄的歷史記錄,包括時間、IP、用戶代理
- 強(qiáng)制注銷
是否需要注銷所需的已登錄設(shè)備的功能。
- 允許移動設(shè)備保持登錄狀態(tài)
是否讓移動設(shè)備保持登錄狀態(tài)——客戶端應(yīng)該存儲什么?(當(dāng)然不是密碼明文)
- 保存用戶登錄地址
捕獲用戶的登錄時區(qū)并將其存儲在會話中以調(diào)整 UI 中的時間?
- TLS 相互認(rèn)證
如果我們需要支持使用私鑰的令牌認(rèn)證,我們應(yīng)該啟用 TLS 相互認(rèn)證。證書庫中應(yīng)該有什么,Web 服務(wù)器是否支持每頁雙向 TLS 或者我們是否應(yīng)該使用子域,如果有負(fù)載均衡器/反向代理,它是否支持以及如何轉(zhuǎn)發(fā)證書詳細(xì)信息?
- 是否需要激活步驟
需要激活賬戶還是讓用戶在注冊后立即登錄?需要后臺人員批準(zhǔn)賬戶?
- 初始密碼設(shè)置
管理員創(chuàng)建的帳戶的初始密碼設(shè)置 - 生成初始密碼并在首次登錄時強(qiáng)制更改?不是生成密碼并且從密碼重置流程開始?
- 登錄異常檢測
如何檢測登錄異常,應(yīng)該通過什么方式通知用戶嗎?是否依賴第三方工具(例如 SIEM),還是內(nèi)置此類功能?
身份驗證是每個應(yīng)用程序基本的功能。但很多開發(fā)人員或PM都不重視它。IT 世界很復(fù)雜,沒有什么是簡單的。發(fā)送電子郵件不簡單,身份驗證不簡單,日志記錄也不簡單。處理字符串和日期并不簡單,清理輸入和輸出也不簡單。
我們在構(gòu)建框架和工具,來幫助我們完成所有這些事情方面做得不夠好。我們要積極對待這些問題,思考它們并做出最正確的方案。