繁体   English   中英

AWS API Gateway定制授权者有用吗?

[英]Is AWS API Gateway custom authorizer useful?

我希望为AWS Lambda / zappa使用一些“无服务器api服务器”,该服务器使用自定义API网关授权方进行用户身份验证。 在无服务器的AWS Lambda服务中,使用自定义授权器而不是直接在代码控制器中检查已颁发的JWT令牌是否具有可观的安全性或成本优势? 对我来说,检查代码会更方便。

更新我去了预请求挂钩,但是有标头级授权者,它对于CORS来说更容易使用,但是我相信zappa不支持它。 还可以通过招摇上传来为Options设置模拟API,如果成功则将更新。

我认为严格来讲并没有安全性或成本优势。 好处是,它是处理您的授权的单个位置,单个代码段。 这样可以避免您必须在API背后部署的每个Lambda函数中复制该授权代码。 并且它允许您更新单个功能以对授权逻辑进行任何更改。

从它为您的授权逻辑提供单一事实来源的角度来看,它允许您实现关注点分离 ,这可以说是增强了应用程序的安全性。

话虽这么说,如果您的整个API包含一个Lambda函数,那么其好处就有些可疑了。 我认为,当您的API具有许多Lambda功能或您的API网关位于传统的HTTP服务器之前时,API网关自定义授权者将真正受益。

@Mark B提出了很好的观点,我当然不会对他的回答提出任何质疑。 尽管如此,我还是想为对话做贡献。

为您量身定制的答案可能取决于JWT的来源以及如何获取,使用和刷新它们。 在以下情况下,使用自定义授权者可能很有意义:

用例1

如果要在几种不同的授权方式后面保护单个Lambda,则自定义授权者可能会很有用。 例如,您可以创建三个不同的API网关端点,每个端点都调用相同的Lambda,但使用不同的授权者。 这与Mark关于DRY好处的观点联系在一起。

用例2

定制授权者使您能够在授权者代码中内联构建IAM权限。 无需为呼叫者分配一个预先存在的IAM角色,您可以构建自己喜欢的任意权限集。 请注意,如果您以某种方式使用(不受信任的)用户输入来分配IAM权限,则这很容易成为令人讨厌的攻击手段。

用例3

Lambda非常适合隐藏秘密。 例如,您有一个前端JS应用程序,并且需要参与需要客户端ID和客户端密钥的OAuth 2.0流。 或者,您需要调用需要某种API密钥的端点。 显然,您无法将这些秘密公开给浏览器。

这些值可以加密并存储在 Lambda函数特定的环境变量中 尽管您当然可以在后端lambda上采用这种方法,但是使用授权者具有以下好处:

我喜欢能够尽可能严格地限制这些秘密的范围。 通过使用授权者,我的应用程序可以很高兴地不知道这些秘密。 这与Mark关于关注点分离的观点联系在一起。

IAM和最低权限

我更喜欢我的后端代码永远不会被未经授权的各方调用。 因此,实际上我在创建的每个API网关资源上都使用了某种类型的授权者。 我曾经使用过自定义授权者,但它们是我的最后选择。 我大部分时间都依靠IAM授权,使用Cognito将令牌交换为临时IAM凭据。

如果您在后端Lambda中而不是在授权者中执行授权,则在围绕您的后端Lambda定义IAM控制时,您将不会受到太多限制。 这违反了最低特权原则 这不仅仅是代码组织和应用程序体系结构的问题; 这是合法的安全问题。 本质上,您要暴露的攻击面要多得多。

此外,当您的后端增长时,IAM的真正威力也将熠熠生辉。 您的后端Lambda可能需要写入S3,调用其他Lambda,发布到SNS或SQS,与RDS或DynamoDB交互等。我建议“最佳实践”指示所有此访问都受严格的IAM约束。政策。 以我的经验,使用API​​网关授权者(任何类型,不一定是自定义)来分配角色是完成此任务的最直接方法。

到成本部分的问题。 授权者将为另外一个lambda呼叫和新的CPU时间分别收取100ms的最低费用。 如果后端中有许多短的lambda,这可能是一笔不小的费用,可能会使它们中的每一个的成本加倍。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM