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