首页 > 解决方案 > 为什么这个项目需要 iam:PassRole?

问题描述

我克隆了这个解决方案azure-devops-on-aws并用于dotnet lambda deploy-serverless ...MyLizardApp部署到我的个人 AWS 账户。

在学习过程中,我创建了一个 S3 存储桶my-lizard-test、IAM 用户组MyLizardGroup以及用户lizard-user和组策略MyLizardApp-Policy。该政策包括以下服务:

  1. API 网关(完全访问,所有资源)
  2. CloudFormation(完全访问,所有资源)
  3. Lambda(完全访问,所有资源)
  4. S3(完全访问,所有资源)

(最终)部署成功,我有一个 Lambda 应用程序服务于显示时间的简单剃须刀页面。

然后,我将LambdaEntryPoint.csaws-lambda-tools-defaults.jsonserverless.template文件复制到我自己的dotnet core webapp(也是一个 razor 项目)中,并尝试使用相同的命令将其部署到同一个 AWS 账户。所做的唯一更改是LambdaEntryPoint类的命名空间(反映在serverless.template文件中)和.csproj要包含的文件:

<AWSProjectType>Lambda</AWSProjectType>

和:

<PackageReference Include="Amazon.Lambda.AspNetCoreServer" Version="5.0.0" />

dotnet lambda deploy-serverless ...命令失败并显示以下消息:

User: arn:aws:iam::123456789120:user/lizard-user is not authorized to perform: iam:PassRole on resource: arn:aws:iam::123456789120:role/MyLizardAppServiceRole (Service: AWSLambdaInternal; Status Code: 403; Error Code: AccessDeniedException; Request ID: 12345678-1234-1234-1234-123456789012; Proxy: null)

IAM通过将服务添加到MyLizardApp-PolicyPassRole所有资源)中,我得到了成功的命令。

为什么这对我的个人应用程序是必要的,而不是来自 github 的演示解决方案?如果答案不明确,我应该寻找哪些差异?我的个人应用程序与演示解决方案没有显着差异,我认为功能差异(在 C# 中)并不重要。

标签: amazon-web-services.net-coreaws-lambdaaws-serverless

解决方案


每当 AWS 服务承担(使用)一个 IAM 角色时,该服务必须iam:PassRole有权授予使用该角色的权限。这需要防止用户获得过多的权限。

例如,想象一个启动 Amazon EC2 实例的普通(非管理员)用户。启动实例时,他们可以指定要分配给实例的 IAM 角色。如果允许此用户选择任何IAM 角色,他们可以选择一个管理员角色并将其分配给 EC2 实例。然后,他们可以登录到实例并使用凭据以管理员身份进行 API 调用。这是不受欢迎的“特权升级”。

同样,当 AWS Lambda 函数执行时,它使用 IAM 角色来获取权限。该iam:PassRole权限用于控制用户可以将哪些角色分配给 Lambda 函数。

因此,该项目中有一些东西正在尝试使用 IAM 角色并需要适当的权限。


推荐阅读