为什么我的 AWS 代入角色无权执行 cognito-idp:AdminGetUser?
Why is my AWS assumed role not authorised to perform cognito-idp:AdminGetUser?
我的 Laravel 应用程序调用 AdminGetUser 端点。
在本地环境中,它成功returns资源。
部署到 Vapor 环境后,失败并显示以下错误消息:
User: arn:aws:sts::xxxx:assumed-role/laravel-vapor-role/xxxx is not authorized to perform: **cognito-idp:AdminGetUser** on resource: arn:aws:cognito-idp:us-east-1:xxxx:userpool/us-east-1_xxxx because no identity-based policy allows the cognito-idp:AdminGetUser action
问题是什么?
laravel-vapor-role is not authorized to perform: cognito-idp:AdminGetUser on resource: arn:aws:cognito-idp:us-east-1:xxxx:userpool/us-east-1_xxxx
这意味着 laravel-vapor-role
角色没有附加适当的策略来为其提供执行 cognito-idp:AdminGetUser
操作的权限。
您可以通过两种方式解决此问题:
- 将 AWS 托管
AmazonCognitoReadOnly
策略分配给角色
- 为角色添加内联策略,符合 granting least privilege
的安全最佳实践
如果您预计以后将需要更多只读权限,则将 AWS 托管 AmazonCognitoReadOnly
策略分配给角色会更容易和更好。
它将提供对您的身份池和用户池的只读访问权限,包括 cognito-idp:Get*
下的 cognito-idp:AdminGetUser
权限(文档 here, direct policy link here):
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"cognito-identity:Describe*",
"cognito-identity:Get*",
"cognito-identity:List*",
"cognito-idp:Describe*",
"cognito-idp:AdminGet*",
"cognito-idp:AdminList*",
"cognito-idp:List*",
"cognito-idp:Get*",
"cognito-sync:Describe*",
"cognito-sync:Get*",
"cognito-sync:List*",
"iam:ListOpenIdConnectProviders",
"iam:ListRoles",
"sns:ListPlatformApplications"
],
"Resource": "*"
}
]
}
如果您只需要 cognito-idp:AdminGetUser
的单一权限,则创建一个内联策略并将其分配给角色,该策略只授予特定 Cognito 用户池的权限。
下面的图片应该是不言自明的:
对于遇到此问题的任何其他人,我的问题是我从另一个文件借用了 iamRoleStatements
配置,但忘记在我的文件顶部包含 serverless-iam-roles-per-function
import。
plugins:
- serverless-pseudo-parameters
- serverless-iam-roles-per-function # <----- Missing this plugin *****
functions:
func1:
handler: handler.func1
iamRoleStatements:
- Effect: 'Allow'
Action:
- sns:Publish
Resource: 'arn:aws:sns:#{AWS::Region}:#{AWS::AccountId}:EventsTopic'
我的 Laravel 应用程序调用 AdminGetUser 端点。
在本地环境中,它成功returns资源。
部署到 Vapor 环境后,失败并显示以下错误消息:
User: arn:aws:sts::xxxx:assumed-role/laravel-vapor-role/xxxx is not authorized to perform: **cognito-idp:AdminGetUser** on resource: arn:aws:cognito-idp:us-east-1:xxxx:userpool/us-east-1_xxxx because no identity-based policy allows the cognito-idp:AdminGetUser action
问题是什么?
laravel-vapor-role is not authorized to perform: cognito-idp:AdminGetUser on resource: arn:aws:cognito-idp:us-east-1:xxxx:userpool/us-east-1_xxxx
这意味着 laravel-vapor-role
角色没有附加适当的策略来为其提供执行 cognito-idp:AdminGetUser
操作的权限。
您可以通过两种方式解决此问题:
- 将 AWS 托管
AmazonCognitoReadOnly
策略分配给角色 - 为角色添加内联策略,符合 granting least privilege 的安全最佳实践
如果您预计以后将需要更多只读权限,则将 AWS 托管 AmazonCognitoReadOnly
策略分配给角色会更容易和更好。
它将提供对您的身份池和用户池的只读访问权限,包括 cognito-idp:Get*
下的 cognito-idp:AdminGetUser
权限(文档 here, direct policy link here):
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"cognito-identity:Describe*",
"cognito-identity:Get*",
"cognito-identity:List*",
"cognito-idp:Describe*",
"cognito-idp:AdminGet*",
"cognito-idp:AdminList*",
"cognito-idp:List*",
"cognito-idp:Get*",
"cognito-sync:Describe*",
"cognito-sync:Get*",
"cognito-sync:List*",
"iam:ListOpenIdConnectProviders",
"iam:ListRoles",
"sns:ListPlatformApplications"
],
"Resource": "*"
}
]
}
如果您只需要 cognito-idp:AdminGetUser
的单一权限,则创建一个内联策略并将其分配给角色,该策略只授予特定 Cognito 用户池的权限。
下面的图片应该是不言自明的:
对于遇到此问题的任何其他人,我的问题是我从另一个文件借用了 iamRoleStatements
配置,但忘记在我的文件顶部包含 serverless-iam-roles-per-function
import。
plugins:
- serverless-pseudo-parameters
- serverless-iam-roles-per-function # <----- Missing this plugin *****
functions:
func1:
handler: handler.func1
iamRoleStatements:
- Effect: 'Allow'
Action:
- sns:Publish
Resource: 'arn:aws:sns:#{AWS::Region}:#{AWS::AccountId}:EventsTopic'