1

我有两个帐户,a1a2

我在 a1 中有一个 EC2 实例,a1.ec2. 它在该帐户中扮演某种角色,a1.r. 此角色对所有 ECR 操作具有完全访问权限。

现在,我有一个映像注册表 (ECR),a2并且希望能够从a1.ec2.

所以,我 ssh 进入那个实例,为了测试我运行的访问

aws ecr describe-repositories --region <my-region> --registry-id <id of a2>

但我得到了错误

An error occurred (AccessDeniedException) when calling the DescribeRepositories operation: User: arn:aws:sts::<id of a1>:assumed-role/a1.r/i-075fad654b998275c is not authorized to perform: ecr:DescribeRepositories on resource: arn:aws:ecr:*:*:repository/*

但是,这个权限确实是授予角色的a1.r。我通过能够a1很好地访问 ECR 来验证这一点。

另外,我喜欢访问的 ECR 有以下权限策略,所以我确保问题不是由 ECR 引起的a2

    {
      "Sid": "new statement",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<id of a1>:root"
      },
      "Action": "*"
    },
    {
      "Sid": "new statement",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<id of a1>:role/a1.r"
      },
      "Action": "*"
    }

我查看了https://serverfault.com/questions/897392/ecr-cross-account-pull-permissions,其中的解决方案似乎是创建跨账户角色。尽管我可以创建这样的角色a2.cross-acc-r,但我无法弄清楚如何为aws ecrcli 命令承担该角色。我不希望 EC2 实例承担该角色,因为它驻留在不同的账户中(甚至不确定这是否可能)。

我是否缺乏有关 AWS IAM 工作原理的基本知识?

4

3 回答 3

3

如果您想从一个账户的 EC2 实例中拉取镜像并将其推送到另一个账户的 ECR,并且不需要完整的aws ecrCLI 功能,您可以通过 docker 执行此操作。例如,如果您希望 Jenkins 基于驻留在不同 AWS 账户中的目标环境(生产、暂存)将构建的映像推送到 ECR。

通过 docker 执行此操作记录在https://aws.amazon.com/premiumsupport/knowledge-center/secondary-account-access-ecr/

简而言之,在 ECR 存储库中,您授予其他帐户所需的权限。

然后,您将获得一个临时身份验证令牌,以通过以下方式向 ECR 授权 docker:

$(aws ecr get-login --registry-ids <account ID> --region <your region> --no-include-email)

在此之后,您可以使用docker pulldocker push访问它。

于 2019-09-18T10:07:35.990 回答
2

我查看了https://serverfault.com/questions/897392/ecr-cross-account-pull-permissions,其中的解决方案似乎是创建跨账户角色。尽管我可以创建这样的角色a2.cross-acc-r,但我无法弄清楚如何为aws ecrCLI 命令承担该角色。我不希望 EC2 实例承担该角色,因为它驻留在不同的账户中(甚至不确定这是否可能)。

您可以按照以下步骤进行操作:

  1. 账户 A中,我创建了一个角色(例如RoleForB)来信任账户 B ,并将IAM 策略附加到之前创建的角色,以允许它在账户 A中执行一些读取操作。e.g ReadOnlyAccess
  2. 账户 B中,我创建了一个角色(例如AssumeRoleInA)并附加了一个策略以允许它承担在账户 A中创建的角色。
  3. 账户 B中,将在步骤 2 中创建ec2-profile的 IAM 角色 ( )关联到您的 EC2 实例。AssumeRoleInA
  4. 账户 B中使用命令登录到此 EC2 实例以担任账户 Aaws sts assume-role --role-arn "arn:aws:iam::Account_A_ID:role/RoleForB" --role-session-name "EC2FromB"中的角色。
  5. 当命令完成第 4 步时,在账户 B EC2 终端中,您可以从您路由它的任何地方看到访问密钥 ID、秘密访问密钥和会话令牌,在我们的例子中是手动或使用脚本。然后,您可以将这些值分配给环境变量 ( , , )stdoutAWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_SESSION_TOKEN

所以让我们一步一步地检查上面提到的配置,但有一些模式细节:

  1. 正如之前在账户 A中介绍的那样,它通过创建命名角色并向其附加权限来建立对账户 B的信任。RoleForBReadOnlyAccess
{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Principal": {"AWS": "arn:aws:iam::Account_B_ID:root"},
        "Action": "sts:AssumeRole"
    }
}
  1. 账户 B中,创建一个名为的角色AssumeRoleInA,然后附加相应的角色以policy允许它承担账户 A中的角色。RoleForB
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Resource": [
        "arn:aws:iam::Account_A_ID:role/RoleForB"
      ]
    }
  ]
}
  1. 账户 B中,创建一个新的EC2 实例(如果它尚不存在),并将其ec2-profile与名为的IAM 角色AssumeRoleInA相关联。
{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Principal": {"Service": "ec2.amazonaws.com"},
        "Action": "sts:AssumeRole"
    }
}
  1. 账户 B中,使用以下命令登录到此 EC2 实例以担任账户 A中的角色:
aws sts assume-role --role-arn "arn:aws:iam::Account_A_ID:role/RoleForB" --role-session-name "EC2FromB"`
于 2019-09-17T14:58:45.480 回答
1

您需要在您的帐户a1a2.

从您的a2控制台,转到 IAM 服务,创建一个新角色:

1) 受信任的实体:另一个 AWS 账户(输入账户a1的 ID)

2)策略:AmazonEC2ContainerRegistryPowerUser(或其他符合您要求的)

从您的a2控制台,转到 ECR 服务,您需要编辑您的权限:

{
      "Sid": "new statement",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<id of a1>:root"
      },
      "Action": "*"
    },
    {
      "Sid": "new statement",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<id of a2>:role/a2.r"
      },
      "Action": "*"
    }
}
于 2019-09-17T15:01:07.980 回答