Политики доступа
Политика доступа (bucket policy) — способ управления доступом к содержимому и настройкам бакета. В отличие от списка управления доступом (ACL), политика доступа дает более предсказуемую и гибкую модель доступа.
Совместное использование политики доступа и ACL регулируется параметром бакета OwnershipControls, который имеет два режима:
BucketOwnerEnforced— используется только политика доступа, ACL не используется (отключен). Рекомендуемый способ для гибкого управления правами в одном месте.BucketOwnerPreferred— сначала проверяется доступ по политике, затем проверяется ACL. Может использоваться в случае, например, сохранения обратной совместимости.
Использование BucketOwnerPreferred может вызывать конфликты между политикой доступа и ACL. По возможности рекомендуется отключить ACL в настройках бакета, после чего режим OwnershipControls будет изменен на BucketOwnerEnforced.
Примеры использования политики доступа:
- управление доступом к объектам внутри бакета;
- контроль доступа бакета для чтения или записи извне;
- назначение прав доступа отдельным пользователям или проектам;
- ограничение доступа по IP-адресам, префиксам путей или другим условиям.
Конфигурация политики доступа задается в формате JSON, который содержит одно или несколько правил.
Структура JSON-файла:
{"Version": "2012-10-17","Id": "","Statement": [{"Sid": "","Action": [""],"Effect": "","Principal": {"AWS":[""]},"Resource": [""],"Condition": {...}},...]}
Здесь:
Id— уникальный идентификатор (название) политики доступа.Statement— массив правил политики доступа.Sid— уникальный идентификатор (название) правила.Action— строка или массив строк с действиями, на которые распространяется правило.Effect— разрешение или запрет на выполнение действия.Principal— строка или массив строк с принципалами (субъектами), на которые распространяется правило.Condition— определяет, при каких условиях срабатывает правило.Resource— строка или массив строк в форматеarn:aws:s3:::<РЕСУРС>с указанием ресурса, для которого устанавливается правило.
Подробные описания параметров Action, Effect, Principal, Condition и Resource доступны ниже.
Параметр Action определяет какие действия с бакетами и объектами будут разрешены или запрещены.
| Отменить составную загрузку и удалить уже загруженные части |
| Запросить части составной загрузки |
| Запросить список незавершенных составных загрузок в бакете |
| Запросить (скачать) содержимое объекта |
| Запросить (скачать) содержимое конкретной версии объекта |
| Запросить расширенные атрибуты объекта |
| Запросить расширенные атрибуты конкретной версии объекта |
| Загрузить или перезаписать объект (при включенном версионировании — создать новую версию) |
| Удалить объект |
| Удалить конкретную версию объекта |
| Запросить ACL объекта |
| Запросить ACL конкретной версии объекта |
| Установить или перезаписать ACL объекта |
| Установить или перезаписать ACL конкретной версии объекта |
| Запросить теги объекта |
| Установить или перезаписать теги объекта |
| Удалить теги объекта |
| Проверить статус бессрочной блокировки объекта |
| Установить или снять бессрочную блокировку объекта |
| Получить статус временной блокировки объекта |
| Установить или изменить временную блокировку объекта |
| Обойти временную блокировку |
| Запросить список объектов в бакете |
| Запросить список версий объектов и маркеров удаления |
| Запросить ACL бакета |
| Установить или перезаписать ACL бакета |
| Запросить политику доступа бакета |
| Установить или перезаписать политику доступа бакета |
| Удалить политику доступа бакета |
| Запросить статус бакета, указывающий на публичный доступ |
| Запросить конфигурацию управления доступом в бакете |
| Установить или перезаписать конфигурацию управления доступом в бакете |
| Запросить конфигурацию блокировки объектов на уровне бакета |
| Установить или перезаписать конфигурацию блокировки объектов на уровне бакета |
| Запросить CORS-конфигурацию бакета |
| Установить или перезаписать CORS-конфигурацию бакета |
| Запросить конфигурацию статического веб-сайта бакета |
| Установить или перезаписать конфигурацию статического веб-сайта бакета |
| Удалить у бакета конфигурацию статического веб-сайта |
| Запросить конфигурацию уведомлений |
| Установить или перезаписать конфигурацию уведомлений |
| Запросить статус версионирования бакета |
| Включить или приостановить версионирование бакета |
| Запросить правила жизненного цикла бакета |
| Установить или перезаписать правила жизненного цикла бакета |
| Получить регион бакета |
| Удалить бакет |
Ко всем правилам политики доступа в параметре Effect указывается явное разрешение (Allow) или запрет (Deny) выполнения действия.
|
|
|---|
Если для какого-то действия нет подходящего правила, по умолчанию используется явный запрет (Deny).
Параметр Principal определяет, кому именно разрешены или запрещены действия. Поддерживаются несколько вариантов принципалов.
-
Публичный доступ без аутентификации (анонимно). Например, для публикации статических сайтов.
..."Principal": "*"... -
Доступ по проекту — политика распространяется на пользователей и сервисные учетные записи проекта VK Cloud.
..."Principal": {"AWS": "<ID_ПРОЕКТА>"}...Здесь
<ID_ПРОЕКТА>— идентификатор проекта, к которому необходимо применять политику. Может указывать как на собственный проект, так и на другой проект VK Cloud. -
Предоставление доступа определенному аккаунту VK Object Storage.
..."Principal": {"AWS": "arn:aws:iam::<ID_ПРОЕКТА>:user/<АККАУНТ_S3>"}...Здесь:
<ID_ПРОЕКТА>— идентификатор проекта, к которому необходимо применять политику. Может указывать как на собственный проект, так и на другой проект VK Cloud.<АККАУНТ_S3>— имя аккаунта VK Object Storage.
-
Доступ для приложений или сервисов с помощью сервисной учетной записи.
..."Principal": {"AWS": "arn:aws:iam::<ID_ПРОЕКТА>:user/serviceusers-<СЕРВИСНЫЙ_ПОЛЬЗОВАТЕЛЬ>"}...Здесь:
<ID_ПРОЕКТА>— идентификатор проекта, к которому необходимо применять политику. Может указывать как на собственный проект, так и на другой проект VK Cloud.<СЕРВИСНЫЙ_ПОЛЬЗОВАТЕЛЬ>— имя сервисного пользователя VK Cloud для VK Object Storage.
-
Префиксный ключ VK Object Storage:
..."Principal": {"AWS": "arn:aws:iam::<ID_ПРОЕКТА>:user/<ПРЕФИКСНЫЙ_КЛЮЧ>"}...Здесь:
<ID_ПРОЕКТА>— идентификатор проекта, к которому необходимо применять политику. Поддерживаются только префиксные ключи, которые привязаны к одному из бакетов в проекте.<ПРЕФИКСНЫЙ_КЛЮЧ>— имя префиксного ключа VK Object Storage.
Параметр Condition определяет, при каких условиях будет срабатывать правило. Задается с помощью двух параметров: оператора и ключа.
Указывается внутри блока Condition и определяет, как будет проводиться проверка значений.
| Проверка на строгое соответствие строкового значения ключа условия указанному значению (или одному из значений в списке) |
| Проверка на отсутствие строгого соответствия строкового значения ключа условия указанному значению (или ни одному из значений в списке) |
| Проверка на строгое соответствие числового значения ключа условия указанному числу (или одному из чисел в списке) |
| Истина, если числовое значение ключа условия меньше указанного числа |
| Истина, если значение даты и времени равно указанному значению в ISO 8601 |
| Истина, если IP-адрес источника запроса попадает в указанный IPv4 или IPv6 CIDR-диапазон |
| Истина, если IP-адрес источника запроса не попадает в указанный IPv4 или IPv6 CIDR-диапазон |
Указывается внутри оператора в формате ключ/значение.
| Статус бессрочной блокировки объекта. Разрешает или запрещает операции в зависимости от того, включена ли бессрочная блокировка. Возможные значения: |
| Режим временной блокировки объекта. Используется для контроля операций в зависимости от режима удержания. Возможные значения: |
| Оставшееся число дней до окончания временной блокировки объекта. Используется для контроля операций в зависимости от количества оставшихся дней блокировки. Поддерживаются числовые значения от 0 и больше |
| Дата и время, до которых удерживается объект, в формате ISO 8601. Используется для контроля операций в зависимости от даты окончания блокировки |
| IP-адрес клиента, откуда пришел запрос. Используется для ограничения доступа по IPv4 или IPv6 CIDR-диапазонам |
Параметр Resource может содержать:
-
строку, указывающую на бакет:
"Resource": "arn:aws:s3:::<ИМЯ_БАКЕТА>" -
строку, указывающую на объект:
"Resource": "arn:aws:s3:::<ИМЯ_БАКЕТА>/<КЛЮЧ_ОБЪЕКТА>" -
строку с маской
*(wildcard), указывающую на объекты с определенным префиксом ключа объекта:"Resource": "arn:aws:s3:::<ИМЯ_БАКЕТА>/<ЧАСТЬ_КЛЮЧА_ОБЪЕКТА>/*"или
"Resource": "arn:aws:s3:::<ИМЯ_БАКЕТА>/<ЧАСТЬ_КЛЮЧА_ОБЪЕКТА>*" -
строку с маской
*(wildcard), указывающую на объекты с определенным суффиксом ключа объекта:"Resource": "arn:aws:s3:::<ИМЯ_БАКЕТА>/*<ЧАСТЬ_КЛЮЧА_ОБЪЕКТА>" -
массив строк с несколькими ресурсами:
"Resource": ["arn:aws:s3:::<ИМЯ_БАКЕТА>","arn:aws:s3:::<ИМЯ_БАКЕТА>/<КЛЮЧ_ОБЪЕКТА>"]При этом действия для бакетов будут применены только для бакетов, а действия для объектов — только для объектов.
-
Разрешить скачивать объекты только из указанного диапазона IP-адресов:
{"Version": "2012-10-17","Statement": [{"Sid": "AllowGetOnlyFromCIDR","Effect": "Allow","Principal": "*","Action": "s3:GetObject","Resource": ["arn:aws:s3:::my-bucket/*"],"Condition": {"IpAddress": {"aws:SourceIp": ["203.0.113.0/24", "2001:db8:1234::/48"]}}}]} -
Запретить скачивать объекты с указанного IP-адреса:
{"Version": "2012-10-17","Statement": [{"Sid": "DenyGetFromSingleIP","Effect": "Deny","Principal": "*","Action": "s3:GetObject","Resource": ["arn:aws:s3:::my-bucket/*"],"Condition": {"IpAddress": {"aws:SourceIp": "198.51.100.10/32"}}}]} -
Предоставить разным пользователям полный доступ к определенным папкам:
{"Version": "2012-10-17","Statement": [{"Sid": "UserAFullAccessToFolderA","Effect": "Allow","Principal": {"AWS": "arn:aws:iam::mcs1234567890:user/user-a"},"Action": ["s3:GetObject","s3:GetObjectAttributes","s3:PutObject","s3:DeleteObject","s3:GetObjectTagging","s3:PutObjectTagging","s3:DeleteObjectTagging","s3:GetObjectAcl","s3:PutObjectAcl","s3:AbortMultipartUpload","s3:ListMultipartUploadParts"],"Resource": ["arn:aws:s3:::my-bucket/folder-a/*"]},{"Sid": "UserBFullAccessToFolderB","Effect": "Allow","Principal": {"AWS": "arn:aws:iam::mcs1234567890:user/user-b"},"Action": ["s3:GetObject","s3:GetObjectAttributes","s3:PutObject","s3:DeleteObject","s3:GetObjectTagging","s3:PutObjectTagging","s3:DeleteObjectTagging","s3:GetObjectAcl","s3:PutObjectAcl","s3:AbortMultipartUpload","s3:ListMultipartUploadParts"],"Resource": ["arn:aws:s3:::my-bucket/folder-b/*"]}]} -
Предоставить каждому пользователю или сервисному аккаунту полный доступ к папке:
{"Version": "2012-10-17","Statement": [{"Sid": "ProjectFullAccessToSharedFolder","Effect": "Allow","Principal": {"AWS": "mcs1234567890"},"Action": ["s3:GetObject","s3:GetObjectAttributes","s3:PutObject","s3:DeleteObject","s3:GetObjectTagging","s3:PutObjectTagging","s3:DeleteObjectTagging","s3:GetObjectAcl","s3:PutObjectAcl","s3:AbortMultipartUpload","s3:ListMultipartUploadParts"],"Resource": ["arn:aws:s3:::my-bucket/shared/*"]}]} -
Разрешить запись объектов только с обязательным использованием условий записи:
{"Version": "2012-10-17","Statement": [{"Sid": "AllowPutOnlyFromCIDR","Effect": "Allow","Principal": {"AWS": "mcs1234567890"},"Action": "s3:PutObject","Resource": ["arn:aws:s3:::my-bucket/*"],"Condition": {"IpAddress": {"aws:SourceIp": ["203.0.113.0/24"]}}}]}