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

时间:2021-05-26 23:07:38

标签: amazon-web-services amazon-s3 amazon-cognito aws-amplify

我在 Cognito 用户池中有用户,其中一些在 Administrators 组中。需要允许这些管理员读取/写入特定的 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 类执行以下操作:

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 配置中。

这仍然不起作用,但这次我确实获得了凭据 - 它们用于身份池的已验证角色中指定的 IAM 角色。

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

但是可以告诉它提供身份验证提供者指定的角色。这就是解决这里问题的方法。

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

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