开发在云上面运行的安全可靠的 Web 应用程序是非常非常困难的。要是你觉得这很容易,那要么是你的生活方式更高级,不用管这破事儿,要么就是之前已经趟过许多坑了,对此已经了然于心了。
如果你了解MVP这档子事儿,并且确信自己可以在一个月之内倒腾出一个既实用又安全的产品 - 着手进行“原型产品”的开发工作之前,请三思。在你看过下面的清单之后,你要认识清楚自己跳过了这其中许多的安全问题。至少,你要对潜在用户说实话,让他们知道这个产品还不是完备的,它只是一个不完全安全的原型。
这个清单很简单,而且也绝非完整的。我已经开发安全 Web 应用程序超过了14年,这份列表包含了我在这段艰辛中认识到的一些比较重要的问题。希望你在创建 Web 应用程序时会认真地考虑一下这些问题。
如果你还有可以添加到这份列表中的问题,欢迎评论。
可以的话,就使用加密来保护同用户相关的敏感数据,比如访问令牌、电子邮件地址或账单(不过这做将对精确匹配查找的查询请求有限制)。
如果你的数据库支持闲时的低成本加密(比如 AWS Aurora),就可以用这个来保护磁盘上的数据。要确保所有备份都是被加密存储的。
对数据库的访问用户帐户要赋予尽可能小的权限。不要使用数据库的 root 帐户,并且对未使用的帐户以及密码不正确的帐户进行检查。
使用专为此目的设计的密钥存储来存储和分发机密文件。不要在你的应用程序中硬编码这些数据。
只使用预备型的 SQL 来完全防止 SQL 注入攻击。例如:如果可以使用 NPM 的话,就不要使用 npm-mysql ,要使用支持预备型语句的 npm-mysql2 。
确保你的软件的所有组件在推送到生产环境之前都进行过漏洞扫描。这里意思是 O/S,库以及包级别的漏洞都要扫描。这种工作应该使其在CI-CD过程中自动化。
对于开发环境系统安全性的警惕程序应该等同于生产系统。安全方面的考虑,要在安全且隔离的开发系统中构建软件。
要确保使用了适当的加密(如bcrypt)对所有密码进行了散列处理。不要自己实现加密算法,而且要用相对较好的随机数据来初始化加密程序。
使用经过验证的最佳实践来实现登录、忘记密码以及其他诸如密码重置这样的组件。不要自己来重复造轮子——因为很难保证其在所有的场景中都不会出现问题。
使用简单但是足够使用的密码规则来引导和鼓励用户使用随机的长密码。
为你提供的所有服务的登录功能都加上多因素身份验证机制。
确保针对你所开放的 API 的 DOS 攻击不会对你的网站造成太大的负面影响。至少要在较慢的 API 路径以及像登录和生成令牌这样的跟身份验证相关的 API 路由上设置限速器。 可以考虑为前端 API 加上 CAPTCHA(图形验证码)来保护后端服务免受 DOS 攻击。
对用户提交的数据和请求的大小和结构进行比较完备的限制。
考虑通过全局缓存代理服务(如 CloudFlare)来缓解分布式拒绝服务攻击(DDOS)造成的负面影响。如果你遭遇了 DDOS 攻击就可以打开此操作或者其它类似功能,来进行 DNS 查找。
对整个网站使用 TLS ,而不仅仅是登录表单和响应。 切勿在登录表单中使用 TLS。 传统上,使用 strict-transport-security 头来强制所有请求的 HTTPS 。
Cookie 必须是 httpOnly 和 secure 的,并且限定路径和域。
使用 CSP 而不允许 unsafe-* 后门。 这是配置很痛苦,但值得。 使用 CSP 子资源完整性作为 CDN 内容。
客户端响应使用 X-Frame-Option、X-XSS-Protection 头。
使用 HSTS 响应强制仅限 TLS 访问。 将所有 HTTP 请求重定向到服务器上的 HTTPS 作为备份。
使用所有形式的 CSRF 令牌,并使用新的 SameSite Cookie 响应头,一劳永逸地修复较新的浏览器。
确定所有的服务都最小化的开放端口。尽管通过增加不确定性没有实际的保护作用,但使用非标准的端口,将会提升攻击的难度。
主机的后端数据库和服务放在私人的 VPC 上,那么就不能让这些 VPC 在任何公网中可见。要注意的是,当配置 AWS 的安全策略时,对等的 VPC 一不注意就会让其服务在公网中可见。
隔离的逻辑服务应该放在不同的 VPC 上,并且要提供对等的 VPC 内置的通讯服务。
确保所有服务接收的数据都只是来自于最少的那个 IP 地址的集合。
要约束出站 IP 和 端口流量,以最小化 APT 和 “通知”。
经常使用 AWS IAM 角色而不是使用 root 认证。
所有维护和开发人员,都应该使用最小化的访问权限。
根据计划,定期变更密码和访问秘钥。
确保无需停机就能进行更新升级操作,同时确保可以以完全自动化的方式快速地更新软件。
要使用 Terraform 等工具来创建所有的基础设施,而不是通过云端控制台来进行。基础设施应该被定义为“代码”,并且能够一键重建。对于在云中手动创建任何资源的行为做到零容忍 ——Terraform 可以在操作之前对你的配置进行审核。
所有的服务要使用集中性的日志记录。永远也不应该通过 SSH 来访问或者检索日志。
除了一次性诊断,不要使用 SSH 进入服务。通常如果使用了 SSH,就意味着还存在着没有自动化执行的重要任务。
不要让 AWS 服务组上的 22 端口保持永久的打开状态。如果必须要使用 SSH 的话,那就只能使用公钥身份来进行验证,而不是密码。
创建稳固的主机,而不是修补和升级长寿的服务器。 (稳固的基础设施可以更安全)
评论删除后,数据将无法恢复
评论(3)