Основные примеры применения ACL и Policy
ACL
ACL или Access Control List — список управления доступом, который определяет, кто или что может получать доступ к файлам или бакету и, какие именно операции разрешено или запрещено выполнять субъекту.
Обратите внимание, за настройку и управление ACL отвечает владелец хранилища.
Для управления нашими S3 хранилищами можно использовать команды из документации AWS CLI.
ACL на объектах позволяет широко регулировать круг действий:
Действия |
Описание |
--public-read |
Выставить публичный ACL на объект |
--private |
Выставить приватный ACL на объект |
--grant-full-control |
Предоставить полный доступ к управлению и регулированию бакета |
--grant-read |
Позволить листить объекты в бакете |
--grant-read-acp |
Позволить читать ACL |
--grant-write |
Позволить записывать, перезаписывать и удалять объекты |
--grant-write-acp |
Позволить писать ACL |
Policy (Политика доступа)
Для детальной настройки прав доступа к файлам и бакетам, используйте политику доступа.
Политика доступа позволяет создавать правила для регулирования не только определённых действий, но и доступов к директориям в бакете для отдельных юзеров/групп/источников.
Для создания политик доступа, используйте формат JSON.
Максимальный размер запроса — 20 КБ.
Обратите внимание, за настройку и управление ACL отвечает владелец хранилища.
Для управления нашими S3 хранилищами можно использовать команды из документации AWS CLI.
Как выглядит policy
В JSON-файле указываются допустимые действия с файлами или бакетами. Для направленного управления запросами действия дополняются условиями (conditions).
Обратите внимание! Все необходимые действия, условия, типы ресурсов описаны в официальной документации.
Основные примеры применения ACL и policy
Ниже перечислены примеры использования ACL и policy.
Как открыть файл для скачивания
Пример выставления публичного acl (--acl public-read) на конкретный объект (cat.jpg) в бакете (my_bucket):
aws s3api put-object-acl --bucket my_bucket --key cat.jpg --acl public-read --endpoint-url=https://s-dt2.cloud.edgecore.ru
где:
my_bucket — название бакета, к которому следует применить acl.
cat.jpg — название файла, который будет открыт для скачивания.
s-dt2.cloud.edgecore.ru — hostname хранилища, в котором находится ваш бакет.
После применения этой команды объект cat.jpg будет доступен любому по ссылке https://s-ed1.cloud.edgecore.ru/my_bucket/cat.jpg
Как сделать файлы в бакете публичными
Пример политики доступа, которая разрешает доступ к объектам на скачивание ("Action": "s3:GetObject") для всех ("Principal": "*") в бакете ("Resource": "arn:aws:s3:::my_bucket/*").
Важно! Такая политика доступа позволяет получать файлы по прямой ссылке, но не позволяет листить файлы в бакете.
1. Создайте JSON файл с такой политикой:
{ "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::my_bucket/*" } ] }
Важно: в строке "Resource" вместо my_bucket вставьте название бакета, файлы которого должны быть публичными.
2. Примените политику доступа на выбранный бакет:
aws s3api put-bucket-policy --policy file://policy.json --endpoint-url=https://s-dt2.cloud.edgecore.ru --bucket my_bucket
где:
policy.json — путь до JSON-файла с политикой.
s-dt2.cloud.edgecore.ru — hostname хранилища, в котором находится ваш бакет.
my_bucket — название бакета, к которому следует применить политику.
Как скрыть директорию
Пример политики доступа, которая запрещает всем пользователям доступ к операции ("s3:GetObject") в директории бакета (my_bucket/secret/*"), но разрешает доступ к бакету (my_bucket/*").
1. Создайте JSON файл с такой политикой:
{ "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::my_bucket/*" }, { "Effect": "Deny", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::my_bucket/secret/*" } ] }
Важно:
В первом блоке в строке "Resource" вместо my_bucket/* укажите путь до бакета, к которому нужно разрешить доступ.
Во втором блоке в строке "Resource" замените my_bucket/secret/* на путь до директории, которую вы хотите скрыть.
2. Примените политику доступа на выбранный бакет:
aws s3api put-bucket-policy --policy file://policy.json --endpoint-url=https://s-dt2.cloud.edgecore.ru --bucket my_bucket
где:
policy.json — путь до JSON-файла с политикой.
s-dt2.cloud.edgecore.ru — hostname хранилища, в котором находится ваш бакет.
my_bucket — название бакета, к которому следует применить политику.
Как разрешить запросы с некоторых IP
Пример политики доступа, которая разрешает запросы к хранилищу с указанного IP ("IpAddress": {"aws:SourceIp": "10.0.0.0/24", "11.0.0.0/24"}).
1. Создайте JSON файл с такой политикой:
{ "Statement": [ { "Sid": "IPAllow", "Effect": "Allow", "Principal": "*", "Action": "s3:*", "Resource": [ "arn:aws:s3:::", "arn:aws:s3:::*" ], "Condition": { "IpAddress": { "aws:SourceIp": [ "10.0.0.0/24", "11.0.0.0/24" ] } } } ] }
Важно: в строке "Condition" замените IP-адреса 10.0.0.0/24 и на 11.0.0.0/24 на желаемые.
2. Примените политику доступа на выбранный бакет:
aws s3api put-bucket-policy --policy file://policy.json --endpoint-url=https://s-dt2.cloud.edgecore.ru --bucket my_bucket
где:
policy.json — путь до JSON-файла с политикой.
s-dt2.cloud.edgecore.ru — hostname хранилища, в котором находится ваш бакет.
my_bucket — название бакета, к которому следует применить политику.
Как разрешить запросы с сайта
Пример политики доступа, которая разрешает только запросы с сайтов, указанных в политике доступа ("StringLike":{"aws:Referer":["http://www.example.com/*","http://example.com/*"]}).
1. Создайте JSON файл с такой политикой:
{ "Statement": [ { "Sid":"Allow get requests originating from www.example.com and example.com.", "Effect":"Allow", "Principal":"*", "Action":["s3:GetObject","s3:GetObjectVersion"], "Resource":"arn:aws:s3:::/*", "Condition": { "StringLike":{"aws:Referer":["http://www.example.com/*","http://example.com/*"]} } } ] }
Важно: в строке "StringLike" замените http://www.example.com/ и http://example.com/ на желаемые сайты, с которых нужно разрешить доступ к бакету.
2. Примените политику доступа на выбранный бакет:
aws s3api put-bucket-policy --policy file://policy.json --endpoint-url=https://s-dt2.cloud.edgecore.ru --bucket my_bucket
где:
policy.json — путь до JSON-файла с политикой.
s-dt2.cloud.edgecore.ru — hostname хранилища, в котором находится ваш бакет.
my_bucket — название бакета, к которому следует применить политику.
Как дать возможность листить бакет
Пример команды, которая позволяет любым анонимным пользователям листить файлы в бакете, но не дает им возможности читать/записывать эти файлы.
aws s3api put-bucket-acl --bucket my_bucket --acl public-read --endpoint-url=https://s-dt2.cloud.edgecore.ru
Как разрешить доступ другому пользователю
Пример политики, которая разрешает доступ пользователю-хранилищу к бакету.
В S3-хранилище EdgeЦентр пользователем является отдельное хранилище, созданное в вашем или стороннем аккаунте.
Например, вы можете дать доступ пользователю-хранилищу с названием 1234-storage к вашему бакету my_bucket в хранилище 1000-my-storage.
1. Определите название пользователя-хранилища, которому необходим доступ к вашему бакету. Название можно найти в разделе Детали.
2. Создайте JSON файл с такой политикой:
{ "Statement":[ { "Effect":"Allow", "Principal": {"AWS":["arn:aws:iam:::user/1234-storage"]}, "Action":["s3:GetObject","s3:ListBucket"], "Resource":["arn:aws:s3:::my_bucket/*", "arn:aws:s3:::my_bucket"] } ] }
Важно:
В строке "Principal" измените название пользователя 1234-storage на название пользователя-хранилища, которому хотите дать доступ к бакету. Вы получили его на шаге №1.
В строке "Resource" вместо my_bucket вставьте название бакета, к которому нужно разрешить доступ.
3. Примените политику на выбранный бакет:
aws s3api put-bucket-policy --policy file://policy.json --endpoint-url=https://s-dt2.cloud.edgecore.ru --bucket my_bucket
где:
policy.json — путь до JSON-файла с политикой.
s-dt2.cloud.edgecore.ru — hostname хранилища, в котором находится ваш бакет.
my_bucket — название бакета, к которому следует применить политику.
Теперь, войдя в хранилище 1234-storage, можно просматривать содержимое бакета my_bucket в другом хранилище 1000-my-storage.
4. Чтобы проверить доступ, введите команду:
aws s3 ls s3://my_bucket --endpoint-url=https://s-dt2.cloud.edgecore.ru
Вместо my_bucket вставьте название вашего бакета.
Если данные в политике верны, вы увидите содержимое бакета. Если в политике допущена ошибка, вы получите ошибку “An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Unknown”.