AWS ECR GetAuthorizationToken

Я пытался следовать инструкциям AWS по настройке авторизации ECR для моего пользователя, дав AmazonEC2ContainerRegistryFullAccess политика для моего пользователя.

Однако, когда я пытаюсь запустить на своем компьютере aws ecr get-login Я получаю сообщение об ошибке, что у меня нет разрешения.

An error occurred (AccessDeniedException) when calling the GetAuthorizationToken operation: User: arn:aws:iam::ACCOUNT_NUMBER:user/MY_USER is not authorized to perform: ecr:GetAuthorizationToken on resource: *

Что я сделал не так?

11 ответов

Решение

Я обнаружил, что при включении 2FA нет возможности использовать aws ecr get-login, после удаления 2FA из своей учетной записи я получил токен авторизации

Вы должны прикрепить политику к своей роли IAM.

Я прикрепил AmazonEC2ContainerRegistryFullAccess, и это сработало.

Вот полный ответ, после того как я выполнил все шаги - я смог использовать ECR

Ошибка может иметь 2 значения:

1) Вы не авторизованы, потому что у вас нет политики ECR, прикрепленной к вашему пользователю. 2) Вы не авторизованы, потому что вы используете 2FA, и использование cli небезопасно, если вы не установите временный токен сеанса.

Вот список всех шагов, чтобы получить доступ (включая обработку 2FA)

  1. Прежде всего, вы должны создать политику, которая дает вам доступ к действию GetAuthorizationToken в ECR.
  2. Прикрепите эту политику либо к пользователю, либо к группе (IMHO всегда лучше подходит для групп / ролей, мой голос за роли, например, DevOps)
  3. Убедитесь, что в вашей среде установлены AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY. Я рекомендую использовать папку aws с разделенными учетными данными и профилями.

Если у вас включен 2FA

  1. Вам нужно сгенерировать токен сеанса с помощью этой командыaws sts get-session-token --serial-number arn-of-the-mfa-device --token-code code-from-token, arn-of-the-mfa-device можно найти в вашем профиле, раздел 2FA. Токен, генерируется токеном из устройства.
  2. Обновление aws credentails с полученным AccessKeyId, SecretAccessKey, а также SessionToken, AWS рекомендует использовать какое-либо задание cron для обновления токена, что означает, что если вы делаете это, вы что-то тестируете, скорее всего, в ваших ресурсах prod не включена поддержка 2FA. Вы можете увеличить сессию, предоставив --duration-seconds но только до 36 часов. Хорошее объяснение можно найти в authenticate-mfa-cli

Это должно сделать работу

У пользователя должен быть GetAuthorizationToken для всех ресурсов на ECR. Чтобы сделать политику жесткой, вы можете предоставить все действия только желаемому реестру и только ecr:GetAuthorizationToken для всех ресурсов. Вот пример политики, которую можно прикрепить к вашему пользователю:

                  {
                "Version": "2012-10-17",
                "Statement": [
                    {
                        "Action": [
                            "ecr:BatchCheckLayerAvailability",
                            "ecr:BatchGetImage",
                            "ecr:CompleteLayerUpload",
                            "ecr:GetDownloadUrlForLayer",
                            "ecr:InitiateLayerUpload",
                            "ecr:PutImage",
                            "ecr:UploadLayerPart"
                        ],
                        "Effect": "Allow",
                        "Resource": "<REPOSITORY_ARN_HERE>"
                    },
                    {
                        "Action": [
                            "ecr:GetAuthorizationToken",
                        ],
                        "Effect": "Allow",
                        "Resource": "*"
                    }

                ]
            }

В итоге я использовал AmazonEC2ContainerRegistryPowerUser, так как он показался мне лучшим вариантом, чем полный доступ. Вот политики, которые я нашел по состоянию на июнь 2019 года:

Как показано в описании ошибки, я должен разрешить действие "GetAuthorizationToken" в моей политике.

    {
        "Sid": "VisualEditor2",
        "Effect": "Allow",
        "Action": "ecr:GetAuthorizationToken",
        "Resource": "*"
    }

Примечание. Это не полная политика, а подраздел "Заявление".

Если вы пытаетесь извлечь образы из ПУБЛИЧНОГО репозитория AWS, вы должны добавить в свою политику следующие разрешения пользователя:

      {
"Version": "2012-10-17",
"Statement": [
    {
        "Effect": "Allow",
        "Action": [
            "ecr-public:GetAuthorizationToken",
            "sts:GetServiceBearerToken"
        ],
        "Resource": "*"
    }
 ]  
} 

Пожалуйста, ознакомьтесь с полной документацией здесь .

Это был мой парень EC2InstanceProfileForImageBuilderECRContainerBuilds

У меня была такая же проблема с ECS, когда я пытался протолкнуть свой контейнер в хранилище.

Чтобы решить эту проблему, я прикрепил к своей роли в IAM: AmazonECS_FullAccess

Для меня:

                    - Effect: Allow
                Sid: VisualEditor2
                Action:
                  - ecr:GetAuthorizationToken
                  - ecr:BatchGetImage
                  - ecr:GetDownloadUrlForLayer
                Resource: "*"

У меня та же проблема, но я установил permission boundary только до s3 ранее, что вызывает проблему.

Удалил permission boundary,Оно работало завораживающе

Другие вопросы по тегам