aws-lambda - 如何在 AWS IAM 策略中为联合用户提供 lambda 执行的选择性访问?
问题描述
我正在尝试为组内的选定成员授予 lambda 执行访问权限。用户通过 PingFederate 进行身份验证。我在将此选择性访问权限授予联合用户时遇到问题。
我有一个附加到此角色的自定义 IAM 策略 (allow-lambda-invocation-selective)。尽管该策略似乎通过了验证并且策略模拟显示允许访问,但是当我尝试执行 lambda 函数时,我收到了消息
Calling the invoke API action failed with this message: User:arn:aws:sts::123456789012:assumed-role/role-for-grp-l2/myuser1234 is not authorized to perform: lambda:InvokeFunction on resource: arn:aws:lambda:us-east-1:123456789012:function:my-lambda-function
这是我的政策:allow-lambda-invocation-selective
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"lambda:InvokeFunction",
"lambda:InvokeAsync",
"lambda:ListVersionsByFunction",
"lambda:GetFunction",
"lambda:ListAliases"
],
"Resource": "arn:aws:lambda:*:123456789012:function:my-lambda-function",
"Condition": {
"StringEquals": {
"aws:userid": "arn:aws:sts::123456789012:assumed-role/role-for-grp-l2/myuser1234"
}
}
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": [
"lambda:ListFunctions",
"lambda:ListEventSourceMappings",
"lambda:ListLayers",
"lambda:ListLayerVersions"
],
"Resource": "*",
"Condition": {
"StringEquals": {
"aws:userid": "arn:aws:sts::123456789012:assumed-role/role-for-grp-l2/myuser1234"
}
}
}
]
}
我错过了什么吗?
解决方案
我试图理解你的问题。如果我做了错误的假设,请纠正我。
- 每个组/用户已经有自己的角色。
当您对您的用户进行身份验证时,他们将扮演自己的角色。myuser1234
,经过身份验证后,会收到arn:aws:sts::123456789012:assumed-role/role-for-grp-l2/myuser1234
角色,对吗?是否可以为每个组创建一个角色并删除该conditions
属性(检查项目 2 解释原因)?
// role-for-grp-l2
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"lambda:InvokeFunction",
"lambda:InvokeAsync",
"lambda:ListVersionsByFunction",
"lambda:GetFunction",
"lambda:ListAliases"
],
"Resource": "arn:aws:lambda:*:123456789012:function:my-lambda-function"
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": [
"lambda:ListFunctions",
"lambda:ListEventSourceMappings",
"lambda:ListLayers",
"lambda:ListLayerVersions"
],
"Resource": "*"
}
]
}
- 问题与
aws:userid
阅读有关密钥的文档aws:userid
,我们可以发现该密钥具有角色 id:caller-specified-role-name给出的值,
其中角色 id 是角色的唯一 id,调用者指定角色名称由传递给 AssumeRole 请求的RoleSessionName 参数指定。
所以aws:userid
有像AIDAJQABLZS4A3QDU576Q:SomeNameYouGive
. 因此,您的条件永远不会匹配arn:aws:sts::123456789012:assumed-role/role-for-grp-l2/myuser1234
,然后用户无法承担该操作。
- 以另一种方式使用条件
假设RoleSessionName
是用户名,您可以这样使用条件:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"lambda:InvokeFunction",
"lambda:InvokeAsync",
"lambda:ListVersionsByFunction",
"lambda:GetFunction",
"lambda:ListAliases"
],
"Resource": "arn:aws:lambda:*:123456789012:function:my-lambda-function",
"Condition": {
"StringLike": {
"aws:userid": "*:myuser1234"
}
}
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": [
"lambda:ListFunctions",
"lambda:ListEventSourceMappings",
"lambda:ListLayers",
"lambda:ListLayerVersions"
],
"Resource": "*",
"Condition": {
"StringLike": {
"aws:userid": "*:myuser1234"
}
}
}
]
}
如果您愿意,可以使用 AWS CLI 和以下命令删除*
通配符获取:role id
aws iam get-role --role-name ROLE_NAME
并改变条件如下:
"Condition": {
"StringEquals": {
"aws:userid": "ROLE_ID:myuser1234"
}
}
推荐阅读
- java - 动态调整 Android Studio TextView 的大小
- google-app-engine - 无法解析 Open API 或来自 openapiapp.yaml 的 Google 服务配置规范
- sms - 用户从网站表单和自动欢迎消息(Whatsapp + SMS)中选择加入
- javascript - MPA 中的反应上下文(不同应用程序的一个上下文)
- amazon-web-services - 使用 Terraform 创建 Athena 资源
- python - 在python中加密密码
- dspace - DSpace OAI-PMH XML 导入
- django - 如何在模板中返回 MEDIA URL
- javascript - 即使在向上滚动并与标题混合后,粘性导航栏仍保持在“顶部:0”
- javascript - Next.js 清除查询参数