下面的检查单将用于检查一个已经部署好的 Web 应用是否符合最佳实践。这些最佳实践包括了安全、稳定、快速、可扩展、自动化等方面。

遵守这些最佳实践可以确保你的 Web 应用是安全、稳定、长周期、满符合、优于扩展、变更自动化、节省成本的。


域名采购最佳实践

file

你需要确保黑客不能通过域名采购商的账号来获取你的域名控制权。

  • Whois 信息 是否配置了隐私保护
  • 域名采购商的账号是否配置了 2FA

IP 地址最佳实践

在这里,你需要在云计算提供商的控制台上检查你的 IP 地址是否符合最佳实践。确保 IPv6 和 IPv4 都配置了。你可以使用云计算提供商提供的防火墙来配置规则。他们的防火墙往往比你自己配置的软防火墙更加耐操。

file

  • 选购了距离你的客户距离较近的云服务商和网络供应商。
  • 配置 IPv6
  • 配置 IPv4
  • IPv6 防火墙 和 IPv4 防火墙是否配置相同的规则
  • 使用 静态 IP 地址

DNS 最佳实践

你需要避免黑客通过 DNS 劫持来获取你的域名控制权。同时也要确保你的域名配置了 CAA 记录以限制证书颁发机构。当然,你也需要确保你的域名配置了 AAAA 记录以支持 IPv6,并在不支持 IPv6 的设备上能够正常访问。

file

  • 配置 CAA 记录 以限制证书颁发机构
  • 配置 DNSSEC 以防止 DNS 劫持
  • 同时配置 A 记录和 AAAA 记录

file


云计算提供商最佳实践

虽然我们自己的服务会自己配置防火墙、备份、监控、报警等服务,但是云计算提供商也会提供这些服务。他们提供的这些服务往往比我们自己配置的服务更加耐操。当然,也别忘了确保这个账号本身是安全的。

file

  • 购买到了足够的带宽
  • 账号配置 2FA
  • 开启账单熔断和报警
  • 开启自动续费
  • 配置 VPC 以隔离网络
  • 配置云计算提供商的防火墙、自动备份、监控、报警等服务

TLS 证书

显然,你需要配置 TLS 加密来保护用户的隐私。同时,你也需要确保证书的自动续期。为了避免用户突然打不开你的网站,你需要将所有 HTTP 的请求重定向到 HTTPS。

file


TLS 最佳实践

这些可以直接通过 https://www.ssllabs.com/ 进行检查。这可以确保你的 TLS 配置是最佳的。

file


Web 服务器最佳实践

Web 服务器本身也有一些最佳实践。这些最佳实践可以确保你的 Web 服务器是高效的。

file

别忘了,为了支持 HTTP3,你可能需要去防火墙上配置一些规则,以确保 UDP 的 443 端口是开放的。


服务器网络配置最佳实践

为了确保服务器的网络安全和性能,在这里你可以检查一下服务器的网络配置是否符合最佳实践。

  • 仅仅暴露必要的端口
  • 仅仅暴露必要的服务
  • 配置 防火墙
  • 使用 bbr 或者 cubic 作为 TCP 拥塞控制算法
  • 使用 cake 或者 fq_codel 作为网络调度算法
  • 配置了 NTP 以同步时间

服务器权限配置最佳实践

为了避免服务器上本身的安全问题,你需要确保服务器的权限配置是尽可能减小权限的。你可以开启 SSH Key 对公网的 SSH 登录,但是你最好使用白名单的方式来限制可以 SSH 登录的 IP 地址。

  • 配置 SSH Key 访问
  • 配置 Fail2Ban 以防止暴力破解
  • 配置 SELinux 或者 AppArmor 以增强安全性
  • 禁用 root 用户的 SSH 登录
  • 禁用 密码登录 以及 密码登录的 root 用户
  • 以非 root 用户运行服务
  • 业务文件夹的权限是 700 或者 750
  • 业务文件的权限是 600 或者 640
  • 业务文件夹的所属用户是非 root 用户,非 nobody 用户
  • 配置包管理的自动更新,自动定期运行 apt update && apt upgrade 这样的命令
  • 确保包管理使用的映像源是安全的,这需要你检查例如 /etc/apt/sources.list 这样的文件

运维策略最佳实践

即使你的整个业务系统已经安全、稳定的上线了,你仍然需要确保在意外发生、设备故障、流量激增、黑客攻击等情况下,你能够快速的恢复业务。这需要你配置完善的监控、报警、快照、备份等能力。还需要确保你的业务是可以快速的迁移、扩展、恢复的。

  • 配置 监控
    • 确保服务器的磁盘空间是足够的,这需要监控磁盘空间,并在磁盘空间不足时进行报警
    • 确保服务器的内存是足够的,这需要监控内存,并在内存不足时进行报警
    • 确保服务器的 CPU 是足够的,这需要监控 CPU,并在 CPU 不足时进行报警
    • 监控 IO,并在 IO 异常高时进行报警
    • 监控每次登录的 IP 地址,并在异常登录时进行报警
    • 监控重启事件,并在非计划的重启时进行报警
  • 配置 报警
  • 配置 快照
  • 配置 备份,并进行了定期的演习。
  • 检查是否能够将业务快速的迁移到另一个服务器上
  • 检查是否能够将业务快速的 Scale Up,也就是升级服务器的配置
  • 检查是否能够将业务快速的 Scale Out,也就是增加服务器的数量
  • 检查在 Scale Out 后,如果有多个服务器,是否能够保持一致性,以及在单点故障后是否能够快速的恢复
  • 确保你的负载均衡能够均匀的将请求分发到不同的服务器上,并将一个用户的请求分发到同一个服务器上
  • 确保你的负载均衡在单点故障后能够快速的恢复
  • 确保你的业务在完全停机后能够通过快速的重新部署来恢复

DevOps 最佳实践

到目前为止,你的业务已经安全、稳定、快速、可扩展、满符合的运行了。但是,众所周知,需求会发生变更,你的业务也需要不断的迭代。这就需要你的开发、测试、部署、监控、运维等能力都是自动化的。你需要对任何新的业务变更进行代码检查,仅合并合规的代码到代码库。你也需要定期对代码库中的代码进行测试、编译,并将合规的成果发布到生产环境。

  • 使用 CI/CD 来自动化部署
  • 编译管道配置 静态代码检查
  • 编译管道配置 单元测试
  • 编译管道配置 集成测试
  • 编译管道需要 check-in 到代码库本身
  • 编译管道能够定期将合规的编译结果发布到生产环境

容器化最佳实践

到目前为止,你的数据中心已经非常的安全、稳定、快速、可扩展、自动化了。但是,现在是容器化的时代。如果能容器化,你的业务就可以更加灵活的部署、迁移、扩展、恢复。

file

  • 使用 Docker 来容器化你的业务
  • 编译管道能够编译出容器镜像,并对容器镜像进行集成测试
  • 使用 Kubernetes 来管理你的容器

应用开发最佳实践

上面的那么多最佳实践,其目标都是可以可靠的运行应用。但是,如果应用本身就有问题,那么这些最佳实践也是无济于事的。应用才是上面的过程的核心。尤其是扩展部分,比如你的应用本身就是单点故障,那么即使你的服务器是高可用,那业务也会发生中断。同样的,应用的体验差,每次启动需要加载 10s,那么即使你的服务器是高性能,最佳实践拉满,各种压缩、缓存、加速都配置了,用户也会因为体验差而离开。

file

  • 开发框架是否是最新的
  • 使用的包是否存在无意义的依赖
  • 使用的包是否是最新的
  • 是否编写了单元测试,并且确保其覆盖率至少 90%
  • 是否编写了集成测试,以确保应用真的可以正常在测试环境完成核心功能
  • 是否使用了流行的语法规则检查器(lint),并确保不符合语法风格的代码无法签入
  • 代码是否存在 内存泄漏
  • 代码是否存在 死锁
  • 代码是否存在 并发问题
  • 代码是否存在 XSS 攻击
  • 代码是否存在 CSRF 攻击
  • 代码是否存在 SQL 注入 攻击
  • 代码是否存在 DDoS 攻击的风险
  • 代码是否存在 放大攻击 的风险
  • 代码是否存在 缓存击穿 问题
  • 代码是否存在 缓存雪崩 问题

这需要反复、定期的进行代码 Review。


应用体验最佳实践

在这里,你需要确保你的应用是符合用户体验的。这些最佳实践包括了页面加载速度、页面交互速度、页面布局、页面主题等。

file

  • 应用是否能够在用户开启了黑色主题的情况下正常显示
  • 应用是否能够在用户开启了大字体的情况下正常显示
  • 应用是否能够在用户开启了无图模式的情况下正常显示
  • 应用是否能够在用户处于不同时区的情况下正常显示为事件发生的当地时间
  • 应用是否能够在用户处于不同语言的情况下正常显示为用户的语言
  • 应用是否能够在移动设备、平板设备、桌面设备上正常响应式布局
  • 应用是否能够在网络不好的情况下,以可以忍受的速度加载

应用可以支持的协议

  • 是否支持了 PWA 以方便用户安装到桌面
  • 是否支持了 Opensearch 来搜索应用内的内容

合规性最佳实践

在这里,你需要确保你的业务是符合各种合规性的。这些合规性包括了 GPL、GDPR、CCPA、HIPAA、PCI DSS、SOX、FISMA、FIPS、NIST 等。

  • 如果代码是基于 GPL 协议的衍生作品,代码本身是否被赋予了 GPL 协议
  • 代码是否可能产生违反 GDPR 的行为
  • 代码是否可能产生违反 CCPA 的行为
  • 代码是否可能产生违反 HIPAA 的行为
  • 代码是否可能产生违反 PCI DSS 的行为
  • 代码是否可能产生违反 SOX 的行为
  • 代码是否可能产生违反 FISMA 的行为
  • 代码是否可能产生违反 FIPS 的行为
  • 代码是否可能产生违反 NIST 的行为
  • 代码是否可能产生违反中国的 个人信息保护法,网络安全法,数据安全法的行为。