用 PGP 保護程式碼完整性(七):保護線上帳戶

2019-01-10 23:12:00

在這個系列的最後一篇當中,我們將為你展示如何用雙因子認證保護你的線上賬戶。

到目前為止,本系列教學已經提供了 PGP 的實用指南,包括基本概念和工具、生成和保護你的金鑰的步驟。如果你錯過了前面的文章,可以通過下面的連結檢視。在本系列的最後一篇文章中,我們將為你保護線上帳戶提供一個額外的指南,保護線上帳戶是當今非常重要的一件事情。

清單

  • 取得一個具備 U2F 功能的裝置(必要)
  • 為你的線上帳戶啟用雙因子認證(必要)
    • GitHub/GitLab
    • Google
    • 社交媒體
  • 使用 U2F 作為主驗證機制,使用 TOTP 作為備選(必要)

考慮事項

你可能注意到,很多線上開發者身份是綑綁了 email 地址的。如果有人能夠存取你的郵箱,他們就能夠去做一些對你會產生危害的事情,進而會損害你作為自由軟體開發者的聲譽。應該像保護你的 PGP 金鑰那樣保護你的 email 地址。

使用 Fido U2F 的雙因子認證

雙因子認證 是一種提升帳戶安全性的機制,它除了要求使用者名稱和密碼之外,還要求一個物理令牌。它的目標是即便在有人竊取了你的密碼(通過按鍵記錄器、肩窺攻擊或其它方式)的情況下,仍然能確保你的帳戶安全,他們在沒有得到你的一個專用的物理裝置(“必備”的那個因子)的情況下,始終不能獲取你的帳戶。

廣為人知的雙因子認證機制有:

  • 基於 SMS 的驗證
  • 藉助智慧手機應用程式的基於時間的一次性令牌(TOTP),比如 Google Authenticator 或類似解決方案
  • 支援 Fido U2F 的硬體令牌

基於 SMS 的驗證很容易設定,但是它有如下的缺點:它在沒有手機信號的地方無法使用(比如,建築物的地下室),並且如果攻擊者能夠阻斷或轉向 SMS 資訊,這種方式可能就會失敗,比如通過克隆你的 SIM 卡。

基於 TOTP 的多因子認證提供了比 SMS 更好的安全保護,但它也有一些重要的缺點(你要在智慧手機中新增的那麼多令牌中找到正確的那個)。此外,還不能避免一個事實,那就是你的金鑰最終還是儲存在你的智慧手機中 —— 它是一個複雜的、全球連線的裝置,它有可能還沒有及時從製造商那兒收到安全修補程式。

更重要的是,不論是使用 TOTP 還是 SMS 的方法來保護你免受誘騙攻擊 —— 如果誘騙攻擊者能夠竊取你的帳戶密碼和雙因子令牌,他們就可以在合法的站點上使用它們,存取你的帳戶。

Fido U2F 是一個按標準開發的專用裝置,它能夠提供雙因子認證機制來對付誘騙攻擊。U2F 協定在 USB 令牌中儲存每個站點的的唯一金鑰,如果你在任何合法站點以外的地方嘗試使用它,它將阻止你,以防範偶然讓攻擊者獲得你的密碼和一次性令牌。

Chrome 和 Firefox 都支援 U2F 雙因子認證,希望其它瀏覽器也能夠提供對 U2F 的支援。

獲得一個支援 Fido U2F 功能的令牌

支援 U2F 的硬體令牌的 可選目標很多,但如果你已經訂購了一個支援智慧卡的物理裝置,那麼你最好的選擇就是 Yubikey 4,它兩者都支援。

啟用你的線上帳戶的雙因子認證

你要確定想啟用雙因子認證的線上賬戶,你的 email 提供商已經使用了(特別是 Google,它對 U2F 的支援非常好)。其它的站點這個功能應該是啟用了:

  • GitHub:當你上傳你的 PGP 公鑰時,你應該要想到,如果其他人能夠獲得存取你的帳戶,他們可以用他們自己的 PGP 公鑰替換掉你的 PGP 公鑰。如果在 GitHub 上發布程式碼,你應該使用 U2F 認證來保護你的帳戶安全。
  • GitLab:理由同上
  • Google:如果你有 google 帳戶,你就驚奇地發現,許多帳戶都允許以 Google 帳戶來代替站點專用的認證來登入它們。
  • Facebook:理由同上,許多線上站點都提供一個選擇讓你以 Facebook 的帳戶來認證。即便你不使用 Facebook 也應該使用雙因子認證來保護你的 Facebook 帳戶。
  • 你認為必要的其它站點。檢視 dongleauth.info 去找找靈感。

如有可能,設定 TOTP 作為備選

許多站點都允許你設定多個雙因子認證機制,推薦的設定是:

  • U2F 令牌作為主認證機制
  • TOTP 手機應用作為輔助認證機制

通過這種方式,即便你丟失了你的 U2F 令牌,你仍然能夠重新獲取對你的帳戶的存取。或者,你可以註冊多個 U2F 令牌(即:你可以用一個便宜的令牌僅用它做 U2F,並且將它用作備份)。

延伸閱讀

到目前為止,你已經完成了下列的重要任務:

  1. 建立你的開發者身份並使用 PGP 加密來保護它。
  2. 通過將你的主金鑰移到一個離線儲存中並將子金鑰移到一個外接硬體裝置中的方式來設定你的環境,讓竊取你的身份變得極為困難。
  3. 設定你的 Git 環境去確保任何使用你專案的人都能夠驗證倉庫的完整性和它的整個歷史。
  4. 使用雙因子認證強化你的線上帳戶。

在安全保護方面,你已經做的很好了,但是你還應該去閱讀以下的主題:

  • 如何去強化你的團隊溝通。你的專案開發和治理決策的要求應該和保護提交程式碼那樣去保護,如果不這樣做,應該確保你的團隊溝通是可信任的,並且所有決策的完整性是可驗證的。
  • 如何去強化你的工作站的安全。你的目標是盡可能減少導致專案程式碼被汙染的危險或你的開發者身份被竊的行為。
  • 如何寫出安全的程式碼(檢視相關程式語言和你專案所使用的庫的各種文件)。即便引入它的提交程式碼上有一個 PGP 簽名,糟糕的、不安全的程式碼仍然是糟糕的、不安全的程式碼!