向特定 Cognito 用户组授予 read/write 对 S3 存储桶的访问权限

Give read/write access to an S3 bucket to a specific Cognito user group

我在 Cognito 用户池中有用户,其中一些用户在 Administrators 组中。需要允许这些管理员 read/write 到特定的 S3 存储桶,而其他用户不能。

为此,我为 Administrators 组分配了一个角色,如下所示:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::my-bucket-name/*"
            ]
        }
    ]
}

然后在我的 Angular 应用程序中,我登录并使用 Amplify 的 Storage class 执行以下操作:

Storage.put("test.txt", "hello")
    .then(result => ...)
    .catch(err => ...);

本例中的Amplify.configure为:

const amplifyConfig = {
  Auth: {
    region: "eu-west-2",
    userPoolId: xxx,
    userPoolWebClientId: yyy,
    mandatorySignIn: false,
  },
  Storage: {
    AWSS3: {
      bucket: 'my-bucket-name',
      region: "eu-west-2"
    }
  }
};
Amplify.configure(amplifyConfig);

这里的问题是,在内部,没有向 Storage.put 调用提供凭据,任务失败如下:

[DEBUG] 31:08.487 Credentials - Failed to load credentials 
ZoneAwarePromise {__zone_symbol__state: false, __zone_symbol__value: NotAuthorizedException: 
Unauthenticated access is not supported for this identity pool.

仔细阅读,这似乎是因为您 根本 没有获得凭据,除非您有联合身份池。因此,我创建了一个附加到我的用户池 + 应用程序客户端的身份池,具有所有默认值,并将其 ID 添加到我的 Amplify.configure 配置中。

这仍然不起作用,但这次我确实 获取了凭据 - 它们适用于在身份池的 Authenticated Role[ 中指定的 IAM 角色=48=].

所以现在如果我将上述 S3 权限添加到该角色,我的所有代码都可以工作,但是现在存在一个巨大的安全漏洞 所有 用户(不仅仅是管理员)可以read/write 管理员的存储桶。啊

那么,当且仅当我是管理员时,我如何才能获得管理员用户组设置中指定角色的凭据?

或者,这是否可以通过联合身份中的一些巧妙设置来解决,从而根据用户组分配正确的角色?

解决方案在于联合身份池的设置。

默认情况下,身份池将提供为其配置的 IAM 角色。换句话说,它设置的“未经身份验证的角色”或“经过身份验证的角色”之一。

但它可以被告知提供由身份验证提供程序指定的角色。这就是解决这里问题的方法。

  1. 在 AWS 控制台的 Cognito 中,打开相关身份池。
  2. 点击“编辑身份池”(右上角)
  3. 展开“身份验证提供程序”
  4. 在经过身份验证的角色选择下,选择“从令牌中选择角色”。

这将允许 Cognito 指定自己的角色,您会发现用户获得了他们所在组的权限。