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