Пропустить до содержимого

Управление доступом в объектное хранилище S3 Bucket Policy

Если пользователь имеет доступ к объектному хранилищу, то доступ к конкретному бакету определяется наличием и настройками политики доступа.

  1. Если политика доступа не создана, то доступ будет предоставлен всем пользователям с доступом в рамках ролевой модели, за исключением роли “Пользователь объектного хранилища”.
  2. Если политика доступа создана, то разрешено только то, что разрешено правилами политики, остальное запрещено. Для получения дополнительной информации о работе политики доступа, пожалуйста, обратитесь к разделу “Политика доступа”.

Ключи доступа

Выдавать ключи для доступа к хранилищу через 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, условие удовлетворяется.