Общая информация о политиках доступа
Доступ к бакету можно задать через политику доступа (Bucket policy). Политика состоит из правил, которые разрешают или запрещают действия с ресурсом (бакетом или группой объектов) для всех или выбранных принципалов (пользователей). Основной принцип — если политика доступа создана, запрещено все, что не разрешено.
Политика доступа работает для любого авторизованного доступа. Авторизованным доступом считается просмотр и управление бакетами и их объектами через панель управления и API. Неавторизованным доступом считаются запросы к объектам в публичных бакетах по публичному домену бакета или пользовательским доменам.
Политика доступа имеет ограничение на максимальный размер в 20 КБ.
Политика доступа может распространяться на любого пользователя, которому разрешен доступ к хранилищу в соответствии с ролевой моделью, а также определяет доступ для пользователей с ролями object_storage_user и s3.bucket.user.
Подробнее о взаимодействии ролевой модели и политик доступа в инструкции Управлять доступом в S3.
Управлять политиками доступа может Владелец аккаунта и пользователи с ролью member.
Если у пользователя с ролью member выбрана область доступа Проекты, у него в разрешении должен быть добавлен соответствующий проект.
Создавать политики доступа и управлять ими можно в панели управления или через 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:::bucket-name",
"arn:aws:s3:::bucket-name/*",
"arn:aws:s3:::bucket-name/${aws:userid}/*"
],
"Condition": {
"StringEquals": {
"aws:UserAgent": [
"storage-test-user-agent"
]
}
}
},
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::bucket-name/*"
}
]
}
Содержимое политики:
Правила
Правила бывают двух типов: разрешающие (Allow) и запрещающие (Deny).
Разрешение или запрет распространяется на действия, ресурсы и принципалов, добавленных в правило.
Если политика содержит несколько правил, они применяются следующим образом:
- если хотя бы одно разрешающее правило выполняется, доступ будет разрешен;
- если хотя бы одно запрещающее правило выполняется, доступ будет запрещен;
- если выполняются одновременно разрешающие и запрещающие правила, доступ будет запрещен;
- если ни одно правило не выполняется, доступ будет запрещен.
Принципалы
Правило применяется в отношении запросов от принципалов (пользователей):
- на авторизованные запросы определенных пользователей, указываются идентификаторы пользователей (посмотреть идентификатор сервисного пользователя можно в панели управления);
- на все авторизованные и неавторизованные запросы, обозначается символом
*.
Добавлять в качестве принципалов пользователей с доступом в панель управления можно только при настройке политики через панель управления.
Ресурсы
Ресурсы — бакет или набор объектов, на которые будет распространяться правило. Указывать можно только ресурсы, связанные с бакетом, для которого настраивается политика.
Ресурсы можно указывать в форматах:
arn:aws:s3:::<bucket-name>— ресурс бакета, можно указать только один ресурс такого формата (бакет, для которого настраивается политика). Ресурс будет работать для действий, связанных с настройкой бакета, и не распространяется на его объекты;arn:aws:s3:::<bucket-name>/<prefix>— ресурс объектов бакета, где<prefix>— префикс, на объекты с которым будет рас пространяться правило. Если указать*, в ресурсы будут включены все объекты бакета;arn:aws:s3:::<bucket-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 удовлетворяется:
- если в запросе отсутствует ключ из условия;
- если ключ присутствует в запросе, но его значение не указано.