如何保护 REST-API 的安全?

2024-01-10

我已经设置了一个带有身份验证的 API,但我只想允许某些应用程序和网站访问它。我该怎么办?

我已经为登录的用户设置了身份验证,只能访问 API,但是,如何防止他们从任何地方登录?


在回答您的问题之前,我认为重要的是,首先我们要澄清开发人员之间的一个常见误解,即WHO and WHAT正在访问 API。

与您的 API 服务器通信的人与物之间的区别

为了更好地理解之间的差异WHOWHAT正在访问您的移动应用程序,让我们使用这张图片:

预期通信通道代表您的移动设备按您的预期使用,由合法用户使用,没有任何恶意,使用您的移动应用程序的未篡改版本,并直接与您的 API 服务器通信,而不会受到中间人攻击。

实际渠道可能代表几种不同的场景,例如具有恶意意图的合法用户可能正在使用您的移动应用程序的重新打包版本,黑客使用您的移动应用程序的正版,而中间人对其进行攻击以了解通信方式移动应用程序和 API 服务器之间的交互正在完成,以便能够自动攻击您的 API。许多其他场景也是可能的,但我们不会在这里一一列举。

我希望现在你可能已经知道为什么WHOWHAT不一样,但如果不一样,一会儿就会清楚。

The WHO是移动应用程序的用户,我们可以通过多种方式对其进行身份验证、授权和识别,例如使用 OpenID Connect 或 OAUTH2 流。

OAUTH https://en.wikipedia.org/wiki/OAuth

一般来说,OAuth 代表资源所有者向客户端提供对服务器资源的“安全委托访问”。它指定了资源所有者授权第三方访问其服务器资源而无需共享其凭据的流程。 OAuth 专为与超文本传输​​协议 (HTTP) 配合使用而设计,本质上允许授权服务器在资源所有者的批准下向第三方客户端颁发访问令牌。然后,第三方使用访问令牌来访问资源服务器托管的受保护资源。

OpenID 连接 https://openid.net/connect/

OpenID Connect 1.0 是 OAuth 2.0 协议之上的简单身份层。它允许客户端根据授权服务器执行的身份验证来验证最终用户的身份,并以可互操作和类似 REST 的方式获取有关最终​​用户的基本配置文件信息。

虽然用户身份验证可能会让您的 API 服务器知道WHO正在使用 API,它不能保证请求源自WHAT您期望的,您的移动应用程序。

现在我们需要一种方法来识别WHAT正在调用您的 API 服务器,这里事情变得比大多数开发人员想象的更加棘手。这WHAT是向 API 服务器发出请求的东西。它真的是您的移动应用程序的真实实例,还是机器人、自动化脚本或攻击者使用 Postman 等工具手动侵入您的 API 服务器?

令您惊讶的是,您最终可能会发现,它可能是您的合法用户之一,使用您的移动应用程序的重新打包版本或尝试游戏化并利用您的服务的自动化脚本。

那么,要识别WHAT,开发人员倾向于使用 API 密钥,通常他们将其硬编码在移动应用程序的代码中。一些开发人员付出了额外的努力,在移动应用程序的运行时计算密钥,因此它成为运行时秘密,而不是当静态秘密嵌入到代码中时的前一种方法。

以上内容摘自我写的一篇文章,题为为什么您的移动应用程序需要 API 密钥?,并且您可以完整阅读here https://blog.approov.io/why-does-your-mobile-app-need-an-api-key,这是有关 API 密钥的系列文章中的第一篇文章。

你的问题

我已经为登录的用户设置了身份验证,只能访问 API,但是,如何防止他们从任何地方登录?

If by logging in from anywhere你的意思是任何物理位置,那么你可以使用@hanshenrik建议的IP地址阻止,但如果你的意思是阻止其他应用程序的日志记录,那不是你为其颁发API密钥的应用程序,那么你有一个非常你手中的难题需要解决,这就引出了你的第一个问题:

我已经设置了一个带有身份验证的 API,但我只想允许某些应用程序和网站访问它。我该怎么办?

这将取决于是否WHAT访问 API 的是 Web 或移动应用程序。

Web应用程序

在网络应用程序中,我们只需要使用浏览器开发工具检查源代码,或者右键单击查看页面源代码并搜索 API 密钥,然后在任何工具中使用它,例如 Postman 或我们想要的任何类型的自动化,只需复制我们在浏览器的网络选项卡中看到的调用即可。

对于为 Web 应用程序提供服务的 API,您可以使用多层密集层,从验证码 V3 https://www.google.com/recaptcha/intro/v3.html, 其次是网络应用防火墙 https://en.wikipedia.org/wiki/Web_application_firewall(WAF)最后,如果你能负担得起用户行为分析 https://en.wikipedia.org/wiki/User_behavior_analytics(UBA)解决方案。

Google 验证码 V3 https://www.google.com/recaptcha/intro/v3.html:

reCAPTCHA 是一项免费服务,可保护您的网站免受垃圾邮件和滥用行为的侵害。 reCAPTCHA 使用先进的风险分析引擎和自适应挑战来防止自动化软件参与您网站上的滥用活动。它可以做到这一点,同时让您的有效用户轻松通过。

...帮助您检测网站上的滥用流量,而不会造成任何用户摩擦。它会根据与您网站的交互返回一个分数,并为您提供更大的灵活性来采取适当的操作。

WAF - Web应用程序防火墙 https://en.wikipedia.org/wiki/Web_application_firewall:

Web 应用程序防火墙(或 WAF)过滤、监视和阻止进出 Web 应用程序的 HTTP 流量。 WAF 与常规防火墙的区别在于,WAF 能够过滤特定 Web 应用程序的内容,而常规防火墙则充当服务器之间的安全门。通过检查 HTTP 流量,它可以防止源自 Web 应用程序安全缺陷的攻击,例如 SQL 注入、跨站点脚本 (XSS)、文件包含和安全错误配置。

UBA-用户行为分析 https://en.wikipedia.org/wiki/User_behavior_analytics:

Gartner 定义的用户行为分析 (UBA) 是一个关于检测内部威胁、针对性攻击和金融欺诈的网络安全流程。 UBA 解决方案着眼于人类行为模式,然后应用算法和统计分析从这些模式中检测有意义的异常,即表明潜在威胁的异常。 UBA 不跟踪设备或安全事件,而是跟踪系统的用户。 Apache Hadoop 等大数据平台正在增强 UBA 功能,允许它们分析 PB 级数据以检测内部威胁和高级持续威胁。

所有这些解决方案都基于负面识别模型,换句话说,它们尽力通过识别来区分好坏WHAT是坏的,不是WHAT是好的,因此尽管其中一些使用了机器学习和人工智能等先进技术,但它们很容易出现误报。

因此,您可能会发现自己经常不得不放松阻止对 API 服务器的访问的方式,以免影响好用户。这也意味着该解决方案需要持续监控,以验证误报不会阻止合法用户,同时正确阻止未经授权的用户。

移动应用程序

来自您对评论的回复:

那么移动应用程序呢?

有些人可能认为,一旦移动应用程序以二进制格式发布,其 API 密钥就会安全,但事实证明并非如此,从二进制文件中提取它有时几乎与从 Web 应用程序中提取它一样简单。

通过大量的开源工具,例如移动安全框架 (MobSF)、Frida、XPosed、MitmProxy 等,可以轻松对移动应用程序进行逆向工程,但正如您在本文 https://blog.approov.io/how-to-extract-an-api-key-from-a-mobile-app-with-static-binary-analysis,可以使用 MobSF 或使用strings安装在普通 Linux 发行版中的实用程序。

移动安全框架 https://github.com/MobSF/Mobile-Security-Framework-MobSF

移动安全框架是一种自动化、一体式移动应用程序 (Android/iOS/Windows) 笔测试框架,能够执行静态分析、动态分析、恶意软件分析和 Web API 测试。

Frida https://www.frida.re/

将您自己的脚本注入黑盒进程。挂钩任何函数、监视加密 API 或跟踪私有应用程序代码,无需源代码。编辑,点击保存,然后立即看到结果。全部无需编译步骤或程序重新启动。

xPosed https://repo.xposed.info/module/de.robv.android.xposed.installer

Xpose 是一个模块框架,可以在不接触任何 APK 的情况下更改系统和应用程序的行为。这很好,因为这意味着模块可以适用于不同的版本,甚至无需任何更改的 ROM(只要原始代码没有更改太多)。它也很容易撤消。

中间人代理 https://github.com/mitmproxy/mitmproxy/

为渗透测试人员和软件开发人员提供的交互式、支持 TLS 的拦截 HTTP 代理。

对于为移动应用程序提供服务的 API,可以通过使用移动应用程序证明解决方案来使用积极的识别模型,该解决方案向 API 服务器保证WHAT使请求可以被信任,而不存在误报的可能性。

移动应用程序认证

移动应用程序证明服务的作用是在运行时保证您的移动应用程序未被篡改或未在获得 root 权限的设备中运行,方法是在后台运行 SDK,该 SDK 将与云中运行的服务进行通信以证明您的移动应用程序的安全性。移动应用程序和设备运行的完整性。

成功证明移动应用程序完整性后,会发出一个短暂的 JWT 令牌,并使用只有 API 服务器和云中的移动应用程序证明服务知道的秘密进行签名。如果移动应用程序认证失败,JWT 令牌将使用 API 服务器不知道的秘密进行签名。

现在,应用程序必须在每次 API 调用时发送请求标头中的 JWT 令牌。这将允许 API 服务器仅在可以验证 JWT 令牌中的签名和过期时间时才服务请求,并在验证失败时拒绝请求。

一旦移动应用程序不知道移动应用程序证明服务使用的秘密,就不可能在运行时对其进行逆向工程,即使应用程序被篡改、在 root 设备中运行或通过正在使用的连接进行通信也是如此。中间人攻击的目标。

移动应用程序认证服务已作为 SAAS 解决方案存在,位于Approov https://www.approov.io/approov-in-detail.html(我在这里工作)为多个平台提供 SDK,包括 iOS、Android、React Native 等。集成还需要对 API 服务器代码进行少量检查,以验证云服务颁发的 JWT 令牌。此检查对于 API 服务器能够决定服务哪些请求以及拒绝哪些请求是必要的。

结论

最后,必须根据您要保护的内容的价值以及该类型数据的法律要求(例如欧洲的 GDPR 法规)来选择用于保护 API 服务器的解决方案。

因此,使用 API 密钥可能听起来像是锁上家门并将钥匙留在垫子下,但不使用它们就像将车停在门关闭的情况下,但将钥匙放在点火开关中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何保护 REST-API 的安全? 的相关文章

  • “WSGIRequest”对象没有属性“successful_authenticator”

    我已经创建了一个像这样的身份验证类 RESTful API 的令牌身份验证 是否应该定期更改令牌 https stackoverflow com questions 14567586 token authentication for res
  • PHP - hash_pbkdf2 函数

    我正在尝试使用此 php 函数执行一个函数来哈希密码 http be php net manual en function hash pbkdf2 php http be php net manual en function hash pb
  • 限制对记录的访问。基于声明的权限是个好主意吗

    在 net 基于声明的身份框架中 如果我想限制用户对某个帐户 特定帐户 123456 执行操作 查看或编辑 我说的是商业实体 例如银行帐户 创建索赔是个好主意吗对于他们可以查看或编辑的每个帐户 一组中有很多索赔有什么缺点吗 系统管理员可能有
  • 保护 ASP.NET 网站中 Elmah RSS 源的安全

    我遵循了这个问题的答案在 ASP NET 网站中保护 Elmah 的安全 https stackoverflow com questions 1245364 securing elmah in asp net website限制对 elma
  • 检查字符串是否是哈希值

    我正在使用 SHA 512 来散列我的密码 当然还有盐 我认为我想要的不可能 但无论如何我们还是要问一下 有没有办法检查字符串是否已经是 SHA 512 或其他算法 哈希值 当用户登录时 我想检查他的密码 如果它仍然是纯文本 则应将其转换为
  • Spring OAuth2 - JWT 令牌在服务器上工作但不在本地主机上工作?

    我看到了myapp能够在服务器上正确处理 OAuth2 JWT 令牌 但在本地主机上给出令牌转换错误 我的流程如下 在服务器上 the myapp就在我们的后面custom api gateway 获取访问令牌 通过邮递员 我点击了 api
  • iOS SecItemCopyMatching RSA 公钥格式?

    我正在尝试从已生成的密钥对 两个SecKeyRefs 以便通过线路发送 我所需要的只是一个简单的 modulus exponent 对 它应该正好占用 131 个字节 模数为 128 指数为 3 但是 当我获取关键信息时NSData对象 我
  • 何时从容器管理的安全性转向 Apache Shiro、Spring Security 等替代方案?

    我正在尝试保护使用 JSF2 0 构建的应用程序的安全 我很困惑人们什么时候会选择使用 Shiro Spring Security 或 owasp 的 esapi 等安全替代方案 而放弃容器管理的安全性 看过一些相关问题 https sta
  • HTTP 基本身份验证 + 访问令牌?

    我正在开发一个 REST API 计划将其与 Web 和 IOS 应用程序一起使用 我打算让这个 API 在一段时间内保持私有 私有意味着我只希望我的 Web 应用程序和 ios 应用程序访问该 API 我已经阅读了许多不同的身份验证方法
  • Flex 和 crossdomain.xml

    我想知道将 crossdomain xml 添加到应用程序服务器的根目录是否存在任何安全问题 它可以添加到服务器的任何其他部分吗 您是否知道任何不需要服务器放置此文件的解决方法 谢谢 达米安 通过添加 crossdomain xml 主要的
  • Java中如何确保String对象被销毁?

    我公司的一名员工需要通过我编写的程序修改 SQL Server 数据库中的数据 该程序首先使用 Windows 身份验证 我要求 DBA 授予该特定用户对所述数据库的写入权限 他们不愿意这样做 而是授予了写权限myWindows 用户帐户
  • 还记得我的 Cookie 最佳实践吗?

    我读到了许多关于这个论点的老问题 我认为最好的做法是设置一个 cookieusername user id和一个随机令牌 相同 cookie 的数据在 cookie 创建时存储在数据库中 当用户拥有 cookie 时 它 们会进行比较 co
  • 如何防止客户修改 firebase 数据(在没有后端的 Web 应用程序中)?

    我最近开始探索 firebase 作为我的 Angular JS 单页网站的身份验证解决方案 它看起来很完美 然而 从安全角度来看 我不太确定是否将逻辑保留在我的应用程序中的客户端 假设我对在我的网站上注册的客户进行了 isProfileC
  • Delphi 应用程序被 Google Chrome 视为“危险”

    我经常用Delphi 2009制作数学软件 并将其发布在我的网站上 然而 去年左右 Google Chrome 开始认为我的一小部分 但数量不断增加 EXE 是 有害的 并且 Google Chrome 拒绝下载它们 例如 今天我编写了一个
  • 从 Delphi 访问 TRAKT API - 承载身份验证问题

    使用 TOauth2Authenticator TRESTClient TRESTRequest TRESTResponseDataSet TRESTResponse TFDmemtable 和 TDataSource 我成功连接到 Tra
  • Bower 安装 self_signed_cert_in_chain

    我正在 Windows 中使用 git bash 构建一个角度应用程序 到目前为止 我已经能够使用 yo 搭建脚手架 没有问题 但是当我尝试发出以下命令时 有人可以指出我来解决这个问题吗 Bower 安装 Angular Bootstrap
  • 上下文切换到安全模式(arm trustzone)的成本是多少

    我试图了解在arm中可信 安全 和非安全模式之间来回切换的成本 从非安全世界转移到安全世界时到底需要发生什么 我知道需要设置 ns 位 基于某些特殊指令 需要刷新和更新页表 刷新和更新处理器缓存 还有什么需要发生的吗 处理器缓存 它们是分段
  • 当SESSION_COOKIE_SECURE = True时如何在HTTP中获取一些用户身份信息

    以下是我正在开发的网站的简短描述 公共页面可以通过 HTTP 或 HTTPS 访问 其他一些页面 认证页面 账户详情页面等 需要通过HTTPS访问 Apache2 负责进行相关的 HTTP 到 HTTPS 链接重定向 我使用标准 Djang
  • 在 React 应用程序中使用 API 密钥

    我有一个使用两个第三方服务的 React 应用程序 该应用程序已开始使用react create app 这两项服务都需要 API 密钥 通过脚本标签提供一个密钥 如下所示 另一个 API 密钥在请求中使用 我将实际密钥存储在常量中并使用它
  • 在 JAX-WS 中使用安全性的最佳实践是什么

    这是场景 我有一些需要保护的 Web 服务 JAX WS 目前 为了身份验证需求 我提供了额外的 SecurityWService 它为授权用户提供了一些需要在请求其他服务时描述的 userid 和 sessionid 使用一些java安全

随机推荐