Как получить доступ к AWS ECR из инстанса EC2 другого аккаунта?

У меня две учетные записи, a1 и a2.

У меня экземпляр EC2 в a1, 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. Я проверил это, имея возможность получить доступ к ECR в a1 очень хорошо.

Кроме того, 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 ecr cli. Я не хочу, чтобы экземпляр EC2 взял на себя эту роль, поскольку он находится в другой учетной записи (даже не уверен, возможно ли это вообще).

Мне не хватает чего-то базового относительно того, как работает AWS IAM?


person Richard Kiefer    schedule 17.09.2019    source источник
comment
Вы это проверили? serverfault.com/questions/897392/   -  person abdullahkhawer    schedule 17.09.2019
comment
Проверьте это: medium.com/miq-tech-and-analytics/   -  person abdullahkhawer    schedule 17.09.2019
comment
Проверьте это на AWS: aws.amazon.com/premiumsupport / knowledge-center /   -  person abdullahkhawer    schedule 17.09.2019
comment
Спасибо. Ваша ссылка на serverfault называет два ответа. Тот, что говорит об определении политик ECR, не работает для меня, как указано в моем вопросе. Для другого ответа я обновил свой вопрос.   -  person Richard Kiefer    schedule 17.09.2019
comment
Что касается вашей связанной статьи на medium.com, Леонард опубликовал и ответил, и я прокомментировал это.   -  person Richard Kiefer    schedule 18.09.2019


Ответы (3)


Я посмотрел https://serverfault.com/questions/897392/ecr-cross-account-pull-permissions, где решение, по-видимому, заключается в создании ролей для нескольких учетных записей. Хотя я мог бы создать такую ​​роль a2.cross-acc-r, я не могу понять, как я могу принять эту роль для aws ecr команд CLI. Я не хочу, чтобы экземпляр EC2 взял на себя эту роль, поскольку он находится в другой учетной записи (даже не уверен, возможно ли это вообще).

Вы можете сделать это, выполнив следующие действия:

  1. В учетной записи A я создал роль (например, RoleForB), чтобы доверять учетной записи B, и прикрепил к ранее созданной роли IAM policy, чтобы позволить ему выполнять некоторые операции чтения в учетной записи A. e.g ReadOnlyAccess
  2. В учетной записи B я создал роль (например, AssumeRoleInA) и прикрепил политику, позволяющую ей взять на себя роль, созданную в аккаунт A.
  3. В учетной записи B свяжите с вашим экземпляром EC2 ec2-profile роль IAM (AssumeRoleInA), созданную на шаге 2.
  4. В учетной записи B войдите в этот экземпляр EC2, чтобы взять на себя роль в учетной записи A, используя команду aws sts assume-role --role-arn "arn:aws:iam::Account_A_ID:role/RoleForB" --role-session-name "EC2FromB".
  5. В терминале EC2 учетной записи B, когда команда завершена на шаге 4, вы можете увидеть идентификатор ключа доступа, секретный ключ доступа и токен сеанса. откуда бы вы его ни направили, в нашем случае stdout вручную или с помощью сценария. Затем вы можете присвоить эти значения переменным среды (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN)

Итак, давайте проверим конфигурации, упомянутые выше, шаг за шагом, но с некоторыми деталями режима:

  1. Как и прежде, представленное в учетной записи A, она создает доверие к учетной записи B, создавая роль с именем RoleForB и прикрепляя к ней ReadOnlyAccess разрешение.
{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Principal": {"AWS": "arn:aws:iam::Account_B_ID:root"},
        "Action": "sts:AssumeRole"
    }
}
  1. В учетной записи B создайте роль с именем AssumeRoleInA, затем прикрепите соответствующий policy, чтобы позволить ей взять на себя роль с именем RoleForB в учетной записи A.
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Resource": [
        "arn:aws:iam::Account_A_ID:role/RoleForB"
      ]
    }
  ]
}
  1. В учетной записи B создайте новый экземпляр EC2 (если он еще не существует) и свяжите его профиль ec2 с Роль 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"`
person abdullahkhawer    schedule 17.09.2019
comment
Спасибо за Ваш ответ. Я думаю, что ваш accountA - мой a2 (с ECR), а ваш accountB - мой a1 (с экземпляром EC2). Уловка в вашем ответе, похоже, состоит в том, чтобы экземпляр EC2 в a1 взял на себя роль, определенную в a2, верно? Я дам ему попробовать. Не могли бы вы свести к минимуму свой ответ и убрать какую-то роль, потому что я не думаю, что необходимо все, о чем вы упомянули. - person Richard Kiefer; 18.09.2019
comment
Кроме того, не могли бы вы подсказать, что делать с ключами? Поскольку я просто хотел бы получить доступ к ECR через aws ecr, могу ли я каким-то образом временно взять на себя роль, не сохраняя никаких ключей в среде? Я не нашел никаких параметров командной строки для принятия роли. - person Richard Kiefer; 18.09.2019
comment
Шаг 4 проверки @RichardKiefer для предположения роли. - person abdullahkhawer; 18.09.2019

Если вы хотите извлекать и отправлять образы из экземпляра EC2 одной учетной записи в ECR другой учетной записи и не нуждаетесь в полной функциональности aws ecr CLI, вы можете сделать это через докер. Например, если вы хотите, чтобы ваш Jenkins отправлял встроенные образы в ECR на основе целевой среды (производственной, промежуточной), находящейся в разных учетных записях AWS.

Выполнение этого через докер описано на странице https://aws.amazon.com/premiumsupport/knowledge-center/secondary-account-access-ecr/

Проще говоря, в репозитории ECR вы предоставляете другой учетной записи необходимые разрешения.

Затем вы получаете временный токен аутентификации для авторизации докера для ECR через:

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

После этого вы можете использовать docker pull и docker push для доступа к нему.

person Richard Kiefer    schedule 18.09.2019
comment
Это работает только для основных / дополнительных учетных записей? Будет ли это работать для совершенно не связанных аккаунтов AWS? - person Anatolii Stepaniuk; 20.07.2021
comment
Привет, @AnatoliiStepaniuk, каков общий знаменатель этих совершенно не связанных аккаунтов AWS? Вы можете сделать свой репозиторий ECR общедоступным, если вы этого хотите. В противном случае, если вы хотите предоставить доступ нескольким другим учетным записям AWS, вы можете настроить их так же, как и одну дополнительную. - person Richard Kiefer; 21.07.2021
comment
Привет, Ричард. Я добавил разрешения ECR для другой несвязанной учетной записи и смог получить изображения из этой несвязанной учетной записи. Так что простого добавления разрешений ECR (в консоли ECR) было достаточно. - person Anatolii Stepaniuk; 21.07.2021

Вам необходимо установить доверительные отношения между вашей учетной записью a1 и a2.

Из консоли a2 перейдите в службу IAM, создайте новую роль:

1) Доверенная организация: другая учетная запись AWS (введите идентификатор учетной записи a1)

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": "*"
    }
}
person Leondkr    schedule 17.09.2019
comment
Спасибо, что уделили время моим именам. Это в значительной степени то, что также предлагается в medium.com/miq-tech-and-analytics/ Но вход в a1.ec2, который выполняется с asummed-ролью a1.r (aOne! ) Я все еще получаю ту же ошибку. Должен ли экземпляр EC2 взять на себя вашу недавно созданную роль a2.r? - person Richard Kiefer; 18.09.2019