2018年03月05日
賬戶管理,授權(quán)和密碼管理往往是很棘手的。對(duì)很多開發(fā)者來(lái)說(shuō),賬戶管理功能是一個(gè)暗角,不會(huì)引起足夠的重視。對(duì)于產(chǎn)品經(jīng)理和用戶來(lái)說(shuō),產(chǎn)品的最終體驗(yàn)往往超出預(yù)期。
幸運(yùn)的是,谷歌云平臺(tái)(GCP)提供了一些工具,能夠使你在產(chǎn)品創(chuàng)造、安全處理和用戶賬號(hào)(本文中指任何在你系統(tǒng)中注冊(cè)的人——消費(fèi)者或者內(nèi)部用戶)認(rèn)證方面做出更好的決策。不論你負(fù)責(zé)的是什么系統(tǒng),部署在 Google Kubernetes Engine 上的WEB網(wǎng)站、 Apigee 上的API服務(wù)、使用 Firebase 的應(yīng)用或者任何包含用戶認(rèn)證的服務(wù),這篇文章會(huì)提供最佳實(shí)踐,來(lái)保證你擁有一個(gè)安全的、可伸縮的、可用的賬戶認(rèn)證系統(tǒng)。
1. 對(duì)密碼字段做哈希處理
對(duì)于賬戶管理,最重要的原則就是要安全地存儲(chǔ)用戶的敏感信息,包括用戶的密碼。用戶的數(shù)據(jù)是神圣的,必須要適當(dāng)?shù)奶幚怼?/span>
任何情況下都不要存儲(chǔ)明文密碼。你的服務(wù)中要藝術(shù)的哈希處理密碼,并且不能解密密碼——例如,使用 PBKDF2, Argon2, Scrypt, or Bcryp創(chuàng)建。這個(gè)哈希值應(yīng)該是對(duì)用戶唯一的登錄憑證加鹽處理后的結(jié)果。不要使用過(guò)時(shí)的哈希處理技術(shù)如MD5、SHA1,并且在任何情況下都不應(yīng)該使用可解密的算法或者嘗試發(fā)明哈希算法。
你應(yīng)該假設(shè)你設(shè)計(jì)的系統(tǒng)最終會(huì)被泄露。問(wèn)問(wèn)你自己“如果我的數(shù)據(jù)今天泄露了,在使用我的服務(wù)或者他們使用的別的服務(wù)時(shí),我的用戶的安全和隱私會(huì)受到威脅嗎?我們可以做些什么來(lái)減輕這種潛在的數(shù)據(jù)泄露可能造成的危害?”
另一個(gè)需要考慮的事情:當(dāng)用戶提供給你密碼之后,如果你能在任何時(shí)候產(chǎn)出一個(gè)用戶的明文密碼,那么你的實(shí)現(xiàn)就是有問(wèn)題的。
2. 盡可能允許第三方身份認(rèn)證
第三方身份認(rèn)證提供者使你可以依賴一個(gè)第三方值得信賴的服務(wù)認(rèn)證用戶的身份。谷歌、Facebook和推特通常是可用的提供者。
除了已經(jīng)存在的內(nèi)部認(rèn)證系統(tǒng),你可以使用一個(gè)平臺(tái)(如 Firebase 認(rèn)證)接入一個(gè)第三方的認(rèn)證服務(wù)。 Firebase 認(rèn)證有很多好處,如管理更簡(jiǎn)單、攻擊入口更小和跨平臺(tái)的SDK。通過(guò)這個(gè)列表我們會(huì)提出很多好處,具體查看 案例學(xué)習(xí)
Firebase認(rèn)證。
3. 區(qū)分用戶身份和用戶賬戶的概念
你的用戶不是電郵地址。他們不是電話號(hào)碼。他們不是由OAUTH響應(yīng)提供的唯一ID。 你的用戶是你服務(wù)中獨(dú)有的個(gè)性化數(shù)據(jù)和體驗(yàn)的聚合。設(shè)計(jì)良好的用戶管理系統(tǒng)在用戶個(gè)人資料的不同部分之間具有低耦合性和高內(nèi)聚性。
保持用戶帳戶和證書的概念分離將大大簡(jiǎn)化實(shí)施第三方認(rèn)證提供商的過(guò)程、允許用戶更改其用戶名并將多個(gè)身份鏈接到單個(gè)用戶帳戶上。實(shí)際上,為每個(gè)用戶提供一個(gè)內(nèi)部全局標(biāo)識(shí)符并通過(guò)該ID鏈接其配置文件和身份驗(yàn)證標(biāo)識(shí)可能會(huì)有所幫助,而不是將其全部集中到一條記錄之中。
4. 允許多個(gè)身份關(guān)聯(lián)到單個(gè)用戶賬號(hào)
一開始使用 用戶名和密碼 認(rèn)證登錄到服務(wù)的用戶,后面可能會(huì)使用 Google Sign-In 來(lái)登錄。他們并不知道這會(huì)創(chuàng)建多余的賬號(hào)。類似地,由于某些原因,服務(wù)中的一個(gè)用戶可能會(huì)關(guān)聯(lián)到多個(gè)電子郵箱。如果能正確的分離用戶身份和認(rèn)證信息,將 多個(gè)身份鏈接 到同一個(gè)用戶就會(huì)變得簡(jiǎn)單。
你的后臺(tái)需要考慮到用戶可能會(huì)通過(guò)一部分甚至所有途徑來(lái)通過(guò)注冊(cè)過(guò)程,但他們并沒有意識(shí)到在新的第三方身份沒有關(guān)聯(lián)到他們已經(jīng)存在于系統(tǒng)中的賬號(hào)。最簡(jiǎn)單的實(shí)現(xiàn)是要求用戶提供一個(gè)共同的細(xì)節(jié)用于識(shí)別,比如電子郵件地址,電話或用戶名等。如果該數(shù)據(jù)與匹配到系統(tǒng)中現(xiàn)有的用戶,則要求他們認(rèn)證已知身份并將新的 ID 關(guān)聯(lián)到已存在的賬號(hào)上。
5. 不要拒絕長(zhǎng)密碼或者復(fù)雜的密碼
NIST 最近更新了關(guān)于 密碼復(fù)雜度和強(qiáng)度 的準(zhǔn)則。如果你正在(或馬上會(huì))使用高強(qiáng)度的散列算法來(lái)保存密碼,很多問(wèn)題就會(huì)迎刃而解。不管輸入的內(nèi)容有多長(zhǎng),散列算法都會(huì)生成固定長(zhǎng)度的輸出,所以用戶可以使用他們喜歡的長(zhǎng)密碼。如果你必須限制密碼長(zhǎng)度,應(yīng)該僅從服務(wù)支持的最大 POST 大小來(lái)考慮限制。嚴(yán)格地說(shuō),這通常大于 1M。
散列后的密碼由大家都知道的一小部分 ASCII 字符組成。就算不是,也很容易通過(guò) Base64 把二進(jìn)制數(shù)據(jù)轉(zhuǎn)換過(guò)來(lái)。考慮到這一點(diǎn),你應(yīng)該允許用戶在密碼中隨意使用字符。如果有人想在密碼中使用克林貢語(yǔ)、表情字符和控制字符并在兩端加入空白字符,你應(yīng)該沒有技術(shù)方面的理由來(lái)拒絕他們。
6. 不要為用戶名強(qiáng)加不合理的規(guī)則
有些網(wǎng)站或服務(wù)要求用戶名的字符數(shù)不低于兩三個(gè)字符,不允許不可見字符,前后不能有空格,這些都毫無(wú)道理。然而,有些網(wǎng)站會(huì)要求最小長(zhǎng)度為 8 個(gè)字符,只允許使用 7 位(bit) 的 ASCII 字母和數(shù)字。
在網(wǎng)站上嚴(yán)格限制用戶名,可能會(huì)為開發(fā)者帶來(lái)方便,但在某些極端情況下對(duì)用戶的要求會(huì)讓某些用戶望而卻步。
某些情況下最好的辦法是指定用戶名。如果你的服務(wù)中遇到這種情況,需要確保指定的用戶名對(duì)用戶來(lái)說(shuō)很容易想起來(lái)也很容易告訴別人。字母數(shù)字組合的 ID 應(yīng)該避免視覺上不易識(shí)別的符號(hào),比如“Il1O0”。同時(shí)還建議對(duì)隨機(jī)生成的字符串進(jìn)行字典掃描,確保用戶名中沒有意外嵌入一些信息。這一原則同樣適用于自動(dòng)生成的密碼。
7. 允許用戶更改他們的用戶名
在遺留系統(tǒng)或任何提供電子郵件帳戶的平臺(tái)中,不允許用戶更改其用戶名是非常常見的。這里有很多 好的理由 支持不自動(dòng)釋放用戶名以供重復(fù)使用,但系統(tǒng)的長(zhǎng)期用戶最終會(huì)給出一個(gè)很好的理由來(lái)使用不同的用戶名,并且他們可能不想創(chuàng)建新的帳戶。
你可以通過(guò)允許別名并讓你的用戶選擇主別名來(lái)滿足用戶期望更改其用戶名的愿望。你可以在此功能之上應(yīng)用所需的任何業(yè)務(wù)規(guī)則。某些組織可能每年僅允許更改一次用戶名,或?qū)⒆柚褂脩麸@示除主用戶名以外的任何內(nèi)容。電郵供應(yīng)商可能會(huì)確保用戶在將老用戶名從其帳戶中分離出來(lái)之前充分得了解了相關(guān)風(fēng)險(xiǎn),或者可能完全禁止將老用戶名斷開鏈接。
為你的平臺(tái)選擇合適的規(guī)則,但要確保它們?cè)试S你的用戶隨著時(shí)間的推移而成長(zhǎng)和改變。
8. 允許你的用戶刪除自己的賬號(hào)
相當(dāng)數(shù)量的服務(wù)沒有用于用戶刪除其賬戶及相關(guān)數(shù)據(jù)的自助服務(wù)手段。用戶永久關(guān)閉帳戶并刪除所有個(gè)人數(shù)據(jù)有很多好的理由。這些問(wèn)題需要根據(jù)你的安全行和合規(guī)需求進(jìn)行平衡,但大多數(shù)受監(jiān)管的環(huán)境提供了有關(guān)數(shù)據(jù)保留的具體指導(dǎo)。避免合規(guī)和黑客攻擊的常見解決方案是讓用戶自己規(guī)劃其帳戶以備將來(lái)自動(dòng)刪除。
在某些情況下,你可能需要 遵照 用戶的要求,及時(shí)刪除其數(shù)據(jù)。如果發(fā)生數(shù)據(jù)泄露,對(duì)于發(fā)生“已關(guān)閉”帳戶的數(shù)據(jù)泄露情況,你還可以大大提高你的曝光率。
9. 在會(huì)話長(zhǎng)度上有意識(shí)地做決定
在安全驗(yàn)證上常常被忽略的是 會(huì)話長(zhǎng)度 。Google 作出了一些努力來(lái) 確保用戶的行為 并進(jìn)行雙重檢查,這主要基于某些事件和行為。用戶可以有步驟地 進(jìn)一步加強(qiáng)他們的安全性 。
你的服務(wù)可以有明確的理由來(lái)保持會(huì)話,而不是非關(guān)鍵分析目的無(wú)限期開放,但是,應(yīng)該有一個(gè) 門檻 來(lái)要求您輸入密碼、或第二個(gè)因素或其他用戶驗(yàn)證。
考慮多久的時(shí)間用戶應(yīng)該認(rèn)證,并明確之前是不活躍的。如果有人進(jìn)行密碼重置,就需要驗(yàn)證所有活動(dòng)會(huì)話的用戶身份。如果一個(gè)用戶更改核心方面的配置文件或當(dāng)他們執(zhí)行敏感的行動(dòng),應(yīng)該提示身份驗(yàn)證或第二因素。并考慮不允許從多個(gè)設(shè)備或位置登錄是否有意義。
當(dāng)你的服務(wù)用戶會(huì)話到期或需要重復(fù)認(rèn)證,提示用戶實(shí)時(shí)或提供一種機(jī)制來(lái)保護(hù)任何活動(dòng)來(lái)保存未保存的最后驗(yàn)證。用戶填寫表單,提交它一段時(shí)間后,發(fā)現(xiàn)他們所有的輸入已經(jīng)丟失,他們必須再次登錄,這是非常令人沮喪的。
江蘇國(guó)駿信息科技有限公司在信息網(wǎng)絡(luò)安全、運(yùn)維平臺(tái)建設(shè)、動(dòng)漫設(shè)計(jì)、軟件研發(fā)、數(shù)據(jù)中心領(lǐng)域具備十多年的行業(yè)沉淀。公司遵循信息安全整體性的IATF模型,從“人員素養(yǎng)”、“制度流程”、“技術(shù)產(chǎn)品”三個(gè)視角提供全面、可信的方案,業(yè)務(wù)涵蓋咨詢、評(píng)估、規(guī)劃、管控、建設(shè)、培訓(xùn)等。
江蘇國(guó)駿信息科技有限公司——全面可信的信息安全服務(wù)商。