Политика доступа к контейнеру
Доступ к контейнеру можно задать через политику доступа (Bucket policy). Политика состоит из правил, которые разрешают или запрещают действия с ресурсом (контейнером или группой объектов) для всех или выбранных принципалов (пользователей). Основной принцип — если политика доступа создана, запрещено все, что не разрешено.
Политика доступа работает только с S3 API.
Политика доступа имеет ограничение на максимальный размер в 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:::container-name",
"arn:aws:s3:::container-name/*",
"arn:aws:s3:::container-name/${aws:userid}/*"
],
"Condition": {
"StringEquals": {
"aws:UserAgent": [
"storage-test-user-agent"
]
}
}
},
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::container-name/*"
}
]
}
Содержимое политики:
Правила
Правила бывают двух типов: разрешающие (Allow
) и запрещающие (Deny
).
Разрешение или запрет распространяется на действия, ресурсы и принципалов, добавленных в правило.
Если политика содержит несколько правил, они применяются следующим образом:
- если хотя бы одно разрешающее правило выполняется, доступ будет разрешен;
- если хотя бы одно запрещающее правило выполняется, доступ будет запрещен;
- если выполняются одновременно разрешающие и запрещающие правила, доступ будет запрещен;
- если ни одно правило не выполняется, доступ будет запрещен.
Принципалы
Правило применяется в отношении запросов от принципалов (пользователей):
- на авторизованные запросы определенных пользователей, указываются идентификаторы пользователей (посмотреть идентификатор сервисного пользователя можно в панели управления);
- на все авторизованные и неавторизованные запросы, обозначается символом
*
.
Добавлять в качестве принципалов пользователей панели управления в политики доступа можно только при настройке политики через панель управления.
Ресурсы
Ресурсы — контейнер или набор объектов, на которые будет распространяться правило. Указывать можно только ресурсы, связанные с контейнером, для которого настраивается политика.
Ресурсы можно указывать в форматах:
-
arn:aws:s3:::<container-name>
— ресурс контейнера, можно указать только один ресурс такого формата (контейнер, для которого настраивается политика). Ресурс будет работать для действий, связанных с настройкой контейнера, и не распространяется на его объекты; -
arn:aws:s3:::<container-name>/<prefix>
— ресурс объектов контейнера, где<prefix>
— префикс, на объекты с которым будет распространяться правило. Если указать*
, в ресурсы будут включены все объекты контейнера; -
arn:aws:s3:::<container-name>/${<variable-name>}
— ресурс объектов контейнера, где<variable-name>
— имя подстановочной переменной (ключа), которая выполняет роль префикса.
Действия
Если указать *
, в правило будут включены все действия.
Условия
Условие определяет, в каких случаях правило будет работать. Условие состоит из ключа, оператора и значения.
Если в результате выполнения условия возвращается значение true
, условие удовлетворяется.
Ключи
Один ключ можно использовать в нескольких условиях. Ключу можно присвоить несколько значений.
Операторы
Операторы сравнивают значения из запроса к ресурсу со значением, указанным в значении ключа в условии.
Числа
Строки
Дата и время
IP-адреса
Bool
IfExists
Null
Число из запроса сравнивается с числом, указанным в условии.
Строка из запроса сравнивается со строкой, указанной в условии.
Дата и время из запроса сравнивается с датой и временем, указанными в условии.
IP-адрес в формате CIDR из запроса сравнивается с IP-адресом из условия.
Оператор Bool
сравнивает логическое значение из запроса (true
или false
) со значением из ключа.
Условие удовлетворяется, если значение из запроса соответствует значению из условия.
Оператор IfExists
позволяет смягчить условие в случае, если указанный в условии ключ отсутствует в запросе.
IfExists
можно использовать только совместно с другими операторами (кроме Null
). Формат добавления: <имя оператора>IfExists
— например, StringEqualsIfExists
.
Тип данных соответствует типу данных оператора, к которому добавляется IfExists
.
Удовлетворение условия с IfExists
зависит от того, присутствует ли ключ из запроса в условии:
- если ключ присутствует, условие обрабатывается по правилам оператора, с которым использовался
IfExists
и может принять значениеtrue
илиfalse
; - если ключ отсутствует, условие принимает значение
true
.
Оператор Null
проверяет наличие ключа из запроса в условии.
Тип данных — boolean.
Условие с оператором Null
удовлетворяется:
- если в запросе отсутствует ключ из условия;
- если ключ присутствует в запросе, но его значение не указано.