---
title: 'Общая информация о политиках доступа'
sidebar_label: 'Политика доступа'
sidebar_position: 1
description: 'Как работает политика доступа к бакету: структура политики, правила, действия и условия'
---

import Formbricks from '@theme/MDXComponents/Formbricks'
import {CustomTable, Icon} from '@selectel/docux/components'
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
import {TabItemLabel} from '@selectel/docux/components'

# Общая информация о политиках доступа

Доступ к бакету можно задать через политику доступа (Bucket policy).
Политика состоит из [правил](#rules), которые разрешают или запрещают [действия](#actions) с [ресурсом](#resources) (бакетом или группой объектов) для всех или выбранных [пользователей](#users).
Основной принцип — если политика доступа создана, запрещено все, что не разрешено.

Политика доступа работает для любого авторизованного доступа.
Авторизованным доступом считается просмотр и управление бакетами и их объектами через панель управления и API.
Неавторизованным доступом считаются запросы к объектам в публичных бакетах по [публичному домену бакета](/s3/manage/domains.mdx#bucket-public-domain) или [пользовательским доменам](/s3/manage/domains.mdx#user-domain).

Политика доступа имеет ограничение на максимальный размер в 20 КБ.

Политика доступа может распространяться на любого пользователя, которому разрешен доступ к хранилищу в соответствии с [ролевой моделью](/access-control/access-management.mdx), а также определяет доступ для пользователей с ролями [`s3.user`](/access-control/role-reference.mdx#s3-user), [`s3.bucket.user`](/access-control/role-reference.mdx#s3-bucket-user) и [`object_storage_user`](/access-control/role-reference.mdx#object-storage-user).
Подробнее о взаимодействии ролевой модели и политик доступа в инструкции [Управлять доступом в S3](/s3/about/manage-access.mdx).

Управлять политиками доступа может [Владелец аккаунта](/access-control/user-types.mdx#account-owner) и пользователи с ролью [`member`](/access-control/role-reference.mdx#member).
Если у пользователя с ролью `member` выбрана область доступа **Проекты**, у него в разрешении должен быть добавлен соответствующий проект.

[Создавать политики доступа](/s3/buckets/bucket-policy/create-policy.mdx) и управлять ими можно в панели управления или через S3 API в соответствии с требованиями к [структуре политики](#policy-structure).

## Структура политики доступа \{#policy-structure}

Политика доступа имеет JSON-структуру. Пример политики:

```json
{
  "Id": "my-bucket-policy",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowObjectDeletion",
      "Effect": "Allow",
      "Principal": {
          "AWS": [
             "*"
          ]
      },
      "Action": [
        "s3:DeleteObject"
      ],
      "Resource": [
        "arn:aws:s3:::bucket-name",


        "arn:aws:s3:::bucket-name/*",


        "arn:aws:s3:::bucket-name/${aws:userid}/*"


      ],
      "Condition": {
        "StringEquals": {
          "aws:UserAgent": [
            "storage-test-user-agent"
          ]
        }
      }
    },
    {
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::bucket-name/*"


    }
  ]
}
```

Содержимое политики:

<CustomTable>
  <table data-sticky>
    <thead>
      <tr>
        <th>Поле</th>
        <th>Описание</th>
        <th>Тип данных</th>
        <th>Обязательный</th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <th>Id</th>
        <td>Идентификатор политики, может быть любым</td>
        <td>Строка</td>
        <td>✗</td>
      </tr>

      <tr>
        <th>Version</th>
        <td>Версия политики доступа, значение — константа: <br /> `"2012-10-17"`</td>
        <td>Строка</td>
        <td>✓</td>
      </tr>

      <tr>
        <th>Statement</th>
        <td>Массив [правил](#rules)</td>
        <td>Массив</td>
        <td>✓</td>
      </tr>

      <tr>
        <th>Sid</th>
        <td>Название правила</td>
        <td>Строка</td>
        <td>✗</td>
      </tr>

      <tr>
        <th>Effect</th>
        <td>Тип правила (`Allow` или `Deny`)</td>
        <td>Строка</td>
        <td>✓</td>
      </tr>

      <tr>
        <th>Principal:AWS</th>
        <td>[Пользователи](#users) (идентификаторы конкретных пользователей или `*` для всех пользователей)</td>
        <td>Массив строк или строка</td>
        <td>✓</td>
      </tr>

      <tr>
        <th>Actions</th>
        <td>[Действия](#actions) или `*` для всех действий</td>
        <td>Массив строки ли строка</td>
        <td>✓</td>
      </tr>

      <tr>
        <th>Resources</th>
        <td>[Ресурсы](#resources), на которые действует правило</td>
        <td>Массив строк или строка</td>
        <td>✓</td>
      </tr>

      <tr>
        <th>Condition</th>
        <td>Массив [условий](#conditions), представленных в формате: <br /> `[оператор]:[ключ]:[массив значений ключа]`</td>
        <td>Массив</td>
        <td>✗</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

## Правила \{#rules}

Правила бывают двух типов: разрешающие (`Allow`) и запрещающие (`Deny`).

Разрешение или запрет распространяется на [действия](#actions), [ресурсы](#resources) и [пользователей](#users), добавленных в правило.

Если политика содержит несколько правил, они применяются следующим образом:

* если хотя бы одно разрешающее правило выполняется, доступ будет разрешен;
* если хотя бы одно запрещающее правило выполняется, доступ будет запрещен;
* если выполняются одновременно разрешающие и запрещающие правила, доступ будет запрещен;
* если ни одно правило не выполняется, доступ будет запрещен.

### Пользователи \{#users}

Правило применяется в отношении запросов от принципалов (пользователей):

* на авторизованные запросы определенных пользователей, указываются идентификаторы пользователей ([посмотреть идентификатор сервисного пользователя](/access-control/manage/add-user.mdx#view-service-user-id) можно в панели управления);
* на все авторизованные запросы, обозначается символом `*`.

Добавлять в качестве принципалов [пользователей панели](/access-control/user-types.mdx#panel-users) можно только при настройке политики через панель управления.

### Ресурсы \{#resources}

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

Ресурсы можно указывать в форматах:

* `arn:aws:s3:::<bucket-name>` — ресурс бакета, можно указать только один ресурс такого формата (бакет, для которого настраивается политика). Ресурс будет работать для [действий](#actions), связанных с настройкой бакета, и не распространяется на его объекты;
* `arn:aws:s3:::<bucket-name>/<prefix>` — ресурс объектов бакета, где `<prefix>` — префикс, на объекты с которым будет распространяться правило. Если указать `*`, в ресурсы будут включены все объекты бакета;
* `arn:aws:s3:::<bucket-name>/${<variable-name>}` — ресурс объектов бакета, где `<variable-name>` — имя подстановочной переменной ([ключа](#keys)), которая выполняет роль префикса.

## Действия \{#actions}

Если указать `*`, в правило будут включены все действия.

<CustomTable>
  <table data-sticky>
    <tbody>
      <tr>
        <th>s3:AbortMultipartUpload</th>
        <td>Прерывание [сегментированной загрузки](/s3/objects/upload-object.mdx#segmented-upload) объекта через S3 API</td>
      </tr>

      <tr>
        <th>s3:DeleteBucket</th>
        <td>[Удаление бакета](/s3/buckets/delete-bucket.mdx)</td>
      </tr>

      <tr>
        <th>s3:DeleteObject</th>
        <td>[Удаление объекта](/s3/objects/delete-object.mdx)</td>
      </tr>

      <tr>
        <th>s3:DeleteObjectVersion</th>
        <td>Удаление версии объекта</td>
      </tr>

      <tr>
        <th>s3:GetBucketCORS</th>
        <td>Получение [CORS-конфигурации](/s3/buckets/cors.mdx) бакета</td>
      </tr>

      <tr>
        <th>s3:GetBucketLocation</th>
        <td>Получение [пула](/infrastructure/locations.mdx#pool), в котором находится бакет</td>
      </tr>

      <tr>
        <th>s3:GetBucketVersioning</th>
        <td>Получение информации о версионировании бакета (включено или нет)</td>
      </tr>

      <tr>
        <th>s3:GetObject</th>
        <td>Чтение объекта</td>
      </tr>

      <tr>
        <th>s3:GetObjectVersion</th>
        <td>Чтение определенной версии объекта</td>
      </tr>

      <tr>
        <th>s3:ListBucket</th>
        <td>Чтение списка объектов в бакете (всех или некоторых)</td>
      </tr>

      <tr>
        <th>s3:ListBucketMultipartUploads</th>
        <td>Чтение списка объектов, которые находятся в процессе [сегментированной загрузки](/s3/objects/upload-object.mdx#segmented-upload) через S3 API</td>
      </tr>

      <tr>
        <th>s3:ListBucketVersions</th>
        <td>Чтение метаданных всех версий объектов в бакете</td>
      </tr>

      <tr>
        <th>s3:ListMultipartUploadParts</th>
        <td>Чтение списка загруженных частей объекта при [сегментированной загрузке](/s3/objects/upload-object.mdx#segmented-upload) через S3 API</td>
      </tr>

      <tr>
        <th>s3:PutBucketCORS</th>
        <td>Установка CORS-конфигурации бакета</td>
      </tr>

      <tr>
        <th>s3:PutBucketVersioning</th>
        <td>Подключение и отключение версионирования бакета</td>
      </tr>

      <tr>
        <th>s3:PutObject</th>
        <td>Добавление объекта в бакет ([загрузка](/s3/objects/upload-object.mdx) или [копирование](/s3/objects/copy-object.mdx))</td>
      </tr>

      <tr>
        <th>s3:GetObjectRetention</th>
        <td>Получение информации о временной блокировке объекта</td>
      </tr>

      <tr>
        <th>s3:GetObjectLegalHold</th>
        <td>Получение информации о бессрочной блокировке объекта</td>
      </tr>

      <tr>
        <th>s3:GetBucketObjectLockConfiguration</th>
        <td>Получение статуса [Object Lock](/s3/buckets/object-lock.mdx) и блокировки по умолчанию в бакете</td>
      </tr>

      <tr>
        <th>s3:PutObjectRetention</th>
        <td>[Управление временной блокировкой объекта](/s3/objects/manage-object-lock.mdx#retention-period), кроме отключения блокировки</td>
      </tr>

      <tr>
        <th>s3:PutObjectLegalHold</th>
        <td>[Управление бессрочной блокировкой объекта](/s3/objects/manage-object-lock.mdx#legal-hold)</td>
      </tr>

      <tr>
        <th>s3:PutBucketObjectLockConfiguration</th>
        <td>Установка [Object Lock](/s3/buckets/object-lock.mdx) и блокировки по умолчанию в бакете</td>
      </tr>

      <tr>
        <th>s3:BypassGovernanceRetention</th>
        <td>Обход Governance-блокировки для удаления объекта, редактирования срока или режима временной блокировки</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

## Условия \{#conditions}

Условие определяет, в каких случаях правило будет работать. Условие состоит из [ключа](#keys), [оператора](#operators) и значения.

Если в результате выполнения условия возвращается значение `true`, условие удовлетворяется.

### Ключи \{#keys}

Один ключ можно использовать в нескольких условиях. Ключу можно присвоить несколько значений.

<CustomTable>
  <table>
    <tbody>
      <tr>
        <th>aws:CurrentTime</th>
        <td>Сравнивает дату и время запроса со значением, указанным в условии</td>
      </tr>

      <tr>
        <th>aws:Referer</th>
        <td>Сравнивает заголовок Referer в запросе со значением, указанным в условии.<br /><br />Пример: `https://example.com/`</td>
      </tr>

      <tr>
        <th>aws:PrincipalType</th>

        <td>
          Задает тип сущности, к которой делается запрос.

          Возможные значения:

          * `Account`;
          * `User`;
          * `AssumedRole`;
          * `Anonymous`
        </td>
      </tr>

      <tr>
        <th>aws:SecureTransport</th>
        <td>Проверяет, был ли запрос отправлен с использованием шифрования SSL/TLS.<br />Возможные значения: `true` или `false`</td>
      </tr>

      <tr>
        <th>aws:SourceIp</th>
        <td>Сравнивает IP-адрес из запроса со значением из условия</td>
      </tr>

      <tr>
        <th>aws:UserAgent</th>

        <td>
          Сравнивает UserAgent из запроса со значением из условия.

          Примеры значений:

          * `Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0)`;
          * `Gecko/20100101`;
          * `Firefox/47.0`
        </td>
      </tr>

      <tr>
        <th>aws:userid</th>
        <td>Сравнивает идентификатор [пользователя](/access-control/access-management.mdx) со значением из условия.<br />Пример значения: `9103a81de217448d908e53ac60c84acb`</td>
      </tr>

      <tr>
        <th>aws:username</th>
        <td>Сравнивает имя пользователя со значением из условия</td>
      </tr>

      <tr>
        <th>s3:authType</th>

        <td>
          Ограничивает входящие запросы методом аутентификации, указанным в условии.

          Примеры значений:

          * `REST-HEADER`;
          * `REST-QUERY-STRING`;
          * `POST`
        </td>
      </tr>

      <tr>
        <th>s3:delimiter</th>
        <td>Задает разделитель, который должны включать запросы пользователей.<br />Пример значения: `/`</td>
      </tr>

      <tr>
        <th>s3:max-keys</th>
        <td>Задает максимальное количество ключей, возвращаемых на запрос ListBucket</td>
      </tr>

      <tr>
        <th>s3:prefix</th>
        <td>Ограничивает доступ по префиксу в имени ключа</td>
      </tr>

      <tr>
        <th>s3:signatureAge</th>
        <td>Определяет время действия подписи в запросе аутентификации (в миллисекундах)</td>
      </tr>

      <tr>
        <th>s3:signatureversion</th>

        <td>
          Задает версию подписи AWS для запросов аутентификации.

          Примеры значений:

          * `AWS`;
          * `AWS4-HMAC-SHA256`
        </td>
      </tr>

      <tr>
        <th>s3:versionid</th>

        <td>
          Задает доступ к определенной версии объекта.

          Пример значения: `L4kqtJlcpXroDTDmpUMLUo`
        </td>
      </tr>

      <tr>
        <th>s3:x-amz-content-sha256</th>
        <td>Запрещает неподписанное содержимое в запросе</td>
      </tr>

      <tr>
        <th>s3:x-amz-copy-source</th>
        <td>Ограничивает источник копирования определенным бакетом, префиксом или объектом</td>
      </tr>

      <tr>
        <th>s3:x-amz-metadata-directive</th>
        <td>Задает принудительный выбор копирования или замены при копировании объектов</td>
      </tr>

      <tr>
        <th>s3:x-amz-server-side-encryption</th>
        <td>Требует шифрования на стороне сервера</td>
      </tr>

      <tr>
        <th>s3:x-amz-storage-class</th>
        <td>Ограничивает доступ по классу хранилища</td>
      </tr>

      <tr>
        <th>s3:object-lock-legal-hold</th>

        <td>
          Ограничивает доступ по статусу бессрочной блокировки объекта.

          Возможные значения статуса блокировки:

          * `ON`;
          * `OFF`
        </td>
      </tr>

      <tr>
        <th>s3:object-lock-mode</th>

        <td>
          Ограничивает доступ по режиму блокировки объекта.

          Возможные значения режима блокировки:

          * `GOVERNANCE`;
          * `COMPLIANCE`
        </td>
      </tr>

      <tr>
        <th>s3:object-lock-remaining-retention-days</th>
        <td>Ограничивает доступ по количеству оставшихся дней блокировки объекта</td>
      </tr>

      <tr>
        <th>s3:object-lock-retain-until-date</th>
        <td>Ограничивает доступ по сроку блокировки объекта</td>
      </tr>

      <tr>
        <th>s3:if-match</th>
        <td>Требует, чтобы текущий ETag объекта совпадал с указанным в запросе</td>
      </tr>

      <tr>
        <th>s3:if-none-match</th>
        <td>Требует, чтобы текущий ETag объекта не совпадал с указанным в запросе</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

### Операторы \{#operators}

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

<Tabs queryString="operators">
  <TabItem value="numbers" default>
    <TabItemLabel>
      Числа
    </TabItemLabel>

    Число из запроса сравнивается с числом, указанным в условии.

    <CustomTable>
      <table>
        <tbody>
          <tr>
            <th>NumericEquals</th>
            <td>Значение равно заданному в условии</td>
          </tr>

          <tr>
            <th>NumericGreaterThan</th>
            <td>Значение больше заданного в условии</td>
          </tr>

          <tr>
            <th>NumericGreaterThanEquals</th>
            <td>Значение больше или равно заданному в условии</td>
          </tr>

          <tr>
            <th>NumericLessThan</th>
            <td>Значение меньше заданного в условии</td>
          </tr>

          <tr>
            <th>NumericLessThanEquals</th>
            <td>Значение меньше или равно заданному в условии</td>
          </tr>

          <tr>
            <th>NumericNotEquals</th>
            <td>Значение не равно заданному в условии</td>
          </tr>
        </tbody>
      </table>
    </CustomTable>
  </TabItem>

  <TabItem value="strings">
    <TabItemLabel>
      Строки
    </TabItemLabel>

    Строка из запроса сравнивается со строкой, указанной в условии.

    <CustomTable>
      <table>
        <tbody>
          <tr>
            <th>StringEquals</th>
            <td>Значение соответствует заданному в условии (с учетом регистра)</td>
          </tr>

          <tr>
            <th>StringEqualsIgnoreCase</th>
            <td>Значение соответствует заданному в условии (без учета регистра)</td>
          </tr>

          <tr>
            <th>StringLike</th>

            <td>
              Значение соответствует шаблону, заданному в условии.

              Используйте символы для подстановки:

              * `*` — нескольких символов;
              * `?` — одного символа
            </td>
          </tr>

          <tr>
            <th>StringNotEqualsThan</th>
            <td>Значение не соответствует заданному в условии (с учетом регистра)</td>
          </tr>

          <tr>
            <th>StringNotEqualsIgnoreCase</th>
            <td>Значение не соответствует заданному в условии (без учета регистра)</td>
          </tr>

          <tr>
            <th>StringNotLike</th>

            <td>
              Значение не соответствует заданному в условии шаблону.

              Используйте символы для подстановки:

              * `*` — нескольких символов;
              * `?` — одного символа
            </td>
          </tr>
        </tbody>
      </table>
    </CustomTable>
  </TabItem>

  <TabItem value="date-and-time">
    <TabItemLabel>
      Дата и время
    </TabItemLabel>

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

    <CustomTable>
      <table>
        <tbody>
          <tr>
            <th>DateEquals</th>
            <td>Соответствует заданной дате</td>
          </tr>

          <tr>
            <th>DateGreaterThan</th>
            <td>Соответствует дате позже, чем заданная</td>
          </tr>

          <tr>
            <th>DateGreaterThanEquals</th>
            <td>Соответствует заданной дате или дате позже</td>
          </tr>

          <tr>
            <th>DateLessThan</th>
            <td>Соответствует дате раньше, чем заданная</td>
          </tr>

          <tr>
            <th>DateLessThanEquals</th>
            <td>Соответствует заданной дате или дате раньше</td>
          </tr>

          <tr>
            <th>DateNotEquals</th>
            <td>Не соответствует заданной дате</td>
          </tr>
        </tbody>
      </table>
    </CustomTable>
  </TabItem>

  <TabItem value="ip">
    <TabItemLabel>
      IP-адреса
    </TabItemLabel>

    IP-адрес в формате CIDR из запроса сравнивается с IP-адресом из условия.

    <CustomTable>
      <table>
        <tbody>
          <tr>
            <th>IPAddress</th>
            <td>Значение ключа соответствует заданному IP-адресу или входит в диапазон адресов</td>
          </tr>

          <tr>
            <th>NotIPAddress</th>
            <td>Значение ключа не соответствует заданному IP-адресу или не входит в диапазон адресов</td>
          </tr>
        </tbody>
      </table>
    </CustomTable>
  </TabItem>

  <TabItem value="boolean">
    <TabItemLabel>
      Bool
    </TabItemLabel>

    Оператор `Bool` сравнивает логическое значение из запроса (`true` или `false`) со значением из ключа.

    Условие удовлетворяется, если значение из запроса соответствует значению из условия.
  </TabItem>

  <TabItem value="ifexists">
    <TabItemLabel>
      IfExists
    </TabItemLabel>

    Оператор `IfExists` позволяет смягчить условие в случае, если указанный в условии ключ отсутствует в запросе.

    `IfExists`  можно использовать только совместно с другими операторами (кроме `Null`). Формат добавления: `<имя оператора>IfExists` — например, `StringEqualsIfExists`.

    Тип данных соответствует типу данных оператора, к которому добавляется `IfExists`.

    Удовлетворение условия с `IfExists` зависит от того, присутствует ли ключ из запроса в условии:

    * если ключ присутствует, условие обрабатывается по правилам оператора, с которым использовался `IfExists` и может принять значение `true` или `false`;
    * если ключ отсутствует, условие принимает значение `true`.
  </TabItem>

  <TabItem value="null">
    <TabItemLabel>
      Null
    </TabItemLabel>

    Оператор `Null` проверяет наличие ключа из запроса в условии.

    Тип данных — boolean.

    Условие с оператором `Null` удовлетворяется:

    * если в запросе отсутствует ключ из условия;
    * если ключ присутствует в запросе, но его значение не указано.
  </TabItem>
</Tabs>

<Formbricks />
