Как исправить AccessDenied, вызвав CopyObject

Я пытаюсь скопировать файлы из корзины в учетной записи A в другую корзину, но в учетной записи B. Когда я пытаюсь синхронизировать файлы с командой

aws s3 sync s3://BUCKET_A s3://BUCKET_B

Возвращает следующий вывод:

copy failed: s3://BUCKET_A to s3://BUCKET_B An error occurred (AccessDenied) when calling the CopyObject operation: Access Denied

Это политика, которая была прикреплена к пользователю, созданному в учетной записи B (куда будут скопированы файлы из корзины A):

{
    "Version": "2012-10-17",
    "Statement": [
      {
          "Effect": "Allow",
          "Action": [
              "s3:ListBucket",
              "s3:GetObject",
              "s3:PutObject",
              "s3:PutObjectAcl"
          ],
          "Resource": [
              "arn:aws:s3:::BUCKET_A",
              "arn:aws:s3::: BUCKET_A/*"
          ]
      },
      {
          "Effect": "Allow",
          "Action": [
              "s3:ListBucket",
              "s3:GetObject",
              "s3:PutObject",
              "s3:PutObjectAcl"
          ],
          "Resource": [
              "arn:aws:s3:::BUCKET_B",
              "arn:aws:s3:::BUCKET_B/*"
          ]
      }
    ]
}

Возможно, я пропустил какое-то разрешение? Я не нахожу разрешения CopyObject добавить в мою политику пользователя / корзины

10 ответов

На стороне вашей политики ролей IAM вам потребуется следующее:

  {
    "Version": "2012-10-17",
    "Statement": [
      {
          "Effect": "Allow",
          "Action": [
              "s3:ListBucket",
              "s3:GetObject",
              "s3:PutObject",
              "s3:PutObjectAcl"
          ],
          "Resource": [
              "arn:aws:s3:::BUCKET_A",
              "arn:aws:s3::: BUCKET_A/*"
          ]
      },
      {
          "Effect": "Allow",
          "Action": [
              "s3:ListBucket",
              "s3:GetObject",
              "s3:PutObject",
              "s3:PutObjectAcl"
          ],
          "Resource": [
              "arn:aws:s3:::BUCKET_B",
              "arn:aws:s3:::BUCKET_B/*"
          ]
      }
    ]
}

Вам нужно добавить эти разрешения в BUCKET_B

{
         "Sid": "Example permissions",
         "Effect": "Allow",
         "Principal": {
            "AWS": "arn:aws:iam::your_iam_policy"
         },
         "Action": [
              "s3:ListBucket",
              "s3:GetObject",
              "s3:PutObject",
              "s3:PutObjectAcl"
          ],
         ],
         "Resource": [
            "arn:aws:s3:::BUCKET_B"
         ]
      }

В моем случае у меня не было проблем с некоторыми объектами, однако у одного из них была та же ошибка CopyObject, указанная в вопросе. Я также использовал команду синхронизации между сегментами кросс-аккаунтов.

Итак, я взглянул на историю событий в AWS CloudTrail (поскольку у меня была настроена облачная трасса) - это помогает увидеть, какие вызовы API вызываются. Однако у меня не было включено ведение журнала событий для сегментов S3 и объектов , поэтому я попробовал внести несколько изменений, начиная с put *, и это сработало. Затем я быстро сузился до того, что мне было нужно.

В конечном итоге это позволило мне добавить это разрешение в мою политику корзины : s3:PutObjectTagging .

Надеюсь, это тоже поможет вам!

Вам не хватает s3:GetObjectTagging и s3:PutObjectTaggingразрешения, указанные здесь: https://medium.com/collaborne-engineering/s3-copyobject-access-denied-5f7a6fe0393e .

В моем случае это сработало.

      {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:PutObject",
                "s3:GetObjectAcl",
                "s3:GetObject",
                "s3:PutObjectVersionAcl",
                "s3:GetObjectTagging",
                "s3:DeleteObject",
                "s3:GetBucketLocation",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::source-bucket/*",
                "arn:aws:s3:::destination-bucket/*",
                "arn:aws:s3:::source-bucket",
                "arn:aws:s3:::destination-bucket"
            ]
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "s3:ListAllMyBuckets",
            "Resource": "*"
        }
    ]
}

Я следовал этому подходу

https://aws.amazon.com/premiumsupport/knowledge-center/copy-s3-objects-account/

для копирования/синхронизации объектов из исходной корзины учетной записи aws в целевую корзину учетной записи aws. Это сработало хорошо для меня.

Вам необходимо настроить AWS CLI на локальном компьютере с пользователем IAM в учетной записи B.

Вы можете иметь столько профилей, сколько хотите в вашей локальной конфигурации cli. Дополнительные сведения см. В разделе Конфигурация интерфейса командной строки AWS.

Теперь при копировании добавьте параметр --profile в команду синхронизации. например.

aws s3 sync s3://BUCKET_A s3://BUCKET_B --profile <NEW-AWS-CLI-PROFILE-FOR-ACCOUNT-B>

Обратите внимание, что я основываю свой ответ на ответе Майкла .

В моем случае мне нужно было иметь в дополнение к s3:GetObject и s3:ListObject мне нужно было разрешение s3:GetObjectTagging

Для дальнейшего справки

Таким образом, моя политика корзины исходного кода выглядела следующим образом:

              {
            "Sid": "DelegateS3Access",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::destination-account:root"
            },
            "Action": [
                "s3:ListBucket",
                "s3:GetObject",
                "s3:GetObjectTagging"
            ],
            "Resource": [
                "arn:aws:s3:::source-bucket/*",
                "arn:aws:s3:::source-bucket"
            ]
        }

Пожалуйста, имейте в виду, что у меня былов целевой учетной записи, поэтому мне не нужно было ничего прикреплять к роли IAM моего целевого пользователя

Вероятно, это связано с шифрованием объекта в целевом сегменте. Глядя на вставленную вами роль IAM, похоже, что все необходимые разрешения предоставлены.

Чтобы решить эту проблему, запустите ту же команду и добавьте к ней --sse AES256.

      aws s3 sync s3://BUCKET_A s3://BUCKET_B --sse AES256

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

      ...
    "Condition": {
        "StringNotEquals": {
            "s3:x-amz-server-side-encryption": "AES256"
        }
    }
...

Вы можете найти политику корзины на вкладке Permissions => Bucket policy в S3 GUI, как только вы окажетесь в целевом сегменте.

1 - отключить блокировку публичного доступа 2 - оставить ведро незашифрованным 3 - найти свой общедоступный IP:4 - добавить политику ниже в корзину s3

      {
    "Version": "2008-10-17",
    "Id": "Policy1357935677554",
    "Statement": [
        {
            "Sid": "Stmt1357935647218",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::YOUR-S3-BUCKET-NAME",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "YOUR-PUBLIC-IP/32"
                }
            }
        },
        {
            "Sid": "Stmt1357935676138",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::YOUR-S3-BUCKET-NAME/*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "YOUR-PUBLIC-IP/32"
                }
            }
        }
    ]
}

AWSS3МИГРАЦИЯ

1 . CREATECREDENTIAL для учетной записи, из которой вы запускаете команду aws_s3_sync_bucketsource_bucketdest:awsgui, mysecuritycredential, acess_keys, create_new_access_key;

1b. запустите команду: aws_configure в оболочке bash;

2. awsgui, s3, bucket_x1, overview, выбрать все каталоги, действия, make_everything_public;

3. awsgui, s3, bucket_x1, разрешение, control_list, общий доступ;

4. awsgui, s3, bucket_x1, обзор, выбор всех каталогов, действий, изменение класса хранилища на стандартный.

5. сделайте пункты 2, 3, 4 также для bucket_2.

ОБОЗНАЧЕНИЕ: bucket_x1 - источник, bucket_x2 - место назначения.

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