OAuth2.0 的一些安全考虑

在这篇文章中,我们会谈论一下安全方面的最佳实践以及一些常见的攻击方式。

安全方面的最佳实践

安全是一场永无止尽的战斗。 有许多方法可以利用给定的应用程序。 作为工程师,我们的工作是尽量减少攻击者的攻击向量。 我们永远不能覆盖所有的洞,但仍然是我们的责任。 以下是非穷尽的安全最佳做法列表,可帮助您的应用程序尽可能安全

使用TLS

当您的客户端应用程序与服务提供商交谈时,它通过与其授权和令牌端点进行交互来实现。 您必须确保他们使用TLS,以便与他们的通信是安全和加密的。
OAuth 2.0规范实际上要求服务提供商使用TLS。但是,客户端应用程序使用TLS是可选的。 由于增加了客户端开发人员实施(购买和安装SSL证书)所需的复杂性,这一决定是为了减少开发人员创建OAuth 2.0兼容客户端应用程序的障碍。 这是可用性决定,而不是安全性决定。因此,许多应用程序开发人员在开发的某些部分将无TLS运行。 但是当切换到生产环境时,应该使用TLS。

请求最小的范围

确保您只要求您的应用程序需要的资源的权限

当使用implicit grant flow的时候,只请求只读权限

使用隐试授权流程的client被认为是不可信任的,因为他们没有后端服务器和服务端的服务器进行安全交互,因此当服务端向客户端发送access token的时候,只能追加在url中,因此这个access token对于用户或者任何可以访问用户代理的人来说都是可见的,而且这个值也可能会缓存在浏览器的历史记录中。

将凭据和令牌保留在用户无法接触的位置

您的应用程序的客户端凭据和接收到的令牌是敏感属性。 您必须尽可能保持安全,确保不将其暴露给用户。 假设,如果用户可以看到它们,攻击者也可以。 如果攻击者可以掌握应用程序的客户端凭据,则可以模拟客户端。 如果攻击者可以抓住用户授予的访问令牌,则可以模拟该用户。 最好把它们完全放在用户的无法接触的位置。 这最好通过使用后端服务器来存储和传输这些值,从不将它们暴露给客户端。

尽可能使用authorization code grant flow

尽可能的使用授权代码授权,因为它比隐试授权更加的安全。

尽可能的使用刷新token

从安全的角度以及可用性的观点来看,应该尽可能的使用刷新token:

  • 在安全性方面,用户必须进行身份验证的次数越少意味着用户必须在互联网上发送用户名和密码的次数越少。 这也意味着攻击者窃取他们的机会较少。
  • 从可用性的角度来看,这意味着您的应用程序可以运行更长的时间,而无需要求用户重新登录。

尽可能的使用本机浏览器而不是内嵌的浏览器

使用本机系统浏览器最重要的原因是您可以利用chrome来显示与目标服务提供商的授权端点相关的安全信息。例如,本地浏览器通常会对具有无效或过期证书的站点显示警告,而嵌入式浏览器通常不会。这使得网络钓鱼攻击更加容易。

不要在重定向端点中使用第三方脚本

构建重定向端点时,请确保不包括任何第三方或外部加载的脚本。 这些脚本可以访问您的重定向URI及其包含的凭据。 这些脚本可能会受到影响,如果外部加载,可能会泄漏您的访问令牌或授权代码给攻击者。理想情况下,您的重定向端点将包含仅在将用户代理重定向到另一个页面之前提取和删除凭据的逻辑,而不会暴露凭据。

定期更换你的客户端凭证

就像您应该为自己的个人密码一样,您应该轮换您的客户端凭据。 这可以最大程度地减少攻击者可用的攻击向量,因为如果您经常轮询您的凭证,则如果泄密,他们将有更多的时间利用它们。一个好的做法是在每个版本(或主要版本,根据您的安全要求和开发周期)轮换这些凭据。

常见的攻击手段

Cross-site request forgery (CSRF)

Cross-site request forgery也称为跨站点请求伪造,如果你不是很清楚CSRF的相关事情的话,那么推荐这篇文章:浅谈CSRF攻击方式
解决办法一般都是通过增加随机数来解决的,比如在Github OAuth文档我们就可以看到,在请求GET https://github.com/login/oauth/authorize接口的时候有一个state参数:

An unguessable random string. It is used to protect against cross-site request forgery attacks.

网络钓鱼(Phishing)

网络钓鱼(Phishing)是指仿冒现有的合法网页,以蒙骗用户提供个人资料、财务帐号和口令。
一般情况下防范钓鱼网站,可以在授权页面清晰提示不需要用户输入什么信息,可能会有哪些影响,其次,尽可能的使用系统本身的浏览器,而不是使用内嵌的浏览器。因为现代系统浏览器对于正规网站,都会在地址栏有提示的。

参考资料

本文版权归作者所有,禁止一切形式的转载,复制等操作
赞赏

微信赞赏支付宝赞赏

发表评论

电子邮件地址不会被公开。 必填项已用*标注