Ошибка доступа запрещена при загрузке объекта в корзину s3 - PullRequest
0 голосов
/ 28 марта 2019

Я пытаюсь настроить службу, которая получает файл (изображение, видео) и загружает его в мое хранилище s3. Мы хотим перейти от общедоступного сегмента к тому, который доступен только определенным пользователям, который теоретически имеет мой аккаунт:

Список контроля доступа к ведру

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

Я пробовал несколько вещей, включая добавление этой политики в корзину:

{
    "Id": "Policy1553720963443",
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1553720961364",
            "Action": "s3:*",
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::<BUCKETNAME>/*",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::<iamid>:user/<me>@<company>"
                ]
            }
        }
    ]
}

Конфигурация CORS:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>PUT</AllowedMethod>
        <AllowedMethod>POST</AllowedMethod>
    <AllowedHeader>Authorization</AllowedHeader>
    </CORSRule>
</CORSConfiguration>

И даже добавление себя в группу с такой политикой:

{
"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "VisualEditor0",
        "Effect": "Allow",
        "Action": [
            "s3:*"
        ],
        "Resource": "*"
    },
    {
        "Sid": "VisualEditor1",
        "Effect": "Allow",
        "Action": "s3:*",
        "Resource": [
            "arn:aws:s3:::<BUCKETNAME>/*",
            "arn:aws:s3:::<BUCKETNAME>"
        ]
    }
]

}

Ни один из них не имел никакого влияния на "Ошибка отказа в доступе"

Может кто-нибудь помочь мне здесь? Можно ли получить дополнительную информацию об ошибке «Отказано в доступе»? Я пытался использовать fiddler для получения подробного ответа от aws, но использование fiddler, похоже, вызывает ошибку тайм-аута шлюза, поэтому это не помогает.

Любой совет будет принят с благодарностью. Спасибо!

~ Josh

Edit, вот код, который я пытаюсь загрузить:

        private static readonly string serviceURL = ConfigurationManager.AppSettings["ServiceURL"];
    private static readonly string BucketName = ConfigurationManager.AppSettings["BucketName"];
    private static readonly long UploadPartSize = Convert.ToInt64(ConfigurationManager.AppSettings["UploadPartSize"]);

    private static AmazonS3Config config = new AmazonS3Config { ServiceURL = serviceURL, ForcePathStyle = true, RegionEndpoint = RegionEndpoint.USWest2 };
    private readonly AmazonS3Client _s3Client = new AmazonS3Client(config);

private async Task<string> UploadFileAsync(string contentType, Stream stream, long length, UploadVideoParams @params, CancellationToken token)
    {
        using (var fileTransferUtility = new TransferUtility(_s3Client))
        {
            var now = DateTime.UtcNow;
            var key = MakeS3Key(@params);

            try
            {
                await fileTransferUtility.UploadAsync(new TransferUtilityUploadRequest
                {
                    BucketName = BucketName,
                    AutoCloseStream = true,
                    AutoResetStreamPosition = false,
                    InputStream = new WrapperStream(stream, length),
                    PartSize = UploadPartSize,
                    StorageClass = S3StorageClass.Standard,
                    Key = key,
                    CannedACL = S3CannedACL.PublicRead,
                    ContentType = contentType
                }, token).ConfigureAwait(false);

                LogInfo(@params.TransactionId, "Made Upload Async call. Key: " + key);
                return key;
            }
            catch (Exception e)
            {
                await fileTransferUtility.AbortMultipartUploadsAsync(BucketName, now, token).ConfigureAwait(false);
                HandleError(@params.TransactionId, e);
                throw e;
            }
        }
    }

Ответы [ 2 ]

0 голосов
/ 28 марта 2019

Я понял это!Оказывается, это была строка «CannedACL = S3CannedACL.PublicRead» в моей загрузке.Контейнер был правильно настроен на запрет любого публичного доступа, но эта строка хотела сделать общедоступным загруженный файл.

Теперь эта строка:

CannedACL = S3CannedACL.BucketOwnerFullControl,

Потому что это настройка доступа, которую мы имеем для корзины.Хотелось бы, чтобы ошибка была немного более конкретной, но это то, что мы получили.Я надеюсь, что это поможет кому-то еще в этом вопросе!

0 голосов
/ 28 марта 2019

Можете ли вы попробовать что-нибудь для меня и посмотреть, работает ли оно?
Полностью удалить политику корзины из корзины, перейти к IAM, найти пользователя / группу / роль и прикрепить политику против пользователя, которая предоставляет вам доступ кS3.Для тестирования должна быть управляемая политика с именем S3FullAccess, присоедините ее и протестируйте.Чтобы узнать, к какому пользователю / группе / роли вам нужно присоединить это, запустите aws sts get-caller-identity в своем локальном клиенте, и он должен сообщить вам.Примечание. Если это работает, и вы планируете запускать этот код на экземпляре ec2, эти разрешения необходимо назначить роли экземпляра ec2.

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

Практическое правило, которое я обычно использую, состоит в том, что если корзине требуется доступ к нескольким учетным записям, используйте политику корзины, если корзина находится в той же учетной записи, используйте разрешения IAM для управления доступом.Это сделает управление всем последовательным и легким в будущем.

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