【问题标题】:Is it safe to expose the AWS Cognito Ids?公开 AWS Cognito Id 是否安全?
【发布时间】:2017-01-31 16:08:13
【问题描述】:

我正在使用客户端 Cognito Javascript SDK。部分设置需要配置region, UserPoolId, ClientId, and identityPoolId。在测试期间,我通过一个单独的文件包含数据,用户可以查看并使用它来发现这些 Cognito id。

向最终用户公开这些 ID 是否安全?

否则,我该如何安全地执行此操作?

【问题讨论】:

  • 不,不安全

标签: javascript security amazon-web-services amazon-cognito


【解决方案1】:

AWS 在他们的论坛上有一篇帖子解决了这个问题。

请注意,使用 userPoolId 和 clientId,只能调用未经身份验证的 API,例如:SignUp、authenticate、forgotPassword 等。因此仅 userPoolId 和 clientId 不足以对您的用户池进行任何恶意活动。

来源是https://forums.aws.amazon.com/thread.jspa?threadID=245752&tstart=200

另一种方法是使用带有 Cognito 授权方的 API Gateway 来处理对其他后端服务(如 DynamoDB 或 S3)的调用,而不是直接使用来自前端 js 的调用。这里有描述:

https://aws.amazon.com/blogs/mobile/aws-mobile-app-backend-with-hybrid-apps/

【讨论】:

    【解决方案2】:

    如果您使用的是经过身份验证的身份(当您使用 Cognito 用户池时,它是经过身份验证的身份),那么即使攻击者获取了 identityId,如果不提供只能获取的 id 令牌,他们也无法获取 AWS 凭证通过提供身份验证凭据(用户名和密码)。

    P.S:始终建议使用经过身份验证的身份,即使您有未经身份验证的用例,最好将角色的访问权限保持在最低限度以获取未经身份验证的身份。

    【讨论】:

    • 我正在使用经过身份验证的身份。我没有公开我的 aws 凭据。如何避免暴露region, UserPoolId, ClientId, and identityPoolId
    • 我不认为暴露这些有什么害处。甚至 AWS Amplify 也将 aws-exports.js 文件存储在客户端,其中包含所有这些值,包括您的 dyanmodb 表名称、api 路径、s3 存储桶名称等
    【解决方案3】:

    我有一个解决方案,即使用 IAM 非身份验证凭证调用特定的 lambda 函数。所以流程是这样的:

    1. 为未经身份验证的提供者创建认知身份池
    2. 将该认知身份池与未经身份验证的 amr 的 IAM 角色策略相关联
    3. 授予该 IAM 角色调用 lambda 身份验证功能的权限操作(登录、注册、忘记、确认等)

    所以在这里,客户端应用程序只需要获取其未经身份验证的凭据身份即可调用 lambda 身份验证功能。我们将 clientID 和 userPoolID 存储在 lambda 上,而不是客户端应用上

    【讨论】:

    • 我不认为暴露这些有什么害处。甚至 AWS Amplify 也将 aws-exports.js 文件存储在客户端,其中包含所有这些值,包括您的 dyanmodb 表名称、api 路径、s3 存储桶名称等
    • 在客户端暴露置信度数据(最具体的UserPoolID和IdentityPoolID),让用户重复使用并做DDOS测试(在过期会话范围内)。一旦我知道 UserPoolID + ClientID,我就可以对 OAUTH2 API 进行 CURL 以生成令牌。一旦我知道 IdentityPoolId,我会将我的令牌交换为临时凭证。然后,我将找出激活的资源,以便使用我的 nodejs 脚本或递归 aws cli 发送尽可能多的请求。使用 API Gateway,我们无法通过限制 API 和 WAF 来防止这种情况。直接请求没有限制规则
    • 我只是在客户端应用程序上公开我的 ClientID 以请求 OAUTH2 授权代码。我通过 HTTP API Gateway 将代码转发给 Lambda,并将其余部分留在 Lambda 上以请求令牌、凭证交换、进行编码和其他一些技术,以确保一切健壮和安全。但是,我什至还没有安全感。那里有更多的安全问题和强大的系统,而不仅仅是提供应用程序
    • 我同意你的观点,但我们应该注意到专家和高级 AWS 工程师一直在开发 AWS Amplify 框架。他们将 aws-exports.js 文件存储在客户端上,该文件包含所有内容 - dynamdb 表名称、s3 存储桶名称、用户池 ID、身份池 ID、用户池客户端 ID 等
    • 在 AWS amplify github 上也可以看到这个问题 - github.com/aws-amplify/amplify-js/issues/2495 - 基本上可以将这些信息存储在客户端。
    猜你喜欢
    • 2017-02-11
    • 1970-01-01
    • 2022-01-02
    • 2015-07-21
    • 2021-05-05
    • 2020-11-23
    相关资源
    最近更新 更多