Web 開發者安全清單

開發安全、健壯的雲端 web 應用程式是非常困難的事情。如果你認為這很容易,要麼你過著更高階的生活,要麼你還正走向痛苦覺醒的路上。

倘若你已經接受 MVP(最簡可行產品) 的開發理念,並且相信能在一個月內創造既有價值又安全的產品 —— 在釋出你的“原型產品”之前請再三考慮。在你檢查下面列出的安全清單後,意識到你在開發過程中忽視了很多極其重要的安全問題。至少要對你潛在的使用者坦誠,讓他們知道你並沒有真正完成產品,而僅僅只是提供沒有充分考慮安全問題的原型。

這份安全清單很簡單,絕非覆蓋所有方面。它列出了在建立 web 應用時需要考慮的比較重要的安全問題。

如果下面的清單遺漏了你認為很重要的問題,請發表評論。

資料庫

  • 對識別使用者身份的資料和諸如訪問令牌、電子郵箱地址或賬單明細等敏感資料進行加密。
  • 如果資料庫支援在空閒狀態進行低消耗的資料加密 (如 AWS Aurora),那麼請啟用此功能以加強磁碟資料安全。確保所有的備份檔案也都被加密儲存。
  • 對訪問資料庫的使用者帳號使用最小許可權原則,禁止使用資料庫 root 帳號。
  • 使用精心設計的金鑰庫儲存和分發金鑰,不要對應用中使用的金鑰進行硬編碼。
  • 僅使用 SQL 預備語句以徹底阻止 SQL 注入。例如,如果使用 NPM 開發應用,連線資料庫時不使用 npm-mysql ,而是使用支援預備語句的 npm-mysql2 。

開發

  • 確保已經檢查過軟體投入生存環境使用的每個版本中所有元件的漏洞,包括作業系統、庫和軟體包。此操作應該以自動化的方式加入 CI/CD(持續整合/持續部署) 過程。
  • 對開發環境系統的安全問題保持與生產環境同樣的警惕,從安全、獨立的開發環境系統構建軟體。

認證

  • 確保所有的密碼都使用例如 bcrypt 之類的合適的加密演算法進行雜湊。絕對不要使用自己寫的加密演算法,並正確地使用隨機數初始化加密演算法。
  • 使用簡單但充分的密碼規則以激勵使用者設定長的隨機密碼。
  • 使用多因素身份驗證方式實現對服務提供商的登入操作。

拒絕服務防衛

  • 確保對 API 進行 DOS 攻擊不會讓你的網站崩潰。至少增加速率限制到執行時間較長的 API 路徑(例如登入、令牌生成等程式)。
  • 對使用者提交的資料和請求在大小和結構上增強完整性限制。
  • 使用類似 CloudFlare 的全域性快取代理服務應用以緩解 Distributed Denial of Service(DDOS,分散式拒絕服務攻擊)對網站帶來的影響。它會在你遭受 DDOS 攻擊時被啟用,並且還具有類似 DNS 查詢等功能。

網路交通

  • 整個網站使用 TLS (安全傳輸層協議),不要僅對登入表單使用 TLS。
  • Cookies 必須新增 httpOnly 和 secure 屬性,且由屬性 path 和 domain 限定作用範圍。
  • 使用 CSP(內容安全策略) 以禁止不安全的後門操作。策略的配置很繁瑣,但是值得。
  • 使用 X-Frame-Option 和 X-XSS-Protection 響應頭。
  • 使用 HSTS(HTTP Strict Transport Security) 響應強迫客戶端僅使用 TLS 訪問伺服器,同時服務端需要將所有 HTTP 請求重定向為 HTTPS。
  • 在所有表單中使用 CSRF 令牌,使用新響應頭 SameSite Cookie 一次性解決 CSRF 問題, SameSite Cookie 適用於所有新版本的瀏覽器。

APIs

  • 確保公有 API 中沒有可列舉的資源。
  • 確保每個訪問 API 的使用者都能被恰當地認證和授權。

校驗

  • 使用客戶端輸入校驗以及時給予使用者反饋,但是不能完全信任客戶端校驗結果。
  • 使用伺服器的白名單校驗使用者輸入。不要直接向響應注入使用者資訊,切勿在 SQL 語句裡使用使用者輸入。

雲端配置

  • 確保所有服務開放最少的埠。儘管通過隱藏資訊來保障安全是不可靠的,使用非標準埠將使黑客的攻擊操作更加困難。
  • 在對任何公有網路都不可見的私有 VPC 上部署後臺資料庫和服務。在配置 AWS 安全組和對等互聯多個 VPC 時務必謹慎(可能無意間使服務對外部可見)。
  • 不同邏輯的服務部署在不同的 VPC 上,VPC 之間通過對等連線進行內部服務的訪問。
  • 讓連線服務的 IP 地址個數儘可能少。
  • 限制對外輸出的 IP 和埠流量,以最小化 APT(高階持續性威脅)和“警告”。
  • 始終使用 AWS 的 IAM(身份與訪問管理)角色,而不是使用 root 的認證資訊。
  • 對所有操作和開發人員使用最小訪問許可權原則。
  • 按照預定計劃定期輪換密碼和訪問金鑰。

基礎架構

  • 確保在不停機的情況下對基礎架構進行升級,確保以全自動的方式快速更新軟體。
  • 利用 Terraform 等工具建立所有的基礎架構,而不是通過雲端命令列視窗。基礎架構應該程式碼化,僅需一個按鈕的功夫即可重建。請不要手動在雲端建立資源,因為使用 Terraform 就可以通過配置自動建立它們。
  • 為所有服務使用集中化的日誌記錄,不該再利用 SSH 訪問或檢索日誌。
  • 除了一次性診斷服務故障以外,不要使用 SSH 登入進服務。頻繁使用 SSH ,意味著你還沒將執行重要任務的操作自動化。
  • 不要長期開放任何 AWS 服務組的22號埠。
  • 建立 immutable hosts(不可變主機) 而不是使用一個經過你長期提交補丁和更新的伺服器。。(詳情請看部落格 Immutable Infrastructure Can Be More Secure)。
  • 使用如 SenseDeep 的 Intrusion Detection System(入侵檢測系統) 或服務,以最小化APTs(高階持續性威脅) 。

操作

  • 關閉未使用的服務和伺服器,關閉的伺服器是最安全的。

測試

  • 稽核你的設計與實現。
  • 進行滲透測試 — 攻擊自己的應用,讓其他人為你的應用編寫測試程式碼。

最後,制定計劃

  • 準備用於描述網路攻擊防禦的威脅模型,列出可能的威脅和網路攻擊參與者,並按優先順序對其排序。
  • 制定經得起實踐考驗的安全事故計劃,總有一天你會用到它。