在受限环境中使用移动应用程序安全访问API

在受限环境中使用移动应用程序安全访问API,api,security,mobile,cloud,vpn,Api,Security,Mobile,Cloud,Vpn,在我们当前的项目中,IT规则禁止从互联网公开访问任何非PROD的内容。必须严格限制对开发和审查环境的访问。尽管如此,该项目还包括与云托管API层一起开发的移动应用程序 一般来说,使用移动应用程序保护开发/审查阶段API的常见方法是什么?我们提出了以下想法: API入口的IP白名单(最不安全,但最容易使用) 到主机环境的VPN网关,以及相应的开发/测试设备配置 相互TLS认证(最难实现和操作) 每种方法都有许多问题需要解决,但我想在深入研究任何一种方法之前先了解全局。IP白名单 API入口上的

在我们当前的项目中,IT规则禁止从互联网公开访问任何非PROD的内容。必须严格限制对开发和审查环境的访问。尽管如此,该项目还包括与云托管API层一起开发的移动应用程序

一般来说,使用移动应用程序保护开发/审查阶段API的常见方法是什么?我们提出了以下想法:

  • API入口的IP白名单(最不安全,但最容易使用)
  • 到主机环境的VPN网关,以及相应的开发/测试设备配置
  • 相互TLS认证(最难实现和操作)
每种方法都有许多问题需要解决,但我想在深入研究任何一种方法之前先了解全局。

IP白名单 API入口上的IP白名单(最不安全,但最容易使用)

我认为,如果您将非贵公司办公室专有的IP和/或贵公司专有但由贵公司的公共WI FI使用的IP列入白名单,则其安全性最低

此外,如果您需要将远程开发人员和测试人员的访问权列入白名单(可能在公共IP中,也可能不在公共IP中),此解决方案将具有风险,因为人们总是将便利置于安全之前,他们可能会要求将来自他们喜欢工作的咖啡店、购物中心、女朋友家等的IP列入白名单

所以我会放弃这个选项,除非你在一个小办公室里,你的公共WI-fi(供你的客户使用)与你的主互联网连接在不同的IP上

VPN网关 到主机环境的VPN网关,以及相应的开发/测试设备配置

这种方法似乎非常明智,只有获得VPN访问权的人才能使用隐藏在VPN背后的资源,VPN甚至可以在公共WI-fi中使用

相互TLS认证 相互TLS认证(最难实现和操作)

虽然很难实现和操作,但它们也会遇到证书固定的问题,可能会被绕过

关于移动应用程序中的固定,我们可以了解到实现证书固定是多么容易:

//简化的android示例
CertificatePaner CertificatePaner=新的CertificatePaner.Builder()
.add(“publicobject.com”,“sha256/afwiKY3RxoMmLkuRW1l7QsPZTJPwDS2pdDROQjXw8ig=”)
.add(“bikewise.org”,“sha256/x9szw6twiqfmvrz/kz10ossjmn728bnkpufqgnvm=”)
.build();
OkHttpClient=OkHttpClient.Builder()
.CertificatePaner(CertificatePaner)
.build();
在同一篇文章中,我们还可以看到钉住是一场噩梦。。。就像你说的,很难操作

钉扎的主要困难不是技术上的,而是操作上的。通过将关于服务器(证书)的固定信息嵌入到应用程序中,您可以在两者之间创建一个依赖关系,正如术语pinning所暗示的那样。这意味着,每当您(或您的ops团队)计划更改服务器上的证书时,您必须:

  • 提前生成证书
  • 使用新证书和旧证书构建、测试并发布应用程序的新版本
  • 等待大多数(80%、90%、99%)用户升级到新版本
  • 更改服务器上的证书
  • 在删除旧证书的情况下,生成、测试并发布应用程序的新版本
似乎这还不够,证书固定可以通过使用内省框架进行传递,正如我在上面链接的同一篇文章中指出的:

即使您成功地克服了实施钉扎过程中固有的操作困难,房间里仍然有一头巨大的粉红色大象正在解开钉扎。诸如Xposed之类的挂钩框架的开发已经达到了如此复杂的程度,以至于存在一个丰富的模块生态系统来针对Android应用程序的各个方面,包括HTTP库的固定功能。使用它们非常简单

另一种方法——多跑一英里 尽管如此,该项目还包括与云托管API层一起开发的移动应用程序

在移动应用程序的上下文中,您可以使用设计为移动应用程序认证的技术,该技术可在所有环境中使用,以保护移动应用程序的API服务器,使其不会响应来自您为特定环境发布、签名和注册的正版移动应用程序二进制文件的请求

移动应用认证 移动应用认证服务的作用是在运行时保证您的移动应用未被篡改或未在根设备中运行。它包括一个集成在后台运行的移动应用程序中的SDK,不会影响用户体验,并与云中运行的服务进行通信,以证明移动应用程序和设备运行的完整性

在成功认证移动应用完整性后,将发布一个短时间有效的JWT令牌,并使用一个只有API服务器和云中的移动应用认证服务知道的秘密进行签名。在移动应用程序认证失败的情况下,JWT令牌使用API服务器不知道的秘密进行签名

移动应用程序必须在请求的头中发送JWT令牌,以执行其发出的每个API调用。这允许API服务器仅在能够验证JWT令牌中的签名和过期时间时服务请求,并在验证失败时拒绝它们

任何试图在运行时验证移动应用程序认证颁发的JWT令牌是否有效的人都不会成功,因为它们之间的唯一区别是se