Управление доступом в объектное хранилище S3 Bucket Policy
Если пользователь имеет доступ к объектному хранилищу, то доступ к конкретному бакету определяется наличием и настройками политики доступа.
- Если политика доступа не создана, то доступ будет предоставлен всем пользователям с доступом в рамках ролевой модели, за исключением роли “Пользователь объектного хранилища”.
- Если политика доступа создана, то разрешено только то, что разрешено правилами политики, остальное запрещено. Для получения дополнительной информации о работе политики доступа, пожалуйста, обратитесь к разделу “Политика доступа”.
Ключи доступа
Выдавать ключи для доступа к хранилищу через API можно только сервисным пользователям.
- S3-ключ (EC2-ключ), используется для подписи запросов S3 API и по FTP. Состоит из пары значений — Access Key ID и Secret Key.
Политика доступа к бакету
Доступ к бакету задается через политику доступа (Bucket policy).
Политика состоит из правил, которые разрешают или запрещают действия с ресурсом (контейнером или группой объектов) для всех или выбранных принципалов (пользователей).
Политика доступа имеет ограничение на максимальный размер в 20 КБ.
Политику доступа рекомендуется использовать только совместно с S3 API.
Структура политики доступа
Политика доступа имеет JSON-структуру.
Примеры политик
- Пример политики на удаление объекта:
{ "Id": "my-bucket-policy", "Version": "2012-10-17", "Statement": [ { "Sid": "AllowObjectDeletion", "Effect": "Allow", "Principal": { "AWS": [ "*" ] }, "Action": [ "s3:DeleteObject" ], "Resource": [ "arn:aws:s3:::<имя_бакета>", "arn:aws:s3:::<имя_бакета>/*", "arn:aws:s3:::<имя_бакета>/${aws:userid}/*" ], "Condition": { "StringEquals": { "aws:UserAgent": [ "storage-test-user-agent" ] } } }, { "Effect": "Deny", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::<имя_бакета>/*" } ]}
- Как предоставить разрешение на публичное чтение анонимным пользователям (т. е. всем):
{ "Version": "2008-10-17", "Statement": [ { "Sid": "AllowPublicRead", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::<имя_бакета>/*", } ]}
- Как предоставить полный доступ пользователям с определенных IP-адресов.:
{ "Version": "2008-10-17", "Id": "S3PolicyId1", "Statement": [ { "Sid": "IPAllow", "Effect": "Allow", "Principal": "*", "Action": "s3:*", "Resource": "arn:aws:s3:::<имя_бакета>/*", "Condition": { "IpAddress": { "aws:SourceIp": "192.168.143.0/24" }, "NotIpAddress": { "aws:SourceIp": "192.168.143.188/32" } } }, { "Sid": "IPDeny", "Effect" : "Deny", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::<имя_бакета>/*", "Condition": { "IpAddress": { "aws:SourceIp": "100.101.102.103" } } } ]}
- Как защитить файлы S3 от хотлинкинга.
{ "Version": "2008-10-17", "Id": "preventHotLinking", "Statement": [ { "Sid": "1", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::<имя_бакета>/*", "Condition": { "StringLike": { "aws:Referer": [ "http://yourwebsitename.com/*", "http://www.yourwebsitename.com/*" ] } } } ]}
- Как разрешить запись в корзину только определенному IP и чтение из нее всем.
{ "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::<имя_бакета>/*", "Condition": {
} }, { "Effect": "Allow", "Principal": "*", "Action": [ " s3:PutObject", "s3:DeleteObject" ], "Resource": "arn:aws:s3:::<имя_бакета>/*", "Condition": { "IpAddress": { "aws:SourceIp ": "192.168.0.0/16" } } } ]}
- Как разрешить каждому пользователю и сервисному аккаунту полный доступ к папке с названием, равным идентификатору пользователя или сервисного аккаунта:
{ "Version":"2012-10-17", "Statement":[ { "Sid": "OwnDirPermissions", "Effect": "Allow", "Principal": "*", "Action": "*", "Resource": ["arn:aws:s3:::<имя_бакета>/${aws:userid}/*"] } ]}
- Как разрешить разным пользователям полный доступ только к определенным папкам, каждому пользователю — к своей:
{ "Version":"2012-10-17", "Statement":[ { "Sid":"User1PermissionsResource", "Effect":"Allow", "Principal": { "CanonicalUser": "<идентификатор_пользователя>" }, "Action": "*", "Resource":["arn:aws:s3:::<имя_бакета>/user1path/*"] }, { "Sid":"User1PermissionsPrefix", "Effect":"Allow", "Principal": { "CanonicalUser": "<идентификатор_пользователя>" }, "Action": "s3:ListBucket", "Resource":["arn:aws:s3:::<имя_бакета>"], "Condition": { "StringLike": { "s3:prefix": "user1path/*" } } }, { "Sid":"User2PermissionsResource", "Effect":"Allow", "Principal": { "CanonicalUser": "<идентификатор_пользователя>" }, "Action": "*", "Resource":["arn:aws:s3:::<имя_бакета>/user2path/*"] }, { "Sid":"User2PermissionsPrefix", "Effect":"Allow", "Principal": { "CanonicalUser": "<идентификатор_пользователя>" }, "Action": "s3:ListBucket", "Resource":["arn:aws:s3:::<имя_бакета>"], "Condition": { "StringLike": { "s3:prefix": "user2path/*" } } } ]}
- Как разрешить анонимному пользователю чтение объектов бакета по зашифрованному подключению:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::<имя_бакета>/*", "Condition": { "Bool": { "aws:SecureTransport": "true" } } } ]}
- Как разрешить скачивать объекты только из указанного диапазона IP-адресов:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::<имя_бакета>/*", "Condition": { "IpAddress": { "aws:SourceIp": "100.101.102.128/30" } } } ]}
- Как запретить скачивать объекты с указанного IP-адреса:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "*", "Resource": "arn:aws:s3:::<имя_бакета>/*" }, { "Effect": "Deny", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::<имя_бакета>/*", "Condition": { "IpAddress": { "aws:SourceIp": "100.101.102.103" } } } ]}
Для создания политики можно использовать генератор политик AWS.
Готовую политику необходимо сохранить в формате JSON и загрузить в S3.
Содержимое политики
Поле | Тип данных | Обязательный | Описание |
---|---|---|---|
Id | Строка | ✗ | Идентификатор политики, может быть любым |
Version | Строка | ✓ | Версия политики доступа, значение — константа: “2012-10-17” |
Statement | Массив | ✓ | Массив правил |
Sid | Строка | ✗ | Название правила |
Effect | Строка | ✓ | Тип правила (Allow или Deny) |
Principal:AWS | Массив строк или строка | ✓ | Принципалы (идентификаторы пользователей или * для всех запросов) |
Actions | Массив строки или строка | ✓ | Действия или * для всех действий |
Resources | Массив строк или строка | ✓ | Ресурсы, на которые действует правило |
Condition | Массив | ✗ | Массив условий, представленных в формате: [оператор]:[ключ]:[массив значений ключа] |
Примеры загрузки политики
Для загрузки политики через AWS CLI используйте следующую команду:
aws s3api put-bucket-policy --bucket <bucket_name> --policy file://policy.json
Для загрузки политики через S3 Browser:
-
Перейдите в меню Buckets → Edit Bucket Policy.
-
Скопируйте политику, вставьте в окно и нажмите Apply.
Для загрузки политики через REST API используйте метод PUT.
Правила доступа
Правила бывают двух типов:
- разрешающие (Allow)
- запрещающие (Deny).
Разрешение или запрет распространяется на действия, ресурсы и принципалов, добавленных в правило.
Если политика содержит несколько правил, они применяются следующим образом:
- если хотя бы одно разрешающее правило выполняется, доступ будет разрешен;
- если хотя бы одно запрещающее правило выполняется, доступ будет запрещен;
- если выполняются одновременно разрешающие и запрещающие правила, доступ будет запрещен;
- если ни одно правило не выполняется, доступ будет запрещен.
Принципалы
Правило применяется в отношении запросов от пользователей - принципалов:
- на авторизованные запросы определенных пользователей;
- на все авторизованные и неавторизованные запросы, (обозначается звездочкой - *).
Ресурсы
Ресурсы — бакет или объекты, на которые будет распространяться правило. Указывать можно только ресурсы, связанные с бакетом, для которого настраивается политика.
Ресурсы можно указывать в форматах:
arn:aws:s3:::<container-name>
— ресурс одного бакета (для которого настраивается политика). Ресурс будет работать только для действий, связанных с настройкой бакета, и не распространяется на его объекты;
arn:aws:s3:::<container-name>/<prefix>
— ресурс объектов бакета, где
arn:aws:s3:::<container-name>/${<variable-name>}
— ресурс объектов бакета, где
Действия
-
s3:AbortMultipartUpload - Прерывание сегментированной загрузки объекта через S3 API
-
s3:DeleteObject - Удаление объекта
-
s3:DeleteObjectVersion - Удаление версии объекта
-
s3:GetBucketCORS - Получение CORS-конфигурации контейнера
-
s3:GetBucketLocation - Получение пула, в котором находится контейнер
-
s3:GetBucketVersioning - Получение информации о версионировании контейнера (включено или нет)
-
s3:GetObject - Чтение объекта
-
s3:GetObjectVersion - Чтение определенной версии объекта
-
s3:ListBucket - Чтение списка объектов в контейнере (всех или некоторых)
-
s3:ListBucketMultipartUploads - Чтение списка объектов, которые находятся в процессе сегментированной загрузки через S3 API
-
s3:ListBucketVersions - Чтение метаданных всех версий объектов в контейнере
-
s3:ListMultipartUploadParts - Чтение списка загруженных частей объекта при сегментированной загрузке через S3 API
-
s3:PutBucketCORS - Установка CORS-конфигурации контейнера
-
s3:PutBucketVersioning - Подключение и отключение версионирования контейнера
-
s3:PutObject - Добавление объекта в контейнер (загрузка или копирование)
Условия
Условие определяет, в каких случаях правило будет работать. Условие состоит из ключа, оператора и значения.
Если в результате выполнения условия возвращается значение true
, условие удовлетворяется.