AWS API Gateway 自定义授权方有用吗?

Posted

技术标签:

【中文标题】AWS API Gateway 自定义授权方有用吗?【英文标题】:Is AWS API Gateway custom authorizer useful? 【发布时间】:2018-04-17 07:27:26 【问题描述】:

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

更新 我选择了预请求挂钩,但是有标头级别的授权器,它更容易用于 CORS,但我相信 zappa 不支持它。还可以通过 swagger 上传为 Options 设置模拟 API,如果成功将更新。

【问题讨论】:

【参考方案1】:

我认为严格来说没有安全或成本优势。好处是它是一个地方,一段代码,可以处理您的授权。它使您不必在您在 API 后面部署的每个 Lambda 函数中复制该授权代码。它允许您更新单个函数以对您的授权逻辑进行任何更改。

从它为你的授权逻辑提供single source of truth的角度来看,它允许你实现separation of concerns,可以说是增强了你的应用程序的安全性。

话虽如此,如果您的整个 API 由单个 Lambda 函数组成,那么好处就有点可疑了。我认为当您的 API 具有许多 Lambda 函数或当您的 API Gateway 位于传统 HTTP 服务器前面时,API Gateway Custom Authorizers 真的很有用。

【讨论】:

好点,但许多框架,如 flask 和 falcon 允许预请求挂钩以保持代码干燥【参考方案2】:

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

更具体地为您量身定制的答案可能取决于 JWT 的来源,以及它们是如何被获取、使用和更新的。在以下情况下使用自定义授权方可能有意义:

用例 1

如果您想保护单个 Lambda 支持多种不同的授权方式,自定义授权方会很有用。例如,您可以创建三个不同的 API Gateway 终端节点,每个终端节点调用相同的 Lambda,但使用不同的授权方。这与 Mark 关于 DRY 好处的观点有关。

用例 2

自定义授权方使您能够在授权方代码中内联构建 IAM 权限。您可以构建任何您喜欢的任意权限集,而不是将预先存在的 IAM 角色分配给调用者。请注意,如果您以某种方式使用(不受信任的)用户输入来分配 IAM 权限,这很容易成为令人讨厌的攻击媒介。

用例 3

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

这些值可以是特定于 Lambda 函数的 encrypted and stored in environment variables。虽然您当然可以在后端 lambda 中采用这种方法,但使用授权器具有以下好处:

我喜欢尽可能严格地限制这些机密的范围。通过使用授权者,我的应用程序可以完全不知道这些秘密。这与 Mark 关于关注点分离的观点有关。

IAM 和最小权限

我希望我的后端代码永远不会被未经授权的各方调用。出于这个原因,我几乎在我创建的每个 API 网关资源上都使用了某种类型的授权器。我使用了 custom 授权器,但它们是我最后的手段。我大部分时间都依赖 IAM 授权,使用 Cognito 将代币交易为临时 IAM 凭证。

如果您在后端 lambda 中而不是在授权方中执行授权,则在围绕后端 lambda 定义 IAM 控制时,您不能有如此严格的限制。这违反了principle of least privilege。这不仅仅是代码组织和应用程序架构的问题;这是一个合法的安全问题。你实际上暴露了比你必须的更多的攻击面。

此外,当您的后端增长时,IAM 的真正威力就会大放异彩。您的后端 lambda 可能需要写入 S3、调用其他 Lambda、发布到 SNS 或 SQS、与 RDS 或 DynamoDB 交互等。我建议“最佳实践”规定所有这些访问都由严格的 IAM 管理政策。根据我的经验,使用 API Gateway 授权方(任何类型,不一定是自定义的)来分配角色是完成此任务的最直接方法。

【讨论】:

【参考方案3】:

到问题的成本部分。 Authorizer 将单独收取一个额外的 lambda 调用费用,并以自己的 100ms 最低费用为新的 cpu 时间。 如果后端有许多短 lambda,这可能是一笔巨大的成本,可能会使每个 lambda 的成本翻倍。

【讨论】:

以上是关于AWS API Gateway 自定义授权方有用吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 AWS API Gateway 自定义授权方配置 CORS?

AWS API Gateway 自定义授权方给予例外

API 创新不会触发 AWS API Gateway 的基于自定义请求的 lambda 授权方

如何从 AWS API Gateway 自定义授权方检索 Spring Boot 中的上下文对象?

在方法请求中使用 AWS_IAM 授权时需要 AWS Gateway 自定义授权者吗?

如何将 API Gateway 授权方上下文传递给 HTTP 集成