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?
API 创新不会触发 AWS API Gateway 的基于自定义请求的 lambda 授权方
如何从 AWS API Gateway 自定义授权方检索 Spring Boot 中的上下文对象?