“知物由學”是網易雲易盾打造的一個品牌欄目,詞語出自漢·王充《論衡·實知》。人,能力有高下之分,學習才知道事物的道理,而後才有智慧,不去求問就不會知道。“知物由學”希望透過一篇篇技術乾貨、趨勢解讀、人物思考和沉澱給你帶來收穫的同時,也希望開啟你的眼界,成就不一樣的你。當然,如果你有不錯的認知或分享,也歡迎透過郵件(zhangyong02@corp.netease.com)投稿。
作者介紹:Mike Hearn是一名軟體開發人員,之前是Google的高階軟體工程師和Gmail的反垃圾技術負責人,在反垃圾和登入安全方面有著八年的工作經驗。
以下是譯文:
我在谷歌期間參與一個統一賬戶系統(特別是反劫持anti-hijacking)的專案。登入是大多數網站的一部分,而本文也是我對如何構建安全登入的一些思考與建議。
1.自己最好不要做登入系統
無論你的業務是什麼,使用者身份驗證都不是你的核心能力。因為現在的登入系統需要做很多,密碼只是開始。如果想要讓登入安全,你最終還要新增不少登入設定功能:
- 忘記密碼的恢復;
- 電子郵件地址驗證;
- 登出賬號;
- 密碼暴力的強制保護;
- 透過簡訊,手機應用程式和硬體金鑰的雙重身份驗證;
- 賬戶劫持保護(當攻擊者已經知道正確的密碼並且使用者沒有修改時);
- 地區/語言/名稱/個人資料照片偏好;
- 支援移動/桌面登入;
隨著使用者對系統體驗期望的提高且攻擊者變得愈加厲害,繼續努力變得不切實際。幸運的是,你可以將認證外包給使用OAuth(OAUTH協議為使用者資源的授權提供了一個安全的、開放而又簡易的標準)的公司。
2.使用電子郵件/電話號碼來識別使用者
登入系統來識別使用者身份的方式莫過於兩種,使用者的電子郵箱或者電話號碼。如果你想讓使用者使用與顯示名稱不同的名稱,公司應該單獨去做這項工作,為什麼呢?
無論如何,電子郵箱是最方便的;
如果使用者名稱成為你服務中的一種自我展示形式,使用者會時不時地想改變它;
使用者容易忘記使用者名稱,而不會忘記電子郵箱/電話號碼;
優質的使用者名稱總是有限的;
將使用者名稱與顯示名稱分開將減少使用者對名稱設定的限制,如禁止使用空格。
3.根本不使用密碼
如果你還沒有準備好100%地依賴第三方ID提供商,那麼至少支援使用者不使用密碼。
因為你已經要求使用者提供他們的電子郵箱,然後你在登入系統新增的的第一個功能將會是密碼恢復,那麼這就可以透過電子郵件向使用者傳送可點選的連結來工作。因此,任何可以閱讀使用者電子郵件的人都可以以任何方式登入,而你自己的站點密碼不會增加額外的安全性。
可能會有人說,這樣會缺少密碼輸入框,使用者會感到困惑。但現在Google登入就是要求使用者提供他們的電子郵件地址,因此可以看出這不太可能讓使用者感到困惑,而且其中的好處是巨大的。
這種方法還需要考慮的問題是:一些使用者有電話號碼,但沒有電子郵箱。所以,你最終需要支援那些只能透過手機接收程式碼來登入的使用者。這樣的賬戶沒有密碼,所以如果你假定所有的使用者都有密碼,那麼你需要新增許多安全敏感的程式碼路徑的特殊情況,然而這就很容易導致致命的錯誤。
4.不要使用隱私問題
如果你使用了密碼,但是至少不要讓使用者使用隱私的問題和答案來恢復忘記密碼;
隱私問題的答案往往是簡單的猜測,使用者會發現這些問題的答案不只是他們知道;
預先提供的問題會使猜測問題變得更簡單;
預先提供的問題通常具有可猜測性(例如,“你在什麼地方上的高中?”);
有很多高調的駭客,透過濫用密碼恢復流來工作。
這裡有一些例子:
問:最喜歡的食物?
答:披薩。
答案總是披薩,你只需猜一次就可以猜中約20%的說英語的賬戶。只要10次猜測,你可以猜中三分之一以上有這個問題的所有說英語的賬戶。對於韓國賬戶,你可以在10次猜中所有賬戶的43%。
問:我結婚的日期?答:星期四。
一個自定義的問題,但也是致命的缺陷。攻擊者只需要猜測5次(這樣太少以至於不能被視為暴力強制嘗試。)
問:我出生在哪個城市?
答:首爾。
在一些國家,幾乎每個人都住在少數幾個大城市。觀察ID驗證使用者介面所使用的語言可以大大縮小可能城市的範圍。對於韓國賬戶,你只需要10次猜測即可猜中使用此問題40%的賬戶。
毫無疑問,專業賬戶系統並不都是使用隱私問題來允許使用者恢復賬戶,這僅僅是其中的一個例子。使用者不會在小於2%的機會下寫一些足夠複雜的東西來得到恢復密碼的權力。這就是為什麼Google將Q
/ As逐步轉向支援簡訊(SMS)恢復的原因。雖然基於SMS的恢復有其自身的問題,但它仍然比隱私問題好很多。
5.避免使用驗證碼(CAPTCHA)
驗證碼是許多登入表單的常用功能,但是目前驗證碼的價值非常低。
需要了解是,驗證碼只能對自動攻擊施加非常基本的限制,而不會保護你的賬戶系統免受批次註冊。除了賬戶安全,還需要解決Google註冊濫用的問題。我們經常看到垃圾郵件傳送者解決數千萬個我們最難破解的驗證碼,因為有一些專業的驗證碼破解公司,比如DeathByCaptcha,他們是將OCR和人工解決結合起來。普通驗證碼還有一個問題就是會阻止盲人註冊,而基於語音識別的驗證碼必需得由計算機解決,無法由人工解決。
驗證碼對阻止暴力的強制嘗試密碼是最有用的,有的人可能需要數十萬次或數百萬次針對賬戶的嘗試才能找到正確的密碼。為了防止使用者這種無盡的失敗嘗試的簡單方法就是放棄驗證碼。而且即使簡單的驗證碼也足以將一個小的延遲投入到bot迴圈中。
驗證碼在停止批次賬戶註冊方面的用處不大。構建系統來檢測和阻止這是一件困難的事,要了解它有多困難,請訪問buyaccs.com,並觀察地下賬戶賣家收取的巨大價格變化。較高的價格有更好的防禦系統,除非你是五大網站,否則你將無法戰勝在賬戶註冊安全方面所做的工作,這也是將登入系統外包給專門的公司的另一個理由。
如果你仍想使用驗證碼,請使用重複驗證碼並確保你的驗證碼已足以防禦反覆攻擊。不要試圖使用自己做的或你在GitHub上找到的用具包。這些驗證碼總是會被現在的OCR解決,且除了降低客戶註冊的成功率外,什麼做不了。
PS:有人工智慧加持的網易雲易盾驗證碼服務可以有效解決這個問題,具體可以參閱這篇文章:應對羊毛黨的老手段不管用了,但有些公司依然有辦法,他們是怎麼做的?
6.外包雙重認證(2-factor authentication)
目前,雙重身份驗證是一項非常普遍的功能。而且做好這個很難,你不要想著自己實現它。
SMS是不可靠的,特別是某些國家。恢復程式碼偶爾不會顯示出來。因此,你最終會希望透過語音合成實現電話呼叫,因為電話呼叫更可靠,所以現在你需要多語言語音合成引擎;
人們無法一直使用他們的電話號碼。如果你依賴電子郵件地址,你的密碼恢復流程可能非常容易。但一旦引入了實用的2FA,密碼恢復就成為系統中最薄弱的一點。因為如果你不升級它,攻擊者就會一直纏著它;
2FA可能會被攻擊者濫用,攻擊者會將其新增到被他們盜用或被駭客入侵的賬戶中。這是為了阻止真正的使用者找回這些賬戶;
電話號碼很容易移植攻擊,因此就是要求使用者設定移動應用程式或安全金鑰。實施這些很麻煩,而且這也不能萬無一失,並且你最終還需要一些使用者支援這個設定的實現;
正如你所想的那樣,2FA增加了大量的手動客戶支援工作,那是因為你不會再讓使用者使用電子郵件或基於私密問題的密碼恢復。
其中一些問題是根本性的,但其中大部分問題已經被大公司解決了,他們將免費為你代付手機費用和客戶支援人員!不過,如果你不想使用它們,這裡也有些初創公司會為你解決2FA的小部分難題。
7.不要強制更改密碼
不要因為密碼使用有些久遠就要求使用者更改密碼。
有些使用者不會完成整個過程,然後你就會流失使用者;
有些使用者會比你更聰明,使用一些技巧比如改變密碼(一次、兩次、三次),然後立即將密碼更改回原來的密碼,這意味著你需要儲存最近密碼的歷史,以防止這種行為;
無論如何它並沒有提高安全性。
8.記得登出
在未成熟的賬戶系統中,登出錯誤非常普遍。聽起來很簡單,但最常用做法是有問題的。
簡單地刪除會話cookie對於使用者來說很方便,但意味著你無法從XSS恢復。一旦找到XSS,你希望被盜的會話cookie失效,但如果退出只是“請求瀏覽器刪除cookie”,那麼你是無法做到這一點的;
為cookie新增時間戳,然後設定“最後登出時間”需要每個操作都檢查賬戶資料庫以發現使用者的會話是否失效。此外,這樣做也意味著需要使用者退出瀏覽器或裝置,然而這並不是使用者所期望的。
做到這一點的正確方法是保留使用記憶體快取的失效會話cookie列表。但是對於大多數公司來說,有一種成本較低且足夠好的方法:讓使用者的登出連結僅僅是清除會話cookie的一種方式,而不會讓會話cookie失效,但會每5分鐘左右自動更換一次。更換失效會話cookie的行為會查詢資料庫以檢視管理員是否強制登出。如果使用者正在呈現失效的cookie,則他們需要重新登入。這樣在cookie被盜後進行清理是相對罕見的事件。
9.將賬戶電子郵件與營銷郵件分開
傳送密碼恢復連結,註冊驗證等來自你公司的主要電子郵件伺服器。不幸的是,貴公司的一些人正試圖透過這個向使用者傳送他們不想要的商業郵件來與使用者建立“關係”。
即使使用者同意在賬戶註冊期間收到這些郵件,但是他們中的許多人不希望一直這樣,然後有些人會透過將其設定為垃圾郵件來解決此問題。
不幸的是,這種完全正常的行為將降低電子郵件域的聲譽,然後你的賬戶系統中的郵件可能會開始進入使用者的垃圾郵件資料夾。這就是為什麼我們都看到了註冊或密碼恢復流程中的警告,要求我們檢查我們的垃圾郵件資料夾。
解決這個問題的一種方法是購買一個單獨的頂級域名來傳送你的賬戶郵件並確保配置DKIM。但是一些使用者會注意到不匹配,並將你的電子郵件報告為網路釣魚。最好的解決方案是將你的營銷郵件從不同的DKIM領域傳送出去,但這可能會涉及到與負責產品的同事進行競爭。
10.保持密碼資料庫的安全
如果你的資料庫裡面有密碼,你就會有一個資料庫攻擊者。他們不直接關心你的公司,他們只是想要密碼,以便他們可以嘗試更高價值的目標。然而,資料洩露是令人尷尬,即使對客戶的直接影響較低,也可能帶來很大的代價。OAuth令牌資料庫對攻擊者而言價值遠低於此值,因此受攻擊的可能性要小得多。
結論
關於賬戶系統的資訊還有很多,這個任務看起來很大。這就是為什麼我一直建議把你的賬戶管理外包給大的公司。擺弄驗證碼不是你的核心業務;編寫“登出”設計文件不是你的核心業務;診斷你為什麼會流失忘記密碼的使用者不是你的核心業務;診斷為什麼簡訊傳送到對方不可靠不是你的核心業務。你在這些東西上浪費精力與費用時,你的對手們正在核心業務上下功夫。