向特定 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 角色。换句话说,它设置的“未经身份验证的角色”或“经过身份验证的角色”之一。
但它可以被告知提供由身份验证提供程序指定的角色。这就是解决这里问题的方法。
- 在 AWS 控制台的 Cognito 中,打开相关身份池。
- 点击“编辑身份池”(右上角)
- 展开“身份验证提供程序”
- 在经过身份验证的角色选择下,选择“从令牌中选择角色”。
这将允许 Cognito 指定自己的角色,您会发现用户获得了他们所在组的权限。
我在 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 角色。换句话说,它设置的“未经身份验证的角色”或“经过身份验证的角色”之一。
但它可以被告知提供由身份验证提供程序指定的角色。这就是解决这里问题的方法。
- 在 AWS 控制台的 Cognito 中,打开相关身份池。
- 点击“编辑身份池”(右上角)
- 展开“身份验证提供程序”
- 在经过身份验证的角色选择下,选择“从令牌中选择角色”。
这将允许 Cognito 指定自己的角色,您会发现用户获得了他们所在组的权限。