当前位置: 首页 > 知识库问答 >
问题:

API 网关授权方和注销(性能/安全注意事项)

燕星鹏
2023-03-14

我正在使用Cognito,API Gateway和Authorers。授权方配置为缓存 5 分钟以提高性能。我觉得这是一个不错的功能。

我知道授权者是将身份验证逻辑保存在一个地方的好方法,并且应用程序可以假设用户已经获得授权。然而,我对此表示怀疑。

pentest报告建议,一旦注销,令牌就不能使用。这意味着为了安全起见,我不应该启用授权缓存?这也意味着所有经过身份验证的API都将有一个lambda授权器的开销。。。

同样从编码的角度来看,使用难以端到端测试的授权器真的是个好主意吗?我可以将lambda函数作为一个单元进行测试。但对我来说更重要的是它们附加到正确的API。目前我认为没有办法让我轻松测试这个。

另一个问题是查看代码,我不再能轻易说出需要什么授权...我必须查看应该附加哪个授权程序(例如CloudForm),然后查看lambda代码本身。

使用Authorizers有什么好处吗?或者实际上最好的做法是什么?

共有1个答案

何德寿
2023-03-14

为了安全起见,我不应该启用授权方缓存

如果您有严格的安全要求(例如,一旦令牌无效,所有请求都将失败),您将需要关闭授权者缓存。请参阅https://forums.aws.amazon.com/thread.jspa?messageID=703917的答案:

目前授权者缓存只有一个TTL,因此在您提供的场景中,API Gateway将继续为缓存TTL返回相同的缓存策略(生成200),无论令牌是否过期。您可以将缓存TTL调低到您觉得满意的级别,但这是在授权者级别设置的,而不是基于每个令牌。

我们已经在考虑更新自定义授权器功能,并且在迭代该功能时肯定会考虑您的反馈和用例。

这也意味着所有经过身份验证的 API 都将通过 Lambda 授权方的一次开销...

确实如此。然而,在实践中,我的团队在Lambda冷启动和ENI附件方面的努力远远超过了其他任何性能方面的努力,因此授权人增加的开销最终可以忽略不计。这并不意味着性能影响是不可测量的,但它最终会比将授权者代码直接放入Lambda中增加毫秒级的延迟,这在我们的应用程序中是有意义的。与此形成鲜明对比的是,Lambda冷启动通常需要30秒。

同样从编码的角度来看,使用难以端到端测试的授权器真的是个好主意吗?

在基于面向服务的体系结构构建的许多应用程序中,您将具有跨多个代码库的“端到端”方案,并且只能在已部署的环境中进行测试。此级别的测试显然很昂贵,因此您应该避免测试可能由较低级别(单元,集成等)测试涵盖的功能。但是,测试应用程序的内聚性仍然非常重要,而您需要此类测试的事实并不一定是 SOA 的巨大诋毁者。

我可以将 Lambda 函数作为一个单元进行测试。但对我来说更重要的是,它们连接到正确的API。目前我看不到任何方法可以让我轻松地测试它。

如果您正在考虑多个授权者,测试是否连接了正确的授权者的一种方法是让每个授权者向endpoint传递指纹。然后可以pingendpoint并让它们返回健康检查状态。

例如

[ HTTP Request ] -> [ API Gateway ] -> [ Authorizer 1 ] -> [ Lambda 1 ] -> [ HTTP Response ]
                                       Payload:                            Payload:
                                       user identity                       status: ok
                                       authorizer: 1                       authorizer: 1

在实践中,我的团队每个服务都有一个授权者,这使得测试此配置变得非关键(我们只需要确保应该受到保护的endpoint)。

另一个问题是。查看代码,我不再能轻易说出需要什么授权......我必须查看应该附加哪个授权器(例如CloudForm),然后是Lambda代码本身。

是的,这是真的,而且非常解耦的环境的性质很难在本地进行测试,这是我的团队在使用AWS基础设施时最大的抱怨之一。然而,我相信在处理AWS空间时,这主要是一条学习曲线。作为一个整体,开发社区对于AWS公开的许多概念仍然相对较新,例如代码或微服务等基础设施,因此与传统的整体开发相比,我们的工具和教育在这一领域缺乏。

这是适合您应用的正确解决方案吗?如果没有深入的分析,我无法告诉你这一点。在更广泛的社区中有很多双向的观点,但我想指出这篇文章,特别是对于列出的谬误:微服务 - 请不要。使用微服务是因为您已经为它们开发了一个可靠的用例,而不一定仅仅因为它们是计算机科学中最新的流行语。

使用授权者有什么好处吗?或者这方面的最佳实践是什么?

我的团队使用AuthN的授权器(通过定制的auth服务),并在单独的Lambda层处理AuthZ(通过不同的定制auth服务)。这对我们的架构非常有益,因为它允许我们将通常非常复杂的特定于对象的安全规则与简单的身份问题隔离开来。您的用例可能不同,我当然不会声称知道最佳实践。但是,我将向您介绍API网关授权器示例,以了解有关如何将此服务集成到应用程序中的更多想法。

祝你好运。

 类似资料:
  • Web 应用通常面临所有种类的安全问题,并且很难把所有事做的正确。 Flask 试图 为你解决这些事情中的一些,但你仍需要关心更多的问题。 跨站脚本攻击(XSS) 跨站脚本攻击的概念是在一个网站的上下文中注入任意的 HTML (以及附带的 JavaScript )。开发者需要正确地转义文本,使其不能包含任意 HTML 标签来避免 这种攻击。更多的信息请阅读维基百科上关于 Cross-Site Sc

  • C++ 程序员偏爱性能,所以这里是一个性能专题。 由于 Hana 运行时和编译时计算处于前沿领域,我们不仅对运行时性能感兴趣,而且对编译时性能也感兴趣。 由于这两个主题是相当不相交的,我们在下面分别对待。 注意: 当我们推送到存储库时,本节中提供的基准会自动更新。 如果您发现不能承受此处声明的结果,请开一个GitHub issue; 它可能是一个性能回归。 警告: 在写这篇文章的时候,并不是所有的

  • Security considerations (安全注意事项) Model REST APIs 隐藏REST模型的属性 CORS 防止 XSS 漏洞 Model REST APIs 默认情况, Loopback 的 Model 会创建 一套标准的HTTP端点 (增,删,改,查)操作, 在 modelName.json 的 public 属性中指定是否公开. 如果需要隐藏 模型的 REST API

  • 问题内容: 我有一个需要从我的Java程序调用的功能。我曾经将参数传递给存储的proc。我正在使用oracle瘦驱动程序(在Web逻辑服务器中根据相关的jndi条目配置)。此存储的proc没有任何OUT值。此存储的proc接受一个数字值,并根据接收到的值在db中进行很多更新。 我得到一个连接对象,然后在循环中调用此存储的proc(20次传递20个数字)。当我直接从oracle客户端调用此存储的pr

  • 本文向大家介绍浅谈php(codeigniter)安全性注意事项,包括了浅谈php(codeigniter)安全性注意事项的使用技巧和注意事项,需要的朋友参考一下 1、httponly session一定要用httponly的否则可能被xxs攻击,利用js获取cookie的session_id。 要用框架的ci_session,更长的位数,httponly,这些默认都配好了。 不要用原生的phps

  • 我正在试图理解一些Spring Security代码。我也是Spring Security的新手,我想我在这里遗漏了一些基本的东西。 谢谢,雷。