По умолчанию бакеты в Object Storage создаются с приватным доступом. Это значит, что выполнять действия с бакетом и его объектами можно только через авторизованные запросы — запросы, которые содержат подпись AWS SigV4. Подписывать запросы могут пользователи и сервисные аккаунты, у которых есть ключ доступа к API Object Storage.
Чтобы обращаться к бакету без авторизации, настройте для него публичный доступ и задайте глобальное название или доменное имя. Разрешение на неавторизованные запросы можно выдать для любой операции с хранилищем — например, для скачивания объектов, их загрузки, управления конфигурацией бакета и т. д.
Публичный доступ к бакету дает возможность совершать операции с объектами широкому кругу лиц. Убедитесь заранее, что в публичный доступ не попадает конфиденциальная информация.
Cloud.ru как поставщик инфраструктуры обеспечивает надежность хранения данных в облаке. Вы как владелец самих данных обеспечиваете контроль доступа к ним и отвечаете за их сохранность. Подробнее — в пунктах 1.1.6, 1.1.9, 1.2 Приложения 3 к Договору.
Напишите в техническую поддержку — и мы расскажем, с чего начать, чтобы правильно организовать работу с Object Storage.
Чтобы настроить публичный доступ, используйте политику доступа (Bucket Policy) или Access Control List (ACL).
При настройке публичного доступа через AWS CLI и API в качестве адреса хранилища <endpoint> указывайте s3.cloud.ru.
С помощью Bucket Policy можно предоставить всем пользователям интернета доступ к отдельным операциям с бакетом и его объектами. В качестве операции можно указать можно указать любой метод AWS S3 API.
Инструкция ниже описывает, как открыть публичный доступ к скачиванию объектов (GetObject), просмотру их метаданных (HeadObject) и загрузке объектов (PutObject). Разрешения будут действовать для заданного бакета.
Авторизуйтесь в личном кабинете.
На верхней панели слева нажмите и выберите Хранение данных → Object Storage.
Выберите бакет.
В меню слева нажмите Безопасность и перейдите на вкладку Bucket Policy.
Настройте политику доступа одним из способов:
Чтобы разрешить публичный доступ только к скачиванию объектов и просмотру их метаданных, включите опцию Публичный доступ к бакету.
Чтобы разрешить публичный доступ к скачиванию объектов, просмотру их метаданных и загрузке объектов, сгенерируйте соответствующую политику в формате json и вставьте ее в поле Расширенные настройки. Формат политики:
{"Version": "2012-10-17","Statement": [{"Sid": "AllowPublicAccess","Effect": "Allow","Principal": "*","Action": ["s3:GetObject","s3:PutObject"],"Resource": "arn:aws:s3:::<bucket_name>/*"}]}
Где <bucket_name> — название бакета.
Нажмите Сохранить.
В правом верхнем углу нажмите Редактировать.
Откроется страница редактирования бакета.
Установите глобальное название или доменное имя бакета, если ни один из этих параметров не задан.
Неавторизованные обращения к хранилищу возможны только по глобальному названию или доменному имени.
(Опционально) Проверьте публичный доступ к бакету.
Чтобы запретить неавторизованный доступ к бакету:
Если помимо Bucket Policy в бакете установлены настройки ACL, разрешающие публичный доступ, ACL нужно отредактировать отдельно.
Авторизуйтесь в личном кабинете.
На верхней панели слева нажмите и выберите Хранение данных → Object Storage.
Выберите бакет.
В меню слева нажмите Безопасность и перейдите на вкладку Bucket Policy.
Выключите опцию Публичный доступ к бакету.
Нажмите Сохранить.
Публичный доступ будет закрыт. Если в бакете есть другие настройки Bucket Policy, они продолжат действовать.
С помощью ACL можно разрешить всем пользователям интернета выполнять группы операций, доступные сервисным ролям. Разрешение действует для заданного бакета.
Инструкция ниже описывает, как предоставить публичный доступ к правам ролей s3e.viewer и s3e.editor: просмотру метаданных объектов (HeadObject), скачиванию объектов (GetObject), их загрузке (PutObject) и т. д.
Управлять ACL через личный кабинет нельзя. Для настройки публичного доступа в личном кабинете используйте Bucket Policy.
Включите возможность управлять ACL в бакете — измените настройки владения объектами (OwnershipControls) на значение ObjectWriter или BucketOwnerPreferred.
Пример для ObjectWriter:
aws s3api put-bucket-ownership-controls \--endpoint-url=https://<endpoint> \--bucket <bucket_name> \--ownership-controls="Rules=[{ObjectOwnership=ObjectWriter}]"
Где:
<endpoint> — адрес хранилища.
<bucket_name> — название бакета.
По умолчанию бакет создается с типом владения BucketOwnerEnforced — при такой настройке изменять ACL запрещено. Типы владения ObjectWriter и BucketOwnerPreferred позволяют настраивать ACL пользователям, у которых есть соответствующая роль.
Обновите ACL бакета — разрешите чтение (--grant-read) и запись данных (--grant-write) всем пользователям (AllUsers):
aws s3api put-bucket-acl \--endpoint-url=https://<endpoint> \--bucket <bucket_name> \--grant-read uri='"http://acs.amazonaws.com/groups/global/AllUsers"' \--grant-write uri='"http://acs.amazonaws.com/groups/global/AllUsers"'
Опция --grant-read регулирует доступ к разрешениям роли s3e.viewer, --grant-write — к разрешениям s3e.editor.
Проверьте, что для бакета задано глобальное название или доменное имя — неавторизованные обращения к хранилищу возможны только по этим именам.
(Опционально) Проверьте публичный доступ к бакету.
Чтобы запретить неавторизованный доступ к бакету, воспользуйтесь одним из способов:
Отредактируйте ACL вручную. Способ подойдет, если в ACL есть другие разрешения, которые нужно сохранить — например доступ к операциям для отдельных пользователей. Вы удалите только настройки публичного доступа, остальные разрешения продолжат действовать.
Сбросьте ACL до настроек по умолчанию. Если сохранять текущие настройки ACL не нужно и требуется оставить полный доступ только владельцу бакета. Настройки публичного доступа и другие пользовательские разрешения будут удалены, но ACL продолжит использоваться в бакете.
Запретите использование ACL в бакете. Если управление доступом через ACL больше не нужно. Существующий ACL будет игнорироваться, настраивать разрешения можно будет через другие механизмы управления доступом, например Bucket Policy. Позже использование ACL можно снова включить.
Если помимо ACL в бакете установлены настройки Bucket Policy, разрешающие публичный доступ, Bucket Policy нужно отредактировать отдельно.
Удалите из списка ACL права, выданные всем пользователям, и обновите ACL:
Получите текущий ACL:
aws s3api get-bucket-acl \--endpoint-url=https://<endpoint> \--bucket <bucket_name>
Где:
<endpoint> — адрес хранилища.
<bucket_name> — название бакета.
Удалите из списка разрешения, выданные группе AllUsers, и сохраните новый ACL в json-файл. Пример файла:
{"Owner": {"ID": "acb8b360-4274-4c54-ab84-f1ed********"},"Grants": [{"Grantee": {"ID": "acb8b360-4274-4c54-ab84-f1ed********","Type": "CanonicalUser"},"Permission": "FULL_CONTROL"},{"Grantee": {"ID": "d94c9f7b-1a2e-4f3c-9b8d-7e21********","Type": "CanonicalUser"},"Permission": "READ"}]}
ACL предоставляет полный доступ к ресурсам владельцу бакета и выдает разрешения роли s3e.viewer пользователю d94c9f7b-1a2e-4f3c-9b8d-7e21********.
Обновите ACL:
aws s3api put-bucket-acl \--endpoint-url https://<endpoint> \--bucket <bucket_name> \--access-control-policy <path_to_acl_file>
Где:
<endpoint> — адрес хранилища.
<bucket_name> — название бакета.
<path_to_acl_file> — путь к json-файлу с обновленным ACL.
Обновите ACL до значения по умолчанию — задайте для бакета предопределенный ACL (Canned ACL) типа private.
Передайте параметр --acl private в команде put-bucket-acl:
aws s3api put-bucket-acl \--endpoint-url=https://<endpoint> \--bucket <bucket_name> \--acl private
Где:
<endpoint> — адрес хранилища.
<bucket_name> — название бакета.
Публичный доступ будет закрыт. У владельца бакета будет полный доступ к ресурсам.
Измените настройки владения объектами бакета (OwnershipControls) на значение BucketOwnerEnforced. В бакете нельзя будет устанавливать ACL. Ранее настроенный ACL будет игнорироваться.
aws s3api put-bucket-ownership-controls \--endpoint-url=https://<endpoint> \--bucket <bucket_name> \--ownership-controls="Rules=[{ObjectOwnership=BucketOwnerEnforced}]"
Где:
<endpoint> — адрес хранилища.
<bucket_name> — название бакета.
Чтобы проверить публичный доступ к бакету, отправьте неавторизованный запрос. В запросе используйте один из способов адресации:
по глобальному названию — https://global.s3.cloud.ru/<global_bucket_name>/<object_key>.
по доменному имени — https://<domain_bucket_name>.s3.cloud.ru/<object_key>.
Где:
<global_bucket_name> — глобальное название бакета.
<object_key> — ключ (название) объекта.
<domain_bucket_name> — доменное имя бакета.
Глобальное название и доменное имя бакета доступны в личном кабинете на странице с информацией о бакете.
Запросы ниже проверяют публичный доступ на скачивание (GetObject) или загрузку объектов (PutObject). В примерах используется доменное имя бакета.
Пример загрузки объекта my-object из файла path/to/my_text.txt в бакет my-bucket по доменному имени:
curl --location --request PUT 'https://my-bucket.s3.cloud.ru/my-object' \--header 'Content-Type: text/plain' \--data '@path/to/my_object.txt'
Пример скачивания объекта my-object из бакета my-bucket в файл my-object.txt по доменному имени:
curl --location --request GET 'https://my-bucket.s3.cloud.ru/my-object' -o my-object.txt