Поиск по сайту:

Как управлять публичным доступом к корзине AWS S3


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

Стоит ли сделать корзину S3 общедоступной?

Короткий ответ: вероятно, нет, и определенно нет, если у вас есть какие-либо конфиденциальные данные. В большинстве случаев лучше иметь что-то перед корзиной, например сервер API, который может отвечать на запросы и выполнять аутентификацию, а не просто открывать все объекты.

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

Другая конфигурация — это «общедоступный» доступ, но с белым списком IP-адресов через политику корзины, чтобы заблокировать его только для ваших серверов. Это не превосходит безопасность простого использования ключей доступа IAM, но избавляет вас от управления ключами и позволяет корзине функционировать так же, как в вашей частной подсети. Однако, если вы работаете на EC2, вам нужно просто предоставить роли IAM для экземпляра разрешение на доступ к корзинам.

Одна вещь, которую вы никогда не захотите включать, — это публичный доступ для записи — это дает любому человеку в мире возможность писать в вашу корзину, удалять элементы или заполнять ее большими и дорогими объектами. Существует очень мало случаев использования, когда вы хотели бы сделать это, а не иметь перед собой сервер API для обработки запросов для вас, но если вам нужна какая-то форма публичной записи, вы должны по крайней мере только включить s3: Разрешения PutObject, а не полное «запись».

Настройка общего доступа

Существует несколько различных способов управления публичным доступом к корзинам. По умолчанию S3 включает все средства защиты, делая весь бакет закрытым. Вы можете выборочно отключить их, чтобы включить различные уровни общедоступных данных.

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

Если вы снимите все флажки, ведро будет отображаться как «Объекты могут быть общедоступными». Даже если все это отключено, вам все равно нужно включить общий доступ с помощью ACL для самого объекта при его загрузке. Обычно это делается с помощью public-read ACL:

--acl public-read

Вы можете убедиться, что это работает, щелкнув настройки объекта и проверив, установлено ли для параметра «Чтение объекта» в разделе «Общий доступ» значение true.

Однако это необязательно и устанавливается на уровне объекта. Если вы хотите иметь общедоступные и частные объекты в одном сегменте, вы можете сделать это, хотя вы можете рассмотреть возможность использования отдельных сегментов, чтобы избежать путаницы.

Предоставление доступа к корзине

Чтобы еще раз внести ясность, полностью общедоступные корзины S3 предназначены для размещения статического веб-контента, где каждый объект в корзине предназначен для доступа в открытый Интернет. Для всего, что требует какого-либо общего доступа, вы должны управлять этим на уровне объекта с помощью списка управления доступом.

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

{
    "Version": "2012-10-17",
    "Id": "S3PolicyId1",
    "Statement": [
        {
            "Sid": "IPAllow",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:getObject",
            "Resource": "arn:aws:s3:::test-bucket-csit/*"
        }
    ]
}

AWS, конечно же, выдаст вам множество предупреждений о том, что это ведро имеет общий публичный доступ. По своей сути это неплохо, но, вероятно, лучше управлять этим на уровне объекта, если только это не предназначено специально для размещения веб-сайта.

Даже несмотря на это предупреждение, многие компании совершат ошибку, храня конфиденциальные данные в общедоступных корзинах S3.