AWS Billing Report S3 Bucket предоставляет разрешения на чтение для другой учетной записи - PullRequest
0 голосов
/ 02 мая 2018

Итак, как следует из названия, это очень специфическая ошибка, которую мне удалось найти. У нас есть одна учетная запись, в которой хранятся все данные для выставления счетов и которая затем сохраняется в корзине S3 в виде почасовых отчетов.

Тогда, однако, у нас есть другая учетная запись, у которой есть экземпляр EC2, для которого мы хотели бы предоставить разрешения GetObject для нашего биллинг-ведра. И все же я не могу этого сделать, потому что AWS CloudWatch, загружая отчеты на S3, не устанавливает для acl значение bucket-owner-full-control? Я в недоумении, почему это происходит.

fatal error: An error occurred (403) when calling the HeadObject operation: Forbidden

Это ошибка, когда я пытаюсь скопировать объект hourly-Manifest.json из корзины выставления счетов, используя AWS-CLI моего экземпляра EC2.

Разрешения устанавливаются для биллинг-аккаунта следующим образом, где Принципал является вторым корнем аккаунта.

{
      "Sid": "ClaudiaReadOnly",
      "Effect": "Allow",
      "Principal": {
          "AWS": "arn:aws:iam::xxxxxxxxxxxx:root"
      },
      "Action": [
        "s3:Get*",
        "s3:List*"
      ],
      "Resource": [
        "arn:aws:s3:::billing-bucket",
        "arn:aws:s3:::billing-bucket/billing/*"
      ]
}

Вторая учетная запись предоставляет разрешения для экземпляра EC2 с использованием шаблона CloudFormation с теми же разрешениями Get * и List *.

Если мы установим разрешение на чтение одного объекта непосредственно из консоли для второй учетной записи, мы сможем скопировать его, используя AWS-CLI экземпляра EC2. Но тогда для каждого другого объекта мы получаем ту же ошибку 403.

Очень расстраивает отладка этой проблемы, и мне бы хотелось, чтобы у AWS было немного лучшей информации по этому вопросу ...

1 Ответ

0 голосов
/ 11 сентября 2018

Проблема здесь в том, что другая учетная запись (AWS Billing) создает ваши отчеты о выставлении счетов в вашей корзине для выставления счетов, и это ведет вас в темный мир списков ACL для объектов S3 - см. https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html

Если вы обращались к корзине S3 из своей платежной учетной записи, у вас не возникнет проблем, поскольку платежная учетная запись является владельцем корзины и ей всегда предоставляется доступ, однако для других учетных записей единственным способом предоставления доступа является либо Writer (AWS Billing) для установки соответствующих списков ACL при копировании (этого не произойдет) или для ретроспективного изменения ACL.

Вот список ACL объекта по умолчанию, который создается для отчета о выставлении счетов:

$ aws s3api get-object-acl --bucket my-billing-bucket --key reports/xxx/xxx.json
{
    "Owner": {
        "DisplayName": "aws-billpresentation+artifact-storage",
        "ID": "aaaaaaaaaa"
    },
    "Grants": [
        {
            "Grantee": {
                "DisplayName": "aws-billpresentation+artifact-storage",
                "ID": "aaaaaaaaaa",
                "Type": "CanonicalUser"
            },
            "Permission": "FULL_CONTROL"
        },
        {
            "Grantee": {
                "DisplayName": "mybilling",
                "ID": "xxxxxxxxxxx",
                "Type": "CanonicalUser"
            },
            "Permission": "FULL_CONTROL"
        }
    ]
}

В приведенном выше примере aws-billpresentation + artifact-storage - это имя платежной учетной записи AWS, которая записывает ваши отчеты, тогда как mybiling - это имя платежной учетной записи, в которой находится ваша корзина.

Если вы хотите предоставить доступ на чтение другой учетной записи, вам нужно будет найти канонический идентификатор этой учетной записи, а затем добавить грант READ, повторяя это для каждого файла. Например:

aws s3api put-object-acl --bucket my-billing-bucket --key reports/xxx/xxx.json --access-control-policy '{
 "Owner": {
     "DisplayName": "aws-billpresentation+artifact-storage",
     "ID": "aaaaaaaa"
 },
 "Grants": [
     {
         "Grantee": {
             "DisplayName": "aws-billpresentation+artifact-storage",
             "ID": "aaaaaaaa",
             "Type": "CanonicalUser"
         },
         "Permission": "FULL_CONTROL"
     },
     {
         "Grantee": {
             "DisplayName": "mybilling",
             "ID": "xxxxxxxx",
             "Type": "CanonicalUser"
         },
         "Permission": "FULL_CONTROL"
     },
     {
         "Grantee": {
             "DisplayName": "myotheraccount",
             "ID": "yyyyyyyy",
             "Type": "CanonicalUser"
         },
         "Permission": "READ"
     }
   ]
}'

Самый простой вариант - публиковать отчеты в той учетной записи, где вы хотите фактически обрабатывать отчеты, что позволяет избежать всех проблем ACL объекта S3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...