来自跨账户 ECR 的 AWS Lambda :Lambda 无权访问 ECR 映像

问题描述 投票:0回答:5

我尝试从另一个帐户 A 的 ECR 映像在帐户 B 中创建 lambda 函数,但遇到 Lambda 无权访问 ECR 映像 错误。

我按照this创建了以下 ECR 策略:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "CrossAccountPermission",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::BBBBBBBBBBBB:root"
      },
      "Action": [
        "ecr:BatchGetImage",
        "ecr:GetDownloadUrlForLayer"
      ]
    },
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Action": [
        "ecr:BatchGetImage",
        "ecr:GetDownloadUrlForLayer"
      ],
      "Condition": {
        "StringLike": {
          "aws:sourceArn:": "arn:aws:lambda:eu-west-1:BBBBBBBBBBBB:function:*"
        }
      }
    }
  ]
} 

我正在使用 aws sso 承担的角色来执行 lambda 创建,我不知道这是否有影响。

账户 B 和 A 不在同一 AWS 组织单位。

我测试过的东西:

  • 如果我从针对 lambda 服务的语句中删除条件,错误就会消失,但显然这不是永久解决方案。
  • 在账户 B 中使用相同的 ECR 映像运行 ECS 任务效果很好。
  • 我尝试按照 SAM 教程这里进行操作,但遇到了同样的问题。

我没有什么要检查的了,我真的很想避免复制帐户 B 中的 ECR 映像。

您知道为什么示例策略似乎不起作用吗?

如何缩小来自 lambda 服务的所有内容的策略范围?我计划使用

aws:PrincipalOrgPaths
来允许多个组织单位,但这似乎不适用于 lambda 主体。

amazon-web-services aws-lambda amazon-ecr
5个回答
5
投票

我今天在这方面花了太多时间,所以希望它对其他人有帮助,但我终于能够使用以下存储库策略与整个组织共享图像......

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "CrossOrgPermission",
      "Effect": "Allow",
      "Principal": "*",
      "Action": [
        "ecr:BatchGetImage",
        "ecr:GetDownloadUrlForLayer"
      ],
      "Condition": {
        "StringLike": {
          "aws:PrincipalOrgID": "x-xxxxxxxxx"
        }
      }
    },
    {
      "Sid": "LambdaECRImageCrossOrgRetrievalPolicy",
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Action": [
        "ecr:BatchGetImage",
        "ecr:GetDownloadUrlForLayer"
      ],
      "Condition": {
        "StringLike": {
          "aws:ResourceOrgID": "x-xxxxxxxxx"
        }
      }
    }
  ]
}

我的 CrossOrgPermission 比这里的更广泛一些,但我相信它应该仍然可以如图所示工作。


1
投票

正如我在评论中所说,这是一个愚蠢的拼写错误,政策中经常出现这种情况。

我用

"aws:sourceArn:":
代替
"aws:sourceArn":
...



0
投票

aws:ResourceOrgID 不会执行这种情况下所需的操作。更糟糕的是,它会打开您的 ECR 以访问任何帐户中的任何 lambda。

AWS 博客 将 aws:ResourceOrgID 描述为“正在访问的资源的 AWS 组织 ID”。此条件始终为真,因为正在访问的资源(您的 ECR)属于您的组织。它没有说明任何有关访问 ECR 的 lambda。

此外,在我与 AWS 支持人员的沟通中,他们确认使用 aws:PrincipalOrgId 效果不佳。引用他们的回应:

当权限被授予服务原则时,例如 “lambda.amazonaws.com”他们不支持 PrincipleOrgPaths 或 PrimaryOrgId 条件键。这是因为 Lambda 服务 主体不存在于组织内,而身份 就像用户/角色一样。

使其工作的唯一方法是使用 aws:SourceARN 条件键,明确提及将访问您的 ECR 的每个 lambda。


0
投票
当 lambda 访问 ECR 映像时,它会作为服务主体而不是组织内存在的主体(例如 lambda 执行角色)进行访问。因此,

aws:PrincipalOrg*

条件键不起作用。

从 ECR 下载的角度来看,资源是存储库本身,而不是发起访问的 lambda。因此,

aws:ResourceOrg*

条件键不起作用,因为它们引用存储库,因此始终为真(从而允许意外访问其他 AWS 组织!)。

值得庆幸的是,AWS 在 2023 年 11 月发布了条件键

aws:SourceOrgID

aws:SourceOrgPaths
。这些条件键可用于授权 ECR 访问在给定组织/组织单位中运行的 Lambda。
用于授予组织中任何 lambda 访问权限的存储库策略声明可能如下所示:

{ "Sid": "LambdaECRImageCrossOrgRetrievalPolicy", "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": [ "ecr:BatchGetImage", "ecr:GetDownloadUrlForLayer" ], "Condition": { "StringLike": { "aws:SourceOrgID": "x-xxxxxxxxx" } } }

© www.soinside.com 2019 - 2024. All rights reserved.