Authentication AWS API网关自定义授权器有用吗?

Authentication AWS API网关自定义授权器有用吗?,authentication,authorization,aws-lambda,aws-api-gateway,Authentication,Authorization,Aws Lambda,Aws Api Gateway,我希望为AWS Lambda/zappa使用一些“无服务器api服务器”,它使用自定义api网关授权程序进行用户身份验证。在无服务器AWS lambda服务中,使用自定义授权程序而不是直接在代码控制器中检查已发布的JWT令牌是否具有相当大的安全性或成本效益?对我来说,检查代码可能更方便 更新 我选择了预请求钩子,但是有头级授权器,它更容易用于CORS,但我相信zappa不支持它。另外,通过swagger upload为选项设置模拟API也是可能的,如果成功,将进行更新。严格来说,我不认为有安全性

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

更新
我选择了预请求钩子,但是有头级授权器,它更容易用于CORS,但我相信zappa不支持它。另外,通过swagger upload为选项设置模拟API也是可能的,如果成功,将进行更新。

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

从它为您的授权逻辑提供了一个新的框架并允许您实现的角度来看,可以说它增强了应用程序的安全性


这就是说,如果您的整个API由一个Lambda函数组成,那么其好处就有点可疑了。我认为,当您的API具有许多Lambda函数时,或者当您的API网关位于传统HTTP服务器前面时,API网关自定义授权程序确实会变得非常有用。

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

从它为您的授权逻辑提供了一个新的框架并允许您实现的角度来看,可以说它增强了应用程序的安全性


这就是说,如果您的整个API由一个Lambda函数组成,那么其好处就有点可疑了。我认为当您的API有许多Lambda函数时,或者当您的API网关位于传统HTTP服务器前时,API网关自定义授权程序确实会变得非常有用。

@Mark B的观点非常好,我当然不会对他的回答提出任何异议。尽管如此,我还是愿意为这次对话做出贡献

更专门为您量身定制的答案可能取决于JWT来自何处,以及它们是如何获得、使用和更新的。在以下情况下,使用自定义授权人可能有意义:

用例1

如果您希望在几种不同的授权风格之后保护单个Lambda,则自定义授权器可能非常有用。例如,您可以创建三个不同的API网关端点,每个端点调用相同的Lambda,但使用不同的授权器。这与马克关于干旱好处的观点相吻合

用例2

自定义授权人使您能够在授权人代码中内联生成IAM权限。您可以构建任意权限集,而不是将预先存在的IAM角色分配给调用方。请注意,如果您不知何故使用(不可信)用户输入来分配IAM权限,那么这很容易成为讨厌的攻击向量。 用例3

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

这些值可以特定于Lambda函数。虽然您当然可以对后端lambda采用这种方法,但使用授权人有以下好处:

我喜欢尽可能严格地限制这些秘密的范围。通过使用授权人,我的应用程序可以保持对这些秘密一无所知的状态。这与马克关于关注点分离的观点相联系

IAM和最低特权

我希望我的后端代码永远不会被未经授权的方调用。出于这个原因,我几乎在我创建的每个API网关资源上都使用某种类型的授权器。我使用过自定义授权程序,但它们是我最后的选择。我大部分时间依靠IAM授权,使用Cognito用代币换取临时IAM凭证

如果在后端lambda中执行授权,而不是在授权者中执行授权,那么在定义后端lambda周围的IAM控件时,就不能限制性太强。这违反了法律。这不仅仅是代码组织和应用程序架构的问题;这是一个合理的安全问题。你实际上暴露了比你必须暴露的更多的攻击面


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

@Mark B提出了很好的观点,我当然不反对他的回答中的任何内容。尽管如此,我还是愿意为这次对话做出贡献

更专门为您量身定制的答案可能取决于JWT来自何处,以及它们是如何获得、使用和更新的。在以下情况下,使用自定义授权人可能有意义:

用例1

如果您希望在多个不同的文件后面保护单个Lambda,则自定义授权程序可能非常有用