Как я могу разрешить экземпляру ec2 иметь частный доступ к корзине S3? - PullRequest
0 голосов
/ 22 декабря 2019

Прежде всего мне известны следующие вопросы:

, но решенияне работают для меня.

Я создал роль "sample_role", прикрепил к ней AmazonS3FullAccess -политику и назначил роль экземпляру ec2.

My bucket-policy выглядит следующим образом:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::My-Account-ID:role/sample_role"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::my_bucket/*"
        }
    ]
}

На моем экземпляре ec2 распечатка моих сегментов работает нормально, как из командной строки (aws s3 ls), так и из скрипта Python. Но когда я пытаюсь загрузить файл test.txt в мое ведро, я получаю AccessDenied:

import boto3

s3_client = boto3.client('s3')
s3_resource = boto3.resource('s3')
bucket = s3_resource.Bucket('my_bucket')

with open('test.txt', "rb") as f:
    s3_client.upload_fileobj(f, bucket.name, 'text.txt')

Сообщение об ошибке:

botocore.exceptions.ClientError: An error occurred (AccessDenied) when calling the PutObject operation: Access Denied

То же самое происходиткогда я просто пытаюсь перечислить объекты в моем ведре . Командная строка aws s3api list-objects --my_bucket или скрипт Python:

import boto3

s3_resource = boto3.resource('s3')
bucket = s3_resource.Bucket('my_bucket')

for my_bucket_object in bucket.objects.all():
    print(my_bucket_object)

Сообщение об ошибке:

botocore.exceptions.ClientError: An error occurred (AccessDenied) when calling the ListObjects operation: Access Denied

Когда я отключаю «Блокировать все публичный доступ» в настройках моего сегментаи включить публичный доступ в моем списке контроля доступа, это, очевидно, работает. Но мне нужно ограничить доступ к указанной роли.

Что мне не хватает? Спасибо за вашу помощь!

Ответы [ 3 ]

1 голос
/ 24 декабря 2019

Когда я отключаю «Блокировать весь публичный доступ» в настройках своего сегмента и включаю публичный доступ в моем списке контроля доступа, это, очевидно, работает.

Удалите «включить публичный доступ» изэто предложение, и это будет вашим решением: -)

«Блокировать весь публичный доступ» блокирует весь публичный доступ, и не имеет значения, какую политику корзины вы используете. Поэтому снимите этот флажок, и ваша политика корзины начнет работать, как вы запланировали.

1 голос
/ 23 декабря 2019

Похоже, что ваше требование:

  • У вас есть корзина Amazon S3 (my_bucket)
  • У вас есть экземпляр Amazon EC2 с присоединенной ролью IAM
  • Вы хотите разрешить приложениям, запущенным на этом экземпляре EC2, доступ к my_bucket
  • Вы не хотите, чтобы корзина была общедоступной

Я также предполагаю, что выне пытаться запретить другим пользователям доступ к корзине, если им уже предоставлен этот доступ. Вы просто хотите Allow доступ к экземпляру EC2, без необходимости Deny доступа к другим пользователям / ролям, которые также могут иметь доступ.

Это можно сделать, добавив политику в роль IAM. который прикреплен к экземпляру EC2:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::my_bucket",
                "arn:aws:s3:::my_bucket/*"
            ]
        }
    ]
}

Это предоставляет ВСЕМ Amazon S3 разрешения роли IAM для my_bucket. Обратите внимание, что некоторые команды требуют разрешения для самого сегмента, в то время как другие команды требуют разрешения для содержимого (/*) сегмента.

Следует также упомянуть, что предоставление s3:*, вероятно, слишком великодушно , потому что это позволило бы приложениям, работающим на экземпляре, удалить содержимое и даже удалить корзину , что, вероятно, не то, что вы хотите предоставить. Если возможно, ограничьте действия только теми, которые необходимы.

0 голосов
/ 24 декабря 2019

Итак, я нашел проблему. Учетные данные моего экземпляра ec2 были настроены с ключом доступа учетной записи dev-пользователя, которому роль не была назначена.

Я обнаружил, запустив aws sts get-caller-identity, который на самом деле возвращает идентификатор (например, роль IAM)используется.

Таким образом, похоже, что назначенная роль может быть перезаписана идентификатором пользователя, что имеет смысл. Чтобы решить проблему, я просто отменил конфигурацию, удалив файл конфигурации ~/.aws/credentials. После этого личность сменилась на назначенную роль.

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