用户身份的基本安全清单
构建用户身份是任何应用的关键组成部分。验证用户名和密码可能看起来是最简单的方法,但还有许多其他方面需要考虑。
##介绍
构建用户身份是任何应用的关键组成部分。它使你能够提供个性化的体验,提高数据质量,提升用户留存。
虽然验证用户名和密码可能看起来是最简单的方法,但还有许多其他方面需要考虑。让我们开始吧!
##基础设施
###执行 HTTPS
让我们从基础开始,HTTPS(超文本传输协议安全)总是用于加密网络上的数据传输。HTTPS 确保用户设备与服务器之间交换的数据保密并防止被篡改。
设置 HTTPS 可能看起来挑战性很大,但是有很多工具和服务可供你使用:
- 如果你自己托管,让我们的加密提供免费的 SSL/TLS 证书,可以用来为你的网站开启 HTTPS。
- 如果你使用云服务商,如 AWS、Azure 或 Google Cloud,可以利用他们的托管服务来设置 HTTPS。
###不允许公共数据库访问,仅限于信任的来源
尽管这一点也看上去很基本,但由于公开数据库导致了很多安全问题,所以这里也有必要提一下。
记住,永远不要允许公开访问你的数据库。将数据库放在私有网络中,并只允许来自受信任源的访问。
###安全地管理私密令牌
私密令牌(如访问令牌或 API 密钥)常用于程序化身份验证和授权。要安全地管理这些令牌:
- 使用短期生命周期的令牌和刷新令牌,以最小化未授权访问的风险。
- 使用安全的令牌存储机制,如密钥保险库,来保护令牌免受未授权访问。
- 定期更换令牌,以防止被泄露。某些协议,如 OAuth 2.0,提供了令牌更换的机制。
- 在安全被侵犯的情况下,保持对令牌撤销 的控制。
###明智地选择密码哈希算法
如果你有密码哈希的经验,可能知道有很多可用的算法,其中一些如 MD5、SHA-1、和 SHA-2 已不再被认为是安全的。
他们不安全的常见原因有:
- 它们并未为密码哈希而特别设计,其计算速度过快,使得暴力攻击更易进行。
- 它们缺乏对盐的使用,这使得为它们创建 彩虹表变得更容易。
- 它们容易受到碰撞攻击,让攻击者可以用相同的哈希值生成不同的密码。
行业标准的密码哈希算法,如 bcrypt 和 Argon2,已经被设计出来解决这些问题。由于此文篇幅所限,我们不再详述。请参考 密码哈希的演变 以了解更多。
###了解并严格遵守开放标准
像 OAuth 2.0 和 OpenID Connect (OIDC) 这样的开放标准提供了安全且标准化的用户身份验证和授权方式。它们已经被广泛采用,并经过了实战检验。
但是,如果实现不正确,即使是有经验的大团队也会出现安全漏洞。近期的一个例子就是 在 Expo 中发现的 OAuth 漏洞,Expo 是一个流行的用于构建移动应用的框架。这个例子清楚地说明了一个小的错误会如何导致一个安全漏洞。
###对静态数据进行加密
处于静态状态的数据,例如保存的用户信息或数据库备份,应使用强加密算法进行加密。这确保即使数据被泄露,没有解密密钥也无法读取。检查你的云服务商是否支持这个功能,因为这通常需要符合规 定。
###建立防火墙
DDoS (分布式拒绝服务) 攻击虽然历史悠久,但依然构成一个重大威胁。根据Cloudflare 2022 年第四季度的 DDoS 威胁报告,HTTP 的 DDoS 攻击流量同比上升了 79%。建立管理好的防火墙并使用通知器来应对这个风险,比自己构建解决方案更好。
##应用和客户端
###提高公共客户端的安全级别
公共客户端,比如移动应用或单页应用,更容易受到安全漏洞的威胁。即使你提供了公共客户端,在你的安全模型中你也应把它们作为不可信的来源。比如:
- 如果你使用的是 OAuth 2.0,使用 Code 提交的证明密钥 (PKCE) 来防止授权代码的截获攻击。
- 实行 内容安全策略 (CSP) 来抵抗某些类型的攻击,包括 跨站脚本 (XSS) 和数据注入攻击。
###绝对不要信任公共输入数据
用户输入可能是一个重大的被忽视的安全隐患。一些常见的被忽视的漏洞类型有 跨站脚本 (XSS) 和 SQL 注入。确保在使用所有用户输入数据前进行验证和清洗。
###跟踪行为
维护用户活动的审计轨迹有助于检测和调查安全事件。记录并监视用户行为,例如登录尝试,密码变更,或敏感操作。分析这些日志可以提供对潜在安全漏洞或可疑行为的宝贵见解。
###实施坚固的身份验证
实施强身份验证机制来确认用户的身份。正如前面提到的,考虑使用安全的协议如 OAuth 2.0 或 OpenID Connect 进 行身份验证。关于更多信息,你可以参考 CIAM 101:身份验证,身份,单一登录。
###建立坚固的授权(例如,实施基于角色的访问控制)
除身份验证外,应有适当的授权机制。实施基于角色的访问控制 (RBAC) 以确保用户只能访问他们被授权进行的资源和行为。关于更多信息,你可以参考 CIAM 102: 授权 &基于角色的访问控制。
###实施多因素认证 (MFA)
多因素认证 (MFA) 通过要求用户提供一项或多项认证信息,例如密码和发送到他们的移动设备上的一次性代码,增加了安全的额外层级。另一个 MFA 的好例子是 GitHub 在进行如删除仓库这样的敏感操作时,会要求用户输入一个从他们移动应用上得到的、显示在网页上的一次性代码。
然而,对于大多数初创公司,尤其是你没有现成解决方案的情况下,有一个 MFA 可能并不是必要的。它可能过于繁琐并且会对你的用户体验产生负面影响。
##文化
上述的建议主要涵盖了"被动" 的安全措施,也就是在安全事件发生之前就已知的安全措施。然而,你也可以采取"主动" 的安全措施来改善你的整体安全情况,这些在长期来看会更有效。
###教育你的团队和用户关于网络钓鱼和社会工程学
网络钓鱼和社会工程学攻击很关键,因为它们可以使上述的许多安全措施变得无用。例如,如果用户被骗去泄露他们的密码或点击一个看起来无害但是包含了恶意软件的猫咪图片,你的密码哈希算法的强度或防火墙规则的严格性都显得无足轻重。
大多数人都觉得安全培训很无聊,通常的确是这样。所以,改变你教育你的团队和用户的方式。例如,在实际的攻击者 发送钓鱼邮件之前,你可以模拟一个钓鱼邮件,然后演示如何识别它。你甚至可以为向安全团队报告邮件提供奖励。
###建立 DevSecOps
除了手动的安全审查,你也可以实施 DevSecOps 实践来自动化安全检查。例如,你可以设置一个 CI/CD 管道来运行静态代码分析工具例如 CodeQL,并且可以自动运行使用 OWASP ZAP 这样的工具进行的渗透测试。
###接受最严格的配置,而不影响用户体验
谈到安全,始终选择不会对用户体验产生负面影响的最安全的配置。避免为了便利而短线操作或妥协安全。安全始终应该是首要考虑的。
作为一个初创公司或独立开发者,你可能会感觉你缺乏实施这些措施所需的资源。然而,有提供免费或后期入股的专业安全服务可供使用。花时间去评估并考虑使用它们。
##结论
安全是一个复杂的话题,无法在一篇文章中完全覆盖。我们希望这篇文章能帮助你或你的团队建立更强的安全意识。如果你正在构建新的应用,或许还想去瞧瞧 Logto,一个可以帮助你以最小的努力开发、管理、和保护你的产品用户身份的平台。