【问题标题】:Securing AWS API Gateway for external end users and internal systems为外部最终用户和内部系统保护 AWS API Gateway
【发布时间】:2020-04-03 09:50:42
【问题描述】:

我们在AWS API Gateway 中托管了一个 API。这需要得到保护,为此我们使用AWS Cognito User Pool 来授予对移动客户端和网络应用程序的访问权限。

我们还希望将 API 访问权限授予内部系统,在我们的例子中是 AWS Lambdas

谁能解释为外部最终用户以及内部微服务保护 API Gateway 资源的最佳方法?

感谢任何帮助。

【问题讨论】:

    标签: amazon-web-services security oauth-2.0 aws-api-gateway amazon-cognito


    【解决方案1】:

    外部用户身份验证

    为了保护 API Gateway,您可以结合 AWS Cognito + API Gateway

    1. 创建一个 AWS Cognito 池来存储和验证您的用户
    2. 创建您的 API 网关
    3. 将 API 网关与 Cognito 集成:

    转到:

    AWS 控制台 -> API Gateway -> 选择您的 API -> 授权人 -> 创建新授权人

    然后选择您的 API -> 资源 -> 对于您需要授权的每个方法,您必须将其附加到方法请求中,如下所示:

    当您使用移动应用程序时,最好在您的应用程序中实现 AWS amplify 以处理 AWS cognito 身份验证。用户登录后,您可以检索令牌并在每个 API 调用的 Authorizer 标头中使用它,以确认用户已登录并可以使用 API。

    内部微服务

    对于内部微服务,您可以仅使用 IAM 角色 并授予这些角色访问 API 网关的权限。然后将角色附加到您的 EC2 实例或 Lambda。

    如果您想使用上述解决方案(Authorizer header 使用 cognito 令牌)组合IAM 角色将不工作 直接调用API,因为它将被 cognito 授权者阻止。

    解决方法是通过 IAM 角色和用户 API 从您的内部微服务直接调用您的 lambda,仅供外部使用。 另一种方法是将 2 个 API 连接到相同的 lambda,一个用于内部使用,一个用于外部。

    另一种方法

    在我看来,在您的情况下,最干净的解决方案是不使用 cognito 授权方身份验证,而是在您的 API 中使用 AWS_IAM 作为授权方法,并在 AWS Cognito 中创建一个组,包括所有 Cognito用户到该组,并将 IAM 角色附加到该组。 通过这样做,当 cognito 用户登录时,将通过附加的 IAM 角色获取临时访问密钥,并且他可以调用您的 API。同时,当您在内部将此角色附加到您的 lambda 时,他们也可以访问您的 API。

    为了实现这种方法,您可以遵循:

    1. Control Access to an API with IAM Permissions
    2. Create cognito group and assign IAM role

    一个有趣的网址 How Amazon API Gateway Resource Policies Affect Authorization Workflow:

    【讨论】:

    • 感谢@Xanthos 的精彩解释。您能否进一步解释一下内部微服务部分。如果我们授予 lambda 访问权限以调用 API 网关,我们是否需要对 http 请求进行签名,或者我们将如何对端点进行调用? api 网关是否知道何时使用 cognito 安全性以及何时使用 IAM 安全性?他们可以一起工作吗?再次感谢!
    • @KasperF,我明白你的意思,这就是我编辑回复的原因。我为这种情况提供了各种不同的方法,以便选择最适合您的方法。希望对您有所帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    • 1970-01-01
    • 2019-02-20
    • 2021-07-05
    • 2013-03-12
    相关资源
    最近更新 更多