網(wǎng)站防護(hù)措施有哪些?
時(shí)間:2023-10-23 10:42:02 | 來(lái)源:網(wǎng)站運(yùn)營(yíng)
時(shí)間:2023-10-23 10:42:02 來(lái)源:網(wǎng)站運(yùn)營(yíng)
網(wǎng)站防護(hù)措施有哪些?:如果能按照本文的這個(gè)清單來(lái)實(shí)踐,就能將網(wǎng)絡(luò)安全方面的風(fēng)險(xiǎn)降得很低。
Web開(kāi)發(fā)人員安全清單
在云端開(kāi)發(fā)安全又健壯的 Web 應(yīng)用非常難。如果你認(rèn)為這很容易,那你技術(shù)水平要么已經(jīng)很牛叉,要么還沒(méi)有踩過(guò)坑。
如果你盲目接受最簡(jiǎn)可行產(chǎn)品(Minimum Viable Product,簡(jiǎn)稱(chēng) MVP),并且認(rèn)為你能在一個(gè)月之內(nèi)創(chuàng)建一個(gè)既有價(jià)值又安全的產(chǎn)品,那么在你推出你的“產(chǎn)品原型”前,你還需要多想想。在你查看了下面的清單之后,確認(rèn)你不會(huì)犯這些嚴(yán)重的安全問(wèn)題。至少,你要對(duì)你的潛在用戶(hù)坦誠(chéng),讓他們知道你還沒(méi)有一個(gè)完整的產(chǎn)品,并且只提供一個(gè)沒(méi)有全面安全的原型。
這個(gè)清單很簡(jiǎn)單,并且也不是那種大而全的。我已經(jīng)開(kāi)發(fā)安全的 Web 應(yīng)用有 14 年多了。這個(gè)清單包含了一些相對(duì)重要的問(wèn)題。這些問(wèn)題都是我在這段時(shí)間學(xué)到的,而這個(gè)過(guò)程也是痛苦的。當(dāng)你在創(chuàng)建 Web 應(yīng)用時(shí),我希望你能夠認(rèn)真地對(duì)待這些問(wèn)題。
如果在這個(gè)清單中,你有我沒(méi)有提到的項(xiàng)目,請(qǐng)留言補(bǔ)充。
數(shù)據(jù)庫(kù)
- [ ] 可以識(shí)別用戶(hù)的數(shù)據(jù)和敏感數(shù)據(jù)(如訪問(wèn)令牌、電子郵件地址或賬單信息)需要加密。
- [ ] 如果你的數(shù)據(jù)庫(kù)在休息狀態(tài)時(shí)支持低成本加密(如AWS Aurora),那么啟動(dòng)該功能來(lái)保護(hù)硬盤(pán)上的數(shù)據(jù)。同時(shí)也要確保所有備份都是被加密存儲(chǔ)的。
- [ ] 給用戶(hù)最低訪問(wèn)權(quán)限的賬戶(hù)。不要使用數(shù)據(jù)庫(kù)的 root 賬戶(hù)。
- [ ] 刻意設(shè)計(jì)一個(gè)密鑰庫(kù),用它存儲(chǔ)和分發(fā)機(jī)密內(nèi)容。不要硬編碼到你的應(yīng)用中。
- [ ] 通過(guò)只使用 SQL 預(yù)處理語(yǔ)句(prepared statements)的方法來(lái)完全防止 SQL 注入。比如:如果要使用 NPM,不要使用 npm-mysql,而是使用 npm-mysql2,因?yàn)樗С诸A(yù)處理語(yǔ)句。
開(kāi)發(fā)
- [ ] 對(duì)于每個(gè)發(fā)布的版本,確保軟件的所有組件都通過(guò)了漏洞掃描。組件指的是操作系統(tǒng)、庫(kù)和包。這應(yīng)該自動(dòng)地進(jìn)入持續(xù)集成/持續(xù)交付流程。
- [ ] 保證開(kāi)發(fā)系統(tǒng)的安全。同樣的,對(duì)于你使用的產(chǎn)品系統(tǒng),也需要保持相同的警惕。在安全、隔離的開(kāi)發(fā)系統(tǒng)中開(kāi)發(fā)軟件。
認(rèn)證
- [ ] 確保所有密碼都經(jīng)過(guò)合適的加密方法(如 bcrypt )的散列處理。永遠(yuǎn)不要自己實(shí)現(xiàn)加密方法,并且用好的隨機(jī)數(shù)據(jù)來(lái)正確地初始化加密方法。
- [ ] 在實(shí)現(xiàn)登錄、忘記密碼、密碼重置等功能時(shí),用經(jīng)過(guò)驗(yàn)證過(guò)的最佳實(shí)現(xiàn)或組件。不要重復(fù)造輪子,因?yàn)槟愫茈y保證其在所有場(chǎng)景中都不會(huì)出現(xiàn)問(wèn)題。
- [ ]遵循簡(jiǎn)單且合適的密碼規(guī)則,鼓勵(lì)用戶(hù)使用較長(zhǎng)的隨機(jī)密碼。
- [ ] 你們提供的所有服務(wù),用多重認(rèn)證來(lái)驗(yàn)證登錄。
拒絕服務(wù)防護(hù)
- [ ]確保網(wǎng)站不會(huì)因 API 遭拒絕服務(wù)攻擊(DOS)而癱瘓。至少,在相對(duì)較慢的 API 路徑上(像登錄和 Token 生成程序)設(shè)置頻率限制器。
- [ ] 對(duì)用戶(hù)所提交的數(shù)據(jù)和請(qǐng)求,在大小以及結(jié)構(gòu)這兩點(diǎn)上執(zhí)行合理的限制。
- [ ] 通過(guò)使用全局緩存代理服務(wù)(類(lèi)似 CloudFlare )來(lái)規(guī)避分布式拒絕服務(wù)(DDOS)。如果網(wǎng)站遭到 DDOS 攻擊,你就能打開(kāi)這個(gè)服務(wù)和其他類(lèi)似的,以作 DNS 查詢(xún)。
網(wǎng)絡(luò)流量
- [ ] 整個(gè)網(wǎng)站都使用 TLS,不僅僅是登錄表單和響應(yīng)。 永遠(yuǎn)不要只在登錄表單中使用 TLS。
- [ ] Cookie 必須設(shè)置 httpOnly、安全、被路徑和域限定。
- [ ] 使用內(nèi)容策略安全(CSP),并且不允許 unsafe-*(*是通配符)后門(mén)。雖然配置時(shí)很痛苦,但這是值得做的。
- [ ] 在客戶(hù)端的響應(yīng)頭中使用 X-Frame-Option、X-XSS-Protection。
- [ ] 使用 HSTS 響應(yīng)強(qiáng)制僅限 TLS 訪問(wèn)。在服務(wù)器上重定向所有 HTTP 請(qǐng)求到 HTTPS,作為替代方案。
- [ ] 在所有的表單中使用 CSRF 令牌(Token)。使用新的 SameSite Cookie 響應(yīng)頭,這徹底解決了所有較新瀏覽器上的 CSRF 問(wèn)題。
API
- [ ] 確保公開(kāi) API 中沒(méi)有可枚舉的資源。
- [ ] 確保用戶(hù)經(jīng)過(guò)全面的認(rèn)證,并且擁有適當(dāng)權(quán)限的用戶(hù)才能訪問(wèn) API。
- [ ] 在 API 中使用隨機(jī)檢查,以檢測(cè)潛在攻擊的非法或異常請(qǐng)求。
驗(yàn)證
- [ ] 為了給用戶(hù)快速的反饋,可以在客戶(hù)端做輸入合法性驗(yàn)證,但是永遠(yuǎn)不要相信用戶(hù)的輸入數(shù)據(jù)。
- [ ] 在服務(wù)器端使用白名單,來(lái)驗(yàn)證所有用戶(hù)的輸入。永遠(yuǎn)不要直接將用戶(hù)的內(nèi)容添加到響應(yīng)中。永遠(yuǎn)不要在 SQL 語(yǔ)句中使用用戶(hù)輸入的內(nèi)容。
云配置
- [ ] 確保所有的服務(wù)打開(kāi)盡可能少的端口。當(dāng)隱晦式安全(security through obscurity)沒(méi)有保護(hù)的效果時(shí), 將默認(rèn)的端口替換成非標(biāo)準(zhǔn)的端口,這樣可以讓攻擊者更難攻破。
- [ ] 將后端數(shù)據(jù)庫(kù)和服務(wù)托管到私有 VPC 上 (虛擬私有云),而 VPC 不能被任何公共網(wǎng)絡(luò)訪問(wèn)。當(dāng)你在配置 AWS 安全組和對(duì)等 VPC 時(shí),你需要非常仔細(xì),因?yàn)檫@可能導(dǎo)致服務(wù)無(wú)意中對(duì)外部開(kāi)放。
- [ ] 在隔離 VPC 和對(duì)等 VPC 里隔離邏輯服務(wù),以便支持跨服通信。
- [ ] 確保所有服務(wù)接收的數(shù)據(jù),來(lái)自于一個(gè)盡可能小范圍內(nèi)的 IP 地址。
- [ ] 限制出站 IP 和端口流量,最大限度地減少 APT 攻擊帶來(lái)的損失和“通訊”。
- [ ] 始終使用 AWS 訪問(wèn)管理(IAM)這個(gè)身份,而不是 root 憑據(jù)。
- [ ] 授予所有操作和開(kāi)發(fā)人員最小的訪問(wèn)權(quán)限。
- [ ] 根據(jù)時(shí)間表定期地更換密碼和訪問(wèn)密鑰。
基礎(chǔ)設(shè)施
- [ ] 確保你能在不停機(jī)的情況下升級(jí)。確保你能通過(guò)完全自動(dòng)的方式快速升級(jí)。
- [ ] 使用像 Terraform 這樣的工具創(chuàng)建所有的基礎(chǔ)架構(gòu),而不是通過(guò)云端控制臺(tái)。基礎(chǔ)架構(gòu)應(yīng)該被定義為“代碼”,并且能夠按下按鈕來(lái)重建。對(duì)于任何在云端手動(dòng)創(chuàng)建的資源采取零容忍態(tài)度,之后 Terraform 就能審計(jì)你的配置了。
- [ ] 所有服務(wù)都使用集中式日志架構(gòu)。你永遠(yuǎn)都不應(yīng)該需要 SSH 來(lái)訪問(wèn)或者檢索日志。
- [ ] 除了一次性診斷,不要通過(guò) SSH 連接到你的服務(wù)。通常使用 SSH 意味著你沒(méi)有自動(dòng)執(zhí)行重要任務(wù)。
- [ ] 永遠(yuǎn)不要在任何 AWS 服務(wù)組上保持 22 號(hào)端口為打開(kāi)的狀態(tài)。
- [ ] 創(chuàng)建不變的主機(jī),而不是不斷地給你長(zhǎng)壽的服務(wù)器打補(bǔ)丁和升級(jí)。(參見(jiàn)Immutable Infrastructure Can Be More Secure).
- [ ] 使用入侵檢測(cè)系統(tǒng)來(lái)最大化減少 APT 攻擊帶來(lái)的影響。
運(yùn)營(yíng)
- [ ] 關(guān)閉未使用的服務(wù)和服務(wù)器。斷電的服務(wù)器是最安全的。
測(cè)試
- [ ] 審計(jì)你的設(shè)計(jì)和實(shí)施。
- [ ] 做滲透測(cè)試。除了你之外,還可以叫其他人進(jìn)行滲透測(cè)試。
培訓(xùn)
- 就關(guān)于社會(huì)工程領(lǐng)域中的潛在威脅和相關(guān)防護(hù)技術(shù),要對(duì)員工(特別是高級(jí)員工)進(jìn)行培訓(xùn)。
最后,制定一個(gè)計(jì)劃
- [ ] 做一個(gè)威脅模型,描述你正在防御對(duì)象。按主次列出可能的威脅和參與者。
[ ] 制定一份可實(shí)操的安全事故計(jì)劃??傆幸惶炷銜?huì)需要的。