Вы можете задавать права на действия с бакетами, объектами и группами объектов с помощью политик доступа. Они состоят из правил, которые задаются в формате JSON.
В отличие от ACL, политики доступа имеют более гибкие настройки доступа к ресурсам. Например, вы можете разрешить доступ с конкретных IP-адресов, запретить пользователю доступ к бакету или разрешить скачивать всем пользователям только определенный объект.
При использовании политики доступа для пользователей, у которых есть проектная или сервисная роль, политика может только ограничить права, выданные на уровне роли. Если с помощью политики доступа разрешить пользователю действия, запрещенные для его роли, разрешение не будет действовать.
Политику доступа можно создать с помощью генератора политик AWS. В дальнейшем политику можно применить к бакету с помощью одного из доступных инструментов.
Политика доступа задается в формате JSON. Пример политики:
{"Id": "ExampleBucketPolicy","Version": "2012-10-17","Statement": [{"Sid": "AllowGetObjectForIP","Effect": "Allow","Principal": "*","Action": "s3:GetObject","Resource": "arn:aws:s3:::my-bucket/*","Condition": {"IpAddress": {"aws:SourceIp": "100.100.100.100/10"}}}]}
В таблице ниже представлено описание элементов политики доступа.
Элемент | Обязательный | Описание |
|---|---|---|
Version | Версия синтаксиса политики. Некоторые возможности политики зависят от версии синтаксиса. Политика продолжит работать, даже если версия перестанет быть актуальной. Актуальная версия — 2012-10-17. | |
Id | Идентификатор политики доступа. Используется для облегчения навигации. Может содержать любые символы. Примеры заполнения: Policy1, deny-getobject, Public access policy. | |
Statement | Правила политики — одно или несколько. Каждое правило заключается в фигурные скобки { }:
| |
Sid | Идентификатор правила политики. Используется для облегчения навигации. Значение должно быть уникальным. Может содержать прописные буквы A-Z, строчные буквы a-z и цифры 0–9. | |
Effect | Разрешает или запрещает действие. Принимает значение "Allow" или "Deny". | |
Principal | Указывает получателя или получателей, для которых действует правило. | |
NotPrincipal | Указывает получателя или получателей, для которых правило не действует. Нельзя использовать совместно с полем Principal. Заполянется аналогично полю Principal. | |
Action | Указывает действие или действия, которые разрешает или запрещает политика. | |
NotAction | Указывает действия, которые не подчиняются правилу. Ограничение, указанное в поле NotAction, выполняется независимо от значения Allow или Deny в поле Effect. Например, при использовании "Effect": "Allow" все действия вне списка NotAction будут разрешены. Не используется совместно с полем Action. Заполняется аналогично полю Action. | |
Resource | Указывает ресурс или ресурсы, к которым применяется правило. | |
NotResource | Указывает ресурс или ресурсы, на которые правило не действует. Не используется совместно с полем Resource. Заполянется аналогично полю Resource. | |
Condition | Условие или условия, при которых применяется правило. |
Подробнее об элементах политики доступа — в документации AWS.
Указывает получателя, для которого действует правило. Получателем может быть пользователь, сервисный аккаунт, все пользователи интернета или все авторизованные пользователи. Допустимо указать несколько получателей.
Формат для указания одного получателя:
"Principal": {"AWS": "arn:aws:iam::<tenant_id>:<subject_type>/<principal_id>"}
Где:
<tenant_id> — идентификатор тенанта.
Идентификатор указан в личном кабинете в разделе Хранение данных → Object Storage над списком бакетов.
<subject_type> — тип получателя.
Возможные значения: user и service_account.
<principal_id> — идентификатор получателя: пользователя или сервисного аккаунта.
Идентификатор можно получить в личном кабинете из URL:
https://console.cloud.ru/spa/employees/user/<user_id> — для пользователя;
https://console.cloud.ru/spa/employees/service/view/<service_account_id> — для сервисного аккаунта.
Подробнее о работе с пользователями — в руководстве сервиса «Настройки и администрирование», о работе с сервисными аккаунтами — в руководстве «API Cloud.ru».
Пример заполнения:
"Principal": {"AWS": "arn:aws:iam::ea13e7cb-1571-4780-b355-97cb9ea138f9:service_account/bb1abb70-7f1d-46a3-920b-bceea6a73aba"}
Формат для указания нескольких получателей:
"Principal": {"AWS": ["arn:aws:iam::<tenant_id>:<subject_type>/<principal_id>","arn:aws:iam::<tenant_id>:<subject_type>/<principal_id>"]}
Для указания всех пользователей интернета используется символ *:
"Principal": "*"
Для указания всех авторизованных пользователей используется синтаксис:
"Principal": {"AWS": "*"}
Указывает действие или действия, которые разрешает или запрещает политика. Допустимо указывать одно или несколько конкретных действий или все доступные действия.
Формат заполнения для одного действия:
"Action": "s3:<action>"
Где <action> — операция AWS S3 API. Например, при указании действия s3:DeleteBucket политика будет управлять доступом к удалению бакета.
Формат заполнения для нескольких действий:
"Action": ["s3:<action>","s3:<action>"]
Для указания всех действий используется символ *:
"Action": "*"
Символ * допустимо использовать для указания группы однотипных операций. Например:
"Action": "s3:Get*"
Некоторые действия управляют доступом сразу к нескольким методам. Для ряда методов название действия не совпадает с названием метода. Перечень таких случаев приведен в таблице ниже.
Действие <action> | Какими методами управляет |
|---|---|
DeleteObject |
|
GetObject |
|
ListBucket |
|
ListBucketVersions | ListObjectVersions |
ListBucketMultipartUploads | ListMultipartUploads |
ListMultipartUploadParts | ListParts |
PutBucketCors |
|
PutObject |
|
PutPublicAccessBlock |
|
Для управления доступом к методам CopyObject и UploadPartCopy используются действия s3:GetObject и s3:PutObject. Например, чтобы запретить копирование объекта, можно использовать политику, запрещающую вызов метода PutObject для целевого бакета с заголовком x-amz-copy-source.
Указывает ресурс или ресурсы, к которым применяется правило. Ресурсами могут быть бакеты и объекты. Можно указать один или несколько ресурсов.
Формат заполнения для одного ресурса:
"Resource": "arn:aws:s3:::<resource>"
Где <resource> может принимать следующие значения:
Название бакета, например my-bucket. При указании только названия бакета правило не будет распространяться на объекты внутри бакета, оно будет работать только для действий с самим бакетом.
Ключ объекта в бакете, например my-bucket/my-object.
Указание на группу объектов в бакете, например на все объекты my-bucket/* или объекты, относящиеся к конкретному префиксу my-bucket/prefix/*. При указании объектов бакета правило не будет распространяться на действия с самим бакетом, оно будет работать только для действий с объектами.
Формат заполнения для нескольких ресурсов:
"Resource": ["arn:aws:s3:::<resource>","arn:aws:s3:::<resource>"]
Пример заполнения:
"Resource": ["arn:aws:s3:::my-bucket","arn:aws:s3:::my-bucket/*"]
Элемент состоит из операторов условий, которые сопоставляют ключи и значения в политике с ключами и значениями в запросе:
"Condition": {"<condition_operator>": {"<condition_key>": "<condition_value>"}
В таблице ниже описаны популярные операторы с примерами использования.
Оператор | Описание |
|---|---|
IpAddress | Проверяет IP-адрес источника запроса на соответствие ключу. Использует ключ "aws:SourceIp". Значение — IP-адрес в формате IPv4. Пример:
|
NotIpAddress | Проверяет, что значение ключа не соответствует указанному IP-адресу. Использует ключ "aws:SourceIp". Значение — IP-адрес в формате CIDR. Пример:
|
Null | Проверяет наличие ключа из условия в запросе. Условие выполняется, если в запросе отсутствует ключ из условия или ключ присутствует, но его значение не указано. Может использоваться для проверки любого заголовка в запросе. Ключ указывается в формате s3:<header>, где <header> — заголовок запроса. Пример проверки, что запрос не использует шифрование SSE-C:
Пример проверки, что запрос не использует шифрование SSE-KMS:
|
StringEquals | Проверяет, что значение заголовка из запроса совпадает со значением ключа в условии. Строки должны полностью совпадать с учетом регистра. Может использоваться для проверки любого заголовка в запросе. Ключ указывается в формате s3:<header>, где <header> — заголовок запроса. Пример проверки, что в заголовке запроса x-amz-server-side-encryption-customer-algorithm указан алгоритм шифрования AES-256:
|
Подробнее об использовании условий в политиках доступа — в документации AWS.
Политика, которая позволяет читать все объекты бакета my-bucket всем пользователям:
{"Version": "2012-10-17","Statement": [{"Effect": "Allow","Principal": "*","Action": "s3:GetObject","Resource": "arn:aws:s3:::my-bucket/*"}]}
Политика, которая разрешает скачивать объекты из бакета my-bucket только с IP-адреса 100.100.100.100/10:
{"Version": "2012-10-17","Statement": [{"Effect": "Deny","Principal": "*","Action": "s3:GetObject","Resource": "arn:aws:s3:::my-bucket/*","Condition": {"NotIpAddress": {"aws:SourceIp": "100.100.100.100/10"}}}]}
Политика, которая запрещает всем пользователям доступ к операции GetObject для объектов бакета my-bucket с префиксом you_shall_not_pass и разрешает доступ к объектам с любым префиксом, кроме you_shall_not_pass:
{"Version": "2012-10-17","Statement": [{"Effect": "Allow","Principal": "*","Action": "s3:GetObject","Resource": "arn:aws:s3:::my-bucket/*"},{"Effect": "Deny","Principal": "*","Action": "s3:GetObject","Resource": "arn:aws:s3:::my-bucket/you_shall_not_pass/*"}]}
Политика, которая требует шифрование каждого объекта, добавляемого в бакет my-bucket, с помощью SSE-KMS:
{"Version": "2012-10-17","Statement": [{"Sid": "DenyObjectsThatAreNotSSEKMS","Principal": "*","Effect": "Deny","Action": "s3:PutObject","Resource": "arn:aws:s3:::my-bucket/*","Condition": {"Null": {"s3:x-amz-server-side-encryption-aws-kms-key-id": "true"}}}]}
Политика, которая запрещает добавлять объекты в бакет my-bucket, если они зашифрованы с помощью SSE-KMS:
{"Version": "2012-10-17","Statement": [{"Sid": "DenyObjectsThatAreSSEKMS","Principal": "*","Effect": "Deny","Action": "s3:PutObject","Resource": "arn:aws:s3:::my-bucket/*","Condition": {"Null": {"s3:x-amz-server-side-encryption-aws-kms-key-id": "false"}}}]}
Политика, которая запрещает добавлять в бакет my-bucket объекты, если они не зашифрованы с помощью алгоритма AES256:
{"Version": "2012-10-17","Statement": [{"Effect": "Deny","Action": "s3:PutObject","Resource": "arn:aws:s3:::my-bucket/*","Condition": {"StringNotEquals": {"s3:x-amz-server-side-encryption-customer-algorithm": "AES256"}}}]}
Политика, которая запрещает сервисному аккаунту с идентификатором 6fdb70c5-94ec-48e1-95e8-e5b******** GET- и LIST-операции с бакетом my-bucket и его объектами в тенанте 09fadf08-ed2f-44ea-b194-7a1********:
{"Version": "2012-10-17","Statement": [{"Sid": "DenyGetListDemoBucket","Effect": "Deny","Principal": {"AWS": "arn:aws:iam::09fadf08-ed2f-44ea-b194-7a1********:service_account/6fdb70c5-94ec-48e1-95e8-e5b********"},"Action": ["s3:Get*","s3:List*"],"Resource": ["arn:aws:s3:::my-bucket/*","arn:aws:s3:::my-bucket"]}]}
Политика, которая запрещает пользователям с идентификаторами 6fdb70c5-94ec-48e1-95e8-e5b******** и 7abc70c5-94ec-48e1-95e8-e5b******** удалять объекты бакета my-bucket в тенанте 09fadf07-ed2f-44ea-b194-7a1********:
{"Version": "2012-10-17","Statement": [{"Sid": "Statement1","Effect": "Deny","Principal": {"AWS": ["arn:aws:iam::09fadf07-ed2f-44ea-b194-7a1********:user/6fdb70c5-94ec-48e1-95e8-e5b********","arn:aws:iam::09fadf07-ed2f-44ea-b194-7a1********:user/7abc70c5-94ec-48e1-95e8-e5b********"]},"Action": "s3:DeleteObject","Resource": ["arn:aws:s3:::my-bucket/*"]}]}
Политика, которая запрещает копирование объектов в бакет my-bucket:
{"Version": "2012-10-17","Statement": [{"Effect": "Deny","Action": "s3:PutObject","Resource": "arn:aws:s3:::my-bucket/*","Condition": {"Null": {"s3:x-amz-copy-source": "false"}}}]}