Облачная платформаEvolution

Политики доступа (Bucket Policy) в Object Storage


Вы можете задавать права на действия с бакетами, объектами и группами объектов с помощью политик доступа. Они состоят из правил, которые задаются в формате 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

Да

Правила политики — одно или несколько.

Каждое правило заключается в фигурные скобки {  }:

"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

Указывает получателя, для которого действует правило. Получателем может быть пользователь, сервисный аккаунт, все пользователи интернета или все авторизованные пользователи. Допустимо указать несколько получателей.

Формат для указания одного получателя:

"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

Указывает действие или действия, которые разрешает или запрещает политика. Допустимо указывать одно или несколько конкретных действий или все доступные действия.

Формат заполнения для одного действия:

"Action": "s3:<action>"

Где <action>операция AWS S3 API. Например, при указании действия s3:DeleteBucket политика будет управлять доступом к удалению бакета.

Формат заполнения для нескольких действий:

"Action": [
"s3:<action>",
"s3:<action>"
]

Для указания всех действий используется символ *:

"Action": "*"

Символ * допустимо использовать для указания группы однотипных операций. Например:

"Action": "s3:Get*"

Некоторые действия управляют доступом сразу к нескольким методам. Для ряда методов название действия не совпадает с названием метода. Перечень таких случаев приведен в таблице ниже.

Действие <action>

Какими методами управляет

DeleteObject

  • DeleteObject

  • DeleteObjects

GetObject

  • GetObject

  • HeadObject

ListBucket

  • ListBucket

  • HeadBucket

ListBucketVersions

ListObjectVersions

ListBucketMultipartUploads

ListMultipartUploads

ListMultipartUploadParts

ListParts

PutBucketCors

  • PutBucketCors

  • DeleteBucketCors

PutObject

  • PutObject

  • UploadPart

  • PostObject

  • CreateMultipartUpload

  • CompleteMultipartUpload

PutPublicAccessBlock

  • PutPublicAccessBlock

  • DeletePublicAccessBlock

Примечание

Для управления доступом к методам CopyObject и UploadPartCopy используются действия s3:GetObject и s3:PutObject. Например, чтобы запретить копирование объекта, можно использовать политику, запрещающую вызов метода PutObject для целевого бакета с заголовком x-amz-copy-source.

Resource

Указывает ресурс или ресурсы, к которым применяется правило. Ресурсами могут быть бакеты и объекты. Можно указать один или несколько ресурсов.

Формат заполнения для одного ресурса:

"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": {
"<condition_operator>": {
"<condition_key>": "<condition_value>"
}

В таблице ниже описаны популярные операторы с примерами использования.

Оператор

Описание

IpAddress

Проверяет IP-адрес источника запроса на соответствие ключу. Использует ключ "aws:SourceIp". Значение — IP-адрес в формате IPv4.

Пример:

"Condition": {
"IpAddress": {
"aws:SourceIp": "100.100.100.100/10"
}
}

NotIpAddress

Проверяет, что значение ключа не соответствует указанному IP-адресу. Использует ключ "aws:SourceIp". Значение — IP-адрес в формате CIDR.

Пример:

"Condition": {
"NotIpAddress": {
"aws:SourceIp": "100.100.100.100/10"
}
}

Null

Проверяет наличие ключа из условия в запросе. Условие выполняется, если в запросе отсутствует ключ из условия или ключ присутствует, но его значение не указано. Может использоваться для проверки любого заголовка в запросе. Ключ указывается в формате s3:<header>, где <header> — заголовок запроса.

Пример проверки, что запрос не использует шифрование SSE-C:

"Null": {
"s3:x-amz-server-side-encryption-customer-algorithm":
"true",
}

Пример проверки, что запрос не использует шифрование SSE-KMS:

"Null": {
"s3:x-amz-server-side-encryption-aws-kms-key-id":
"true",
}

StringEquals

Проверяет, что значение заголовка из запроса совпадает со значением ключа в условии. Строки должны полностью совпадать с учетом регистра. Может использоваться для проверки любого заголовка в запросе. Ключ указывается в формате s3:<header>, где <header> — заголовок запроса.

Пример проверки, что в заголовке запроса x-amz-server-side-encryption-customer-algorithm указан алгоритм шифрования AES-256:

"StringEquals": {
"s3:x-amz-server-side-encryption-customer-algorithm":
"AES256",
}

Подробнее об использовании условий в политиках доступа — в документации 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"
    }
    }
    }
    ]
    }