繁体   English   中英

AWS CDK 中不允许跨账户传递角色

[英]Cross-account pass role is not allowed in AWS CDK

我有一个帐户 DEV 试图在帐户模块中创建一个 lambda。 当 DEV 中的代码(由 S3 触发的 lambda)尝试在 MODULE 中创建 lambda 时,我收到错误“不允许跨帐户传递角色”[Symbol]

过程是这样的:我向 DEV S3 添加一个文件,这个 lambda 被触发并且应该调用 lambda await getLambdaClient(opts).send(new CreateFunctionCommand(params))其中 opts 是使用moduleAssumeRole获得的临时 STS 信用

我正在使用 CDK/打字稿:

在我的模块帐户中,我创建角色:

// Basic role for module lambdas created on the fly
const moduleAssumeRole = new Role(this, 'ModuleAssumeRole', {
  roleName: 'moduleAssumeRole',
  assumedBy: new CompositePrincipal(
    new AccountPrincipal(DEV_ACCOUNT_ID),
    new ServicePrincipal('lambda.amazonaws.com')
  )
})
moduleAssumeRole.addToPolicy(
  new PolicyStatement({
    actions: [
      'iam:*',
      'sts:*',
      'lambda:*',
      'logs:*',
      'xray:PutTelemetryRecords',
      'xray:PutTraceSegments'
    ],
    resources: ['*']
  })
)

在我的开发堆栈中:

const moduleDeployerLamdba =  new NodejsFunction(this, 'DeployLambda', {
  ...  
  environment: {
    MODULE_ASSUME_ROLE: moduleAssumeRoleArn
  }
))

// I dont think these are needed here but hey... trying passrole everywhere
moduleDeployer.addToRolePolicy(
  new PolicyStatement({
    actions: ['lambda:*', 'logs:*', 's3:*'],
    resources: ['*']
  })
)

moduleDeployer.addToRolePolicy(
  new PolicyStatement({
    actions: ['sts:AssumeRole'],
    resources: ['*']
  })
)

moduleDeployer.addToRolePolicy(
  new PolicyStatement({
    actions: ['iam:PassRole'],
    resources: ['*']
  })
)

在我在 DEV 上的部署代码中,我使用 STS 客户端并将 moduleAssumeRoleArn 传递给它以获取用于将 lambda 部署到 MODULE 帐户的凭据。

阅读了数十篇关于此的帖子/博客,我找不到答案。 文档一直提到有权传递角色的用户 - 不确定他们在这里谈论的是哪个用户,但 CDK 是使用 AdministratorAccess API 密钥部署的。

有任何想法吗?

一些最低权限调整和清理:

ModuleAssumeRole应该只信任 DEV Lambda 角色。 Account Principal 过于宽泛。 Lambda 服务主体无效。

const moduleAssumeRole = new Role(this, 'ModuleAssumeRole', {
  roleName: 'moduleAssumeRole',
  assumedBy: new CompositePrincipal(
    new ArnPrincipal(DEV_LAMBDA_ROLE_ARN), // best option for least-privilege access
    new AccountPrincipal(DEV_ACCOUNT_ID),  // valid, but very broad
  )
})

对于最低权限,应该只允许 DEV DeployLambdaRole担任ModuleAssumeRole ,而不是每个角色。

moduleDeployer.addToRolePolicy(
  new PolicyStatement({
    actions: ['sts:AssumeRole'],
    resources: [MODULE_ASSUME_ROLE_ARN] // "*" valid, but not least-privilege
  })
)

删除其他moduleDeployer.addToRolePolicy调用。 没有必要。

注意应用最小权限时两个角色之间的循环依赖。 ModuleAssumeRole需要DeployLambdaRole ARN 作为其信任策略。 DeployLambdaRole的权限策略需要ModuleAssumeRole ARN。 在这种情况下,处理此问题的最简单方法是使用显式角色名称而不是 CDK 生成的名称。 或者不要使用最小权限。

所以我把这个问题留给了我愚蠢的错误,因为错误信息让我很难找到罪魁祸首,所以也许会帮助别人。 我所有的 CDK 代码都是正确的,但我搞砸了将假定的临时凭据传递给 lambda 客户端。 我使用了一个小的配置合并实用程序,它基本上丢弃了过程中假定的信用。 糟糕的编码器。 没有披萨。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM