Политики доступа
Политика бакета (bucket policy) — механизм управления доступом к содержимому S3-бакета на уровне всего бакета. Политики задаются в формате JSON и определяют разрешения на выполнение определенных действий (например чтение, запись, удаление) для указанных субъектов (пользователей групп, учетных записей) над объектами бакета.
С помощью политики бакета можно:
- Управлять доступом к объектам внутри бакета.
- Контролировать доступность бакета для чтения или записи извне.
- Назначать права доступа отдельным пользователям, группам или приложениям.
- Ограничивать доступ по IP-адресам, префиксам путей или другим условиям.
- Использовать идентификатор
Principal. - Задавать ограничения по условиям
IpAddressилиUserAgent.
Пример включенной политики на бакете bucket-1:
|-----------------|--------------------------------------|| FIELD | VALUE ||-----------------|--------------------------------------|| ID | c2ad9f83-b746-4c49-b4df-b4a387a4a3bf || Name | test-bucket-1 || Owner | a5fd4633-d57a-4088-9d76-b86b9e55c52e || ProjectID | a5fd4633-d57a-4088-9d76-b86b9e55c52e || Created at | 2024-11-11T16:33:46Z || ACL | private || Cors | - || Location | - || Storage class | ST || Ownership | - || Policy enabled | true || Website enabled | false ||-----------------|--------------------------------------|
Политика бакета включает следующие типы пользователей:
- Обычный пользователь (IAM-пользователь) — имеет полный доступ к объектам внутри бакета в рамках проекта.
- Префиксный пользователь — доступ к объектам ограничен префиксом
<bucket>/<prefix>. - ROOT-пользователь — специальный сервисный пользователь, у которого есть доступ к системным резервным копиям (RO-бакетам).
- Сервисная учетная запись — рекомендуемый пользователь для работы в приложениях.
В политике бакета идентификатор Principal определяет, кому именно разрешены или запрещены действия. Возможные варианты:
-
Все пользователи (публичный доступ):
"Principal": "*"Доступ предоставляется без аутентификации (анонимно). Используется, например, для публикации статических сайтов.
-
Все пользователи проекта (root-доступ проекта):
"Principal": {"AWS": "<ID_ПРОЕКТА>:root"}Доступ получают все IAM-пользователи и сервисные учетные записи проекта.
-
Конкретный пользователь:
"Principal": {"AWS": "<ID_ПРОЕКТА>:user/<ИМЯ_ПОЛЬЗОВАТЕЛЯ>"} -
Сервисная учетная запись:
"Principal": {"AWS": "<ID_ПРОЕКТА>:serviceaccount/<ИМЯ_СЕРВИСНОГО_ПОЛЬЗОВАТЕЛЯ>"}Сервисная учетная запись используется для выдачи прав приложению или сервису.
В политике бакета используются следующие правила и ограничения:
-
Все политики обрабатываются по логике явного запрета или разрешения (Explicit Deny/Allow). Приоритет у запрета.
-
Кросс-проектный доступ реализуется через указание идентификатора
Principalдругого проекта. Возможны два варианта:- Выдаются ROOT-права другому проекту — все пользователи проекта получат доступ.
- Доступ выдается конкретному пользователю.
-
Политику бакета можно применять только в регионе, где создан бакет.
-
Уникальное имя ресурса (ARN) не должно содержать символов
*в имени бакета.
Политика бакета имеет приоритет перед ACL. Проверка ACL осуществляется только после получения доступа по политике.
Политика бакета поддерживает следующие операции:
-
С бакетами:
- CreateBucket — создать бакет.
- ListBuckets — получить список бакетов.
- HeadBucket — проверка наличия бакета и доступа к нему.
- ListObjects — получить список объектов бакета.
- DeleteBucket— удалить бакет.
-
С объектами:
- GetObject — скачать объект из бакета.
- HeadObject — получить информацию об объекте.
- PutObject — загрузить объект в бакет.
- CopyObject — скопировать объект, находящийся в бакете.
- DeleteObject — удалить объект.
- DeleteMultipleObjects — удалить группу объектов по списку.
-
С ACL:
- GetBucketACL — получить ACL бакета.
- PutBucketACL — установить ACL бакета.
- GetObjectACL — получить ACL для объекта.
- PutObjectACL — установить ACL объекта.