VK Cloud logo

Политики доступа

Политика доступа (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 определяет какие действия с бакетами и объектами будут разрешены или запрещены.

S3:AbortMultipartUpload

Отменить составную загрузку и удалить уже загруженные части

S3:ListMultipartUploadParts

Запросить части составной загрузки

S3:ListBucketMultipartUploads

Запросить список незавершенных составных загрузок в бакете

S3:GetObject

Запросить (скачать) содержимое объекта

S3:GetObjectVersion

Запросить (скачать) содержимое конкретной версии объекта

S3:GetObjectAttributes

Запросить расширенные атрибуты объекта

S3:GetObjectVersionAttributes

Запросить расширенные атрибуты конкретной версии объекта

S3:PutObject

Загрузить или перезаписать объект (при включенном версионировании — создать новую версию)

S3:DeleteObject

Удалить объект

S3:DeleteObjectVersion

Удалить конкретную версию объекта

S3:GetObjectAcl

Запросить ACL объекта

S3:GetObjectVersionAcl

Запросить ACL конкретной версии объекта

S3:PutObjectAcl

Установить или перезаписать ACL объекта

S3:PutObjectVersionAcl

Установить или перезаписать ACL конкретной версии объекта

S3:GetObjectTagging

Запросить теги объекта

S3:PutObjectTagging

Установить или перезаписать теги объекта

S3:DeleteObjectTagging

Удалить теги объекта

S3:GetObjectLegalHold

Проверить статус бессрочной блокировки объекта

S3:PutObjectLegalHold

Установить или снять бессрочную блокировку объекта

S3:GetObjectRetention

Получить статус временной блокировки объекта

S3:PutObjectRetention

Установить или изменить временную блокировку объекта

S3:BypassGovernanceRetention

Обойти временную блокировку

S3:ListBucket

Запросить список объектов в бакете

S3:ListBucketVersions

Запросить список версий объектов и маркеров удаления

S3:GetBucketAcl

Запросить ACL бакета

S3:PutBucketAcl

Установить или перезаписать ACL бакета

S3:GetBucketPolicy

Запросить политику доступа бакета

S3:PutBucketPolicy

Установить или перезаписать политику доступа бакета

S3:DeleteBucketPolicy

Удалить политику доступа бакета

S3:GetBucketPolicyStatus

Запросить статус бакета, указывающий на публичный доступ

S3:GetBucketOwnershipControls

Запросить конфигурацию управления доступом в бакете

S3:PutBucketOwnershipControls

Установить или перезаписать конфигурацию управления доступом в бакете

S3:GetBucketObjectLockConfiguration

Запросить конфигурацию блокировки объектов на уровне бакета

S3:PutBucketObjectLockConfiguration

Установить или перезаписать конфигурацию блокировки объектов на уровне бакета

S3:GetBucketCORS

Запросить CORS-конфигурацию бакета

S3:PutBucketCORS

Установить или перезаписать CORS-конфигурацию бакета

S3:GetBucketWebsite

Запросить конфигурацию статического веб-сайта бакета

S3:PutBucketWebsite

Установить или перезаписать конфигурацию статического веб-сайта бакета

S3:DeleteBucketWebsite

Удалить у бакета конфигурацию статического веб-сайта

S3:GetBucketNotification

Запросить конфигурацию уведомлений

S3:PutBucketNotification

Установить или перезаписать конфигурацию уведомлений

S3:GetBucketVersioning

Запросить статус версионирования бакета

S3:PutBucketVersioning

Включить или приостановить версионирование бакета

S3:GetLifecycleConfiguration

Запросить правила жизненного цикла бакета

S3:PutLifecycleConfiguration

Установить или перезаписать правила жизненного цикла бакета

S3:GetBucketLocation

Получить регион бакета

S3:DeleteBucket

Удалить бакет

Разрешение и запрет

Ко всем действиям может быть применено разрешение (Allow) или запрет (Deny) в неявном (impicit) и явном (explicit) виде.

  • Неявное разрешение (impicit allow): задается автоматически VK Object Storage и применяется по умолчанию для всех внутренних принципалов.

  • Неявный запрет (impicit deny): задается автоматически VK Object Storage и применяется по умолчанию для всех внешних принципалов.

  • Явное разрешение (explicit allow): задается пользователем с помощью политик доступа через параметр Effect:

    ..."Effect": "Allow"...
  • Явный запрет (explicit deny): задается пользователем с помощью политик доступа через параметр Effect:

    ..."Effect": "Deny"...

Соответственно:

  • внутренним принципалам по умолчанию разрешены все действия (impicit allow), а доступ ограничивается явными запретами (explicit deny).
  • внешним принципалам: по умолчанию запрещены все действия (impicit deny), а доступ расширяется за счет явных разрешений (explicit allow).

Принципалы

Параметр 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 и определяет, как будет проводиться проверка значений.

StringEquals

Проверка на строгое соответствие строкового значения ключа условия указанному значению (или одному из значений в списке)

StringNotEquals

Проверка на отсутствие строгого соответствия строкового значения ключа условия указанному значению (или ни одному из значений в списке)

NumericEquals

Проверка на строгое соответствие числового значения ключа условия указанному числу (или одному из чисел в списке)

NumericLessThan

Истина, если числовое значение ключа условия меньше указанного числа

DateEquals

Истина, если значение даты и времени равно указанному значению в ISO 8601

IpAddress

Истина, если IP-адрес источника запроса попадает в указанный IPv4 или IPv6 CIDR-диапазон

NotIpAddress

Истина, если IP-адрес источника запроса не попадает в указанный IPv4 или IPv6 CIDR-диапазон

Ключи

Указывается внутри оператора в формате ключ/значение.

s3:object-lock-legal-hold

Статус бессрочной блокировки объекта. Разрешает или запрещает операции в зависимости от того, включена ли бессрочная блокировка. Возможные значения: ON, OFF

s3:object-lock-mode

Режим временной блокировки объекта. Используется для контроля операций в зависимости от режима удержания. Возможные значения: GOVERNANCE, COMPLIANCE

s3:object-lock-remaining-retention-days

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

s3:object-lock-retain-until-date

Дата и время, до которых удерживается объект, в формате ISO 8601. Используется для контроля операций в зависимости от даты окончания блокировки

aws:SourceIp

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", "198.51.100.0/24"]        }      }    }  ]}
  • Запретить скачивать объекты с указанного IP-адреса определеннному пользователю (внутреннему принципалу):

    {  "Version": "2012-10-17",  "Statement": [    {      "Sid": "DenyGetFromSingleIP",      "Effect": "Deny",      "Principal": {        "AWS": "arn:aws:iam::mcs1234567890:user/user-internal-b"      },      "Action": "s3:GetObject",      "Resource": ["arn:aws:s3:::my-bucket/*"],      "Condition": {        "IpAddress": {          "aws:SourceIp": "198.51.100.10/32"        }      }    }  ]}
  • Разрешить некоторым пользователям (внешним принципалам из другого проекта mcs9876543210) полный доступ к объектам с определенным префиксом:

    {  "Version": "2012-10-17",  "Statement": [    {      "Sid": "UserAFullAccessToFolderA",      "Effect": "Allow",      "Principal": {        "AWS": "arn:aws:iam::mcs9876543210:user/user-external-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::mcs9876543210:user/user-external-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/*"]    }  ]}
  • Предоставить пользователям или сервисным аккаунтам (внешним принципалам из другого проекта mcs9876543210) полный доступ к объектам с определенным префиксом:

    {  "Version": "2012-10-17",  "Statement": [    {      "Sid": "ProjectFullAccessToSharedFolder",      "Effect": "Allow",      "Principal": {        "AWS": "mcs9876543210"      },      "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/*"]    }  ]}
  • Разрешить пользователям или сервисным аккаунтам (внешним принципалам из другого проекта mcs9876543210) запись объектов только с определенных IP-адресов:

    {  "Version": "2012-10-17",  "Statement": [    {      "Sid": "AllowPutOnlyFromCIDR",      "Effect": "Allow",      "Principal": {        "AWS": "mcs9876543210"      },      "Action": "s3:PutObject",      "Resource": ["arn:aws:s3:::my-bucket/*"],      "Condition": {        "IpAddress": {          "aws:SourceIp": ["203.0.113.0/24"]        }      }    }  ]}
  • Запретить скачивать любые объекты и предотвратить обход данного запрета определенному пользователю (внутреннему принципалу):

    {  "Version": "2012-10-17",  "Statement": [    {      "Sid": "DenyDownloadObjectAndVersions",      "Effect": "Deny",      "Principal": {        "AWS": "arn:aws:iam::mcs1234567890:user/user-internal-b"      },      "Action": [        "s3:GetObject",        "s3:GetObjectVersion"      ],      "Resource": ["arn:aws:s3:::my-bucket/*"]    },    {      "Sid": "DenyBypassPrevention",      "Effect": "Deny",      "Principal": {        "AWS": "arn:aws:iam::mcs1234567890:user/user-internal-b"      },      "Action": [        "s3:PutBucketPolicy",        "s3:DeleteBucketPolicy"      ],      "Resource": ["arn:aws:s3:::my-bucket"]    }  ]}
  • Запретить удалять любые объекты и предотвратить обход данного запрета определенному пользователю (внутреннему принципалу):

    {  "Version": "2012-10-17",  "Statement": [    {      "Sid": "DenyDeleteObjectAndVersions",      "Effect": "Deny",      "Principal": {        "AWS": "arn:aws:iam::mcs1234567890:user/user-internal-a"      },      "Action": [        "s3:DeleteObject",        "s3:DeleteObjectVersion"      ],      "Resource": ["arn:aws:s3:::my-bucket/*"]    },        {      "Sid": "DenyBypassPreventionObject",      "Effect": "Deny",      "Principal": {        "AWS": "arn:aws:iam::mcs1234567890:user/user-internal-a"      },      "Action": [        "s3:PutObject"      ],      "Resource": ["arn:aws:s3:::my-bucket/*"]    },    {      "Sid": "DenyBypassPreventionBucket",      "Effect": "Deny",      "Principal": {        "AWS": "arn:aws:iam::mcs1234567890:user/user-internal-a"      },      "Action": [        "s3:PutLifecycleConfiguration",        "s3:PutBucketPolicy",        "s3:DeleteBucketPolicy",        "s3:PutBucketVersioning"       ],      "Resource": ["arn:aws:s3:::my-bucket"]    }  ]}
  • Разрешить устанавливать или изменять срок блокировки объектов определенному пользователю (внешнему принципалу из другого проекта mcs9876543210), если запрашиваемый срок не более 10 дней:

    {  "Version": "2012-10-17",  "Statement": [    {      "Sid": "AllowShortRetention",      "Effect": "Allow",      "Principal": {        "AWS": "arn:aws:iam::mcs9876543210:user/user-external-a"      },      "Action": [        "s3:PutObjectRetention"      ],      "Resource": ["arn:aws:s3:::my-bucket/*"],      "Condition": {        "NumericLessThan": {          "s3:object-lock-remaining-retention-days": 11        }      }    }  ]}
  • Полностью запретить пользователю (внутреннему принципалу) доступ к бакету:

    {  "Version": "2012-10-17",  "Statement": [    {      "Sid": "ExplicitDenyInternalUser",      "Effect": "Deny",      "Principal": {        "AWS": "arn:aws:iam::mcs1234567890:user/user-internal-a"      },      "Action": "s3:*",      "Resource": [        "arn:aws:s3:::my-bucket",        "arn:aws:s3:::my-bucket/*"      ]    }  ]}
  • Разрешить пользователю (внешнему принципалу из другого проекта mcs9876543210) только просмотр списка версий (истории) самого бакета:

    {  "Version": "2012-10-17",  "Statement": [    {      "Sid": "AllowExternalUserListBucket",      "Effect": "Allow",      "Principal": {        "AWS": "arn:aws:iam::mcs9876543210:user/user-external-a"      },      "Action": [        "s3:ListBucket",        "s3:ListBucketVersions",      ],      "Resource": ["arn:aws:s3:::my-bucket"]    }  ]}
  • Установить набор правил для определенного бакета, объекта, префикса внешним и внутренним принципалам:

    {  "Version": "2012-10-17",  "Statement": [    {      "Sid": "Разрешить list-object анонимным пользователям",      "Effect": "Allow",      "Principal": "*",      "Action": "s3:ListBucket",      "Resource": ["arn:aws:s3:::my-bucket"]    },    {      "Sid": "Запретить просмотр, редактирование, удаление объекта my-object-1 внутреннему пользователю user-internal-a",      "Effect": "Deny",      "Principal": {        "AWS": "arn:aws:iam::mcs1234567890:user/user-internal-a"      },      "Action": [        "s3:GetObject",        "s3:GetObjectVersion",        "s3:PutObject",        "s3:DeleteObject",        "s3:DeleteObjectVersion"      ],      "Resource": ["arn:aws:s3:::my-bucket/my-object-1"]    },    {      "Sid": "Запретить изменение правил жизненного цикла бакета и его объектов внутреннему пользователю user-internal-a",      "Effect": "Deny",      "Principal": {        "AWS": "arn:aws:iam::mcs1234567890:user/user-internal-a"      },      "Action": [        "s3:PutLifecycleConfiguration"      ],      "Resource": ["arn:aws:s3:::my-bucket"]    },    {      "Sid": "Запретить изменение и удаление политики бакета my-bucket внутреннему пользователю user-internal-a",      "Effect": "Deny",      "Principal": {        "AWS": "arn:aws:iam::mcs1234567890:user/user-internal-a"      },      "Action": [        "s3:PutBucketPolicy",        "s3:DeleteBucketPolicy"      ],      "Resource": ["arn:aws:s3:::my-bucket"]    },    {      "Sid": "Разрешить list-bucket для get-object объектов только с префиксом 'directory' внешним пользователям из другого проекта mcs9876543210",      "Effect": "Allow",      "Principal": {          "AWS": "mcs9876543210"      },      "Action": [        "s3:ListBucket"      ],      "Resource": ["arn:aws:s3:::my-bucket"]    },    {      "Sid": "Разрешить get-object объектов только с префиксом 'directory' внешним пользователям из другого проекта mcs9876543210",      "Effect": "Allow",      "Principal": {          "AWS": "mcs9876543210"      },      "Action": [        "s3:GetObject"      ],      "Resource": ["arn:aws:s3:::my-bucket/directory/*"]    }       ]}
  • Запретить определенному пользователю (внутреннему принципалу) изменение бессрочной блокировки объектов, если она включена:

    {  "Version": "2012-10-17",  "Statement": [    {      "Sid": "DenyPutLegalHold",      "Effect": "Deny",      "Principal": {        "AWS": "arn:aws:iam::mcs1234567890:user/user-internal-a"      },      "Action": [        "s3:PutObjectLegalHold"      ],      "Resource": ["arn:aws:s3:::my-bucket/*"],      "Condition": {        "StringEquals": {          "s3:object-lock-legal-hold": "ON"        }      }    }  ]}
  • Запретить определенному пользователю (внутреннему принципалу) изменение временной блокировки объектов, где установлен режим GOVERNANCE:

    {  "Version": "2012-10-17",  "Statement": [    {      "Sid": "DenyPutObjectRetention",      "Effect": "Deny",      "Principal": {        "AWS": "arn:aws:iam::mcs1234567890:user/user-internal-a"      },      "Action": [        "s3:PutObjectRetention",        "s3:BypassGovernanceRetention"      ],      "Resource": ["arn:aws:s3:::test-bucket-1/*"],      "Condition": {        "StringEquals": {          "s3:object-lock-mode": "COMPLIANCE"        }      }    }  ]}
  • Разрешить устанавливать срок хранения объектов пользователям (внешним принципалам из другого проекта mcs9876543210), если запрашиваемая дата 2026-09-17:

    {  "Version": "2012-10-17",  "Statement": [    {      "Sid": "ExplicitAllowForExternalPrincipals",      "Effect": "Allow",      "Principal": {        "AWS": "mcs9876543210"       },      "Action": [        "s3:PutObjectRetention",        "s3:BypassGovernanceRetention"      ],      "Resource": ["arn:aws:s3:::test-bucket-1/*"],      "Condition": {        "DateEquals": {          "s3:object-lock-retain-until-date": "2026-09-17T00:00:00Z"        }      }    }  ]}
Была ли статья полезна?